Leads & re-engagement
Five lists that answer five different questions: who asked to be rung, who is shopping right now, who left money in a basket, who is due to buy again, and who owes a balance. Every row says who already has it, and one click puts it on somebody's list.
Where it fits
Follow-ups is what your team has committed to doing — a customer, an owner, a day. This is the page above it: the evidence, unclaimed, waiting to be turned into a commitment.
The two are a pair, and the order matters. A shop with an empty follow-ups list has either done all its work or has nowhere to find any. Leads in the sidebar is where you find it.
No list on this page asks you to enter anything. They are built from what your tracking tag, your orders and your quotes already know. If a list is empty, that is an answer about your shop rather than a setup step you missed — with one exception, noted under Why a list is empty.
The figures at the top
Four numbers, describing the same population from different angles.
| Figure | What it counts |
|---|---|
| Repeat rate | The share of your buyers who ever came back. The number this whole half of the product exists to move. |
| Bought once | Customers with exactly one order. Usually the largest and most winnable group you have. |
| Due to buy | Buyers at or past the point their next order normally lands. The ones who have been quiet far longer than that are in here too, marked — see Due to buy. |
Repeat rate reads — rather than 0% when nobody has bought yet.
"Nobody returned" and "nobody bought" are different answers and the page will not conflate
them.
Where "due" gets its numbers
From your own orders. The line under the figures says how long a first-time buyer normally takes to come back and how long everybody else takes — and where those came from:
- Measured from this shop's own orders — Stitchwork worked them out from your order history.
- Set by your team in Settings — somebody typed them in, and those win.
- Starting defaults — not enough order history yet. They sharpen as orders come in.
This is said out loud on purpose. 120 days is right for a mattress shop and absurd for a coffee subscription, and a page that keeps asserting "due" owes you an answer to says who. Change them under Settings → Retention.
The five lists
There is deliberately no combined "priority" list. These are five different conversations, and one merged feed would have to open all five with the same sentence — which is how retention outreach ends up sounding wrong for everybody it reaches.
| Tab | Who is on it | What the call is |
|---|---|---|
| Callbacks | Typed their number into a message on your site while still anonymous | They asked. Ring them. |
| Shopping now | Browsing hard, never bought | A first sale |
| Left in basket | Got as far as the checkout and stopped — one row per basket, not per attempt | "Your order didn't go through — shall I sort it?" |
| Due to buy | At the point their next order normally lands, most overdue first | An ordinary moment to be useful at — or, at the far end, a win-back |
| Awaiting balance | Paid a deposit, balance still outstanding | Money owed on a sale you have already made |
The page opens on Callbacks whenever anything is waiting there, and on Shopping now otherwise. Each tab carries a sentence saying what the list is — and, as much to the point, what it is not.
Callbacks — they asked to be rung
The warmest thing Stitchwork can hand you. Every other list is inference: somebody looks interested, somebody has gone quiet. This is a person who typed their number and asked to be called.
They arrive from a nudge with a phone CTA. Where the browser was already a known customer, the request becomes a follow-up immediately and never appears here. This queue is the other case: a browser nobody has a name for yet.
Each row carries what you need to open the call:
- The number they left.
- How long they have been waiting — oldest first, always. A callback goes cold faster than anything else on this page, and the only question worth asking of this list is who has waited longest.
- The last product they looked at, and how much they had looked at overall.
- Which message they answered.
Claim it is what you press after the call.
A Stitchwork customer record requires an email address, and a phone number is not one. That is why these are a queue rather than follow-ups already: there is no customer record to owe the obligation to. Claiming asks for the address you took on the call, which is the only honest way past it — Stitchwork will not invent a placeholder and put a fake person in your customer list.
Give the name and address, plus a note about what the call was about, and four things happen at once: the customer record is created (or matched, if that address is already one of yours), every page they browsed before the call becomes their history, a follow-up opens against them, and the callback leaves the queue.
No answer is the other end — a mistyped number, a bot, a test during setup. It asks for a sentence saying what happened, and it means it: no follow-up will ever exist for this person, so that sentence is the entire record. A queue whose rows vanish without explanation is one nobody trusts the second time.
Two people can work this queue at once safely. If a colleague claims a row a moment before you do, you are told so rather than quietly overwriting their work. Every claim and every dismissal goes in the audit log — this is a decision about somebody outside your company who asked to be contacted.
Shopping now — a first sale
Customers browsing, searching, carting or being quoted, who have not bought in the same window. Sorted by intent.
The important thing on each row is not the score — it is the reason: "two cart adds, six product views". That is a sentence somebody can open a conversation with. Handed only 0.63, a salesperson will invent the reason, and the invented one is what reaches the customer.
Use the window control to widen or narrow how far back the behaviour counts — 30 days for fast-moving stock, a year for considered purchases where somebody researches for months.
Somebody who bought last year and is circling something new belongs on this list and is on it. Purchases are counted over the same window as everything else, so having ever bought does not exclude anyone forever — and their row says has bought before rather than "never purchased", so nobody opens by welcoming a regular.
What the list leaves out by default is anyone who bought inside the window. Include recent buyers adds them: the customer who bought three weeks ago and is already looking at something else. They are not lapsed, will not be for months, and are not due yet — so without that control they fall through every list on this page. Off by default, because the ordinary question is still who is about to buy their first thing.
Left in basket — what was left at the checkout
The opportunity scan, grouped one row per basket: four goes at the same sofa in half an hour is a card declining, not four changes of mind, and it is one phone call. Each row carries what was in the basket, how many tries, how long ago, which store, and — where it applies — what they did buy since, when that was not enough to cover it.
Biggest baskets first. Anyone who has since spent enough to cover the basket is held back
rather than rung about an order they already placed, and the line under the tab says how
many were held back and how many baskets had nobody to ring (a guest checkout with no
email). It is the same scan, with the same rules, that the agent's
find_abandoned_orders reads.
Awaiting balance — money owed on a sale you already made
Customers who paid a deposit where the balance has not arrived. This is the one list on the page that is not a prediction: everywhere else Stitchwork is telling you who might buy, and here it is telling you what you are owed on something already sold. Every row carries what the order was for, what has been paid, what is left, and how long since the deposit landed.
Longest wait first. A balance sitting for four months is usually a problem — a slipped delivery, a customer having second thoughts, a job nobody picked up — rather than a bigger version of one sitting for a week, and sorting by value would bury it under whichever order happens to be dearest. Switch to Largest balance first if you would rather work it by size.
Stitchwork does not know your payment terms or your delivery dates — those live in your own paperwork — so it cannot tell late from early. Every row says how long since the deposit landed, and nothing more.
A kitchen booked for March is not late in February. Deciding which of these is actually a problem is your job, and the page is deliberately built so it cannot pretend otherwise.
Empty can mean two different things, and the page says so: either every sale has been
settled, or deposits are not being recorded. An order that was part-paid but marked
paid carries no balance to find — see Orders for
how to record one.
Due to buy — an ordinary moment, and a win-back at the far end
Customers at or past the point their next order normally lands, measured against your shop's own rhythm. A one-time buyer is judged against the gap between first and second orders; everybody else against second-to-third, because those are genuinely different intervals and one blended number describes neither.
Order it three ways, and every one is a column you can see on the row:
- Most overdue first — furthest past their own due date.
- Biggest spenders first — within their main currency, never across currencies.
- Seen most recently first — warmest right now.
There is no blended score behind those, deliberately. A colleague asking "why is Sarah above David" deserves a better answer than "she scored 0.71".
Narrow the list with Back on the site in the last 30 days and you get the best call this page produces: somebody at the point their next order normally lands who is also browsing right now. Every row says both — last ordered eight months ago, back on the site yesterday.
It is off by default, so the tab always opens on the whole list. A control that quietly removes people is worse than no control.
There used to be a fourth tab for it. It selected buyers whose last order was older than a shop-wide window — but Due to buy already selects everybody past a shorter window and sorts the most overdue to the top, so every lapsed customer was on both lists and the same two names led both. One measurement, cut twice, presented as two ideas.
The two conversations are still real, and Due to buy carries both: a week past due is an ordinary catch-up, two years quiet is a win-back, and the rows at the far end say long overdue — not an ordinary catch-up so nobody sends a we-miss-you email to somebody who bought six weeks ago. What went was a second list, not the distinction.
What a shop usually means by lapsed is a regular who stopped — somebody who bought six times and has not been seen since March. That is a comparison against that customer's own rhythm rather than the shop's average, which is real work rather than a filter, and a tab that looked like it and was not is worse than no tab.
What every row says
Under the evidence on each row is a line saying what is already happening with that person, so the same call is never made twice:
- On Gabriel's list · due Friday — the open follow-up and whose it is. Yours reads On your list, in the accent.
- Booked Fri 18 Sep, 11:30 with Gabriel · Bath showroom — the next appointment in the diary.
- Quote Q-2026-0002 £1,850 sent · Rowan — the latest quote still on the table.
- Possibly the same person as Delphine W — an open identity question: a browser already known as somebody else identified as this customer. Check before ringing both.
Phone numbers and email addresses are links, so a row read on an iPad on the floor can be dialled rather than retyped.
Turning a lead into work
Nothing on this page is an obligation until somebody makes it one, and making it one is a click on the row:
- Add to my list raises a follow-up due today, with the row's own sentence as the reason and — for a basket or a balance — the sum it is about, so it settles only on a purchase that covers it.
- Take it appears on a row somebody else already has, and moves it to your list.
- Assign to… appears for an owner or admin on every row, and either raises the follow-up for that person or hands the standing one over.
Claiming a callback raises a follow-up for you as part of the claim, because the claim is the call.
One open follow-up per customer, enforced in the database. If the same person turns up on three of these lists — which is common and usually meaningful — they still owe one phone call, not three.
Where new leads come from
Two of the four lists need only your order history. The other two need the tracking tag, because they are about behaviour rather than purchases. Three things bring genuinely new people in:
- The tag. Anonymous browsing is what "Shopping now" reads, and what makes a claimed callback arrive with weeks of history attached.
- Nudges. A message with a phone or email CTA is the only thing in Stitchwork that asks a stranger to identify themselves. Phone answers land in Callbacks; email answers become customers immediately, with their whole prior trail.
- Your contact form. See below.
Contact form enquiries
A message through your own contact form does three things: resolves the sender to a customer, attaches the browsing that led up to the enquiry, and stores the message on their record under Messages.
It also opens a follow-up, due today, carrying their subject line or the opening of their message — their words, not a summary of them. That line is read in the minute before somebody rings back, and a paraphrase is a chance to be subtly wrong about what a stranger asked for.
Somebody who sends three messages in an afternoon owes you one reply, not three. The email notification still goes out as well — but an inbox is a notification and a follow-up is an obligation, and only one of them gets noticed when it is ignored.
Why a list is empty
| List | Empty usually means |
|---|---|
| Callbacks | Good news, or you have no nudge running with a phone CTA. Only a phone CTA fills this queue. |
| Shopping now | Most often the tracking tag is not installed, or consent is blocking events. Without it there is no browsing to read. |
| Left in basket | Unfinished checkouts arrive from your order feed or an import — an order marked draft, pending or abandoned with money still in it. None recorded, none to show. |
| Due to buy | Not enough order history to have a rhythm yet, or genuinely nobody is due. Both are fine answers. |
If you are restricted to particular channels, every list here is narrowed to customers seen on those channels. A colleague with wider access will see more than you do, and that is working as intended.
"Showing the strongest matches only" on the Shopping now list means your workspace has more engaged customers than one page can score. It is not an error — but "that is everyone" and "that is everyone we looked at" are different claims, and the page will not make the first one when it means the second.
Working it programmatically
The lists you see on this page are drawn by endpoints under
/api/v1/lead-desk, authenticated with the browser session of a signed-in
user — the same arrangement as every other screen in Stitchwork. As with those, there is
no credential you could hold and nothing you could call them with from outside, so they
are not part of the integration surface.
To read these lists from your own tooling, use the MCP connector. It exposes all four, reading the same code the page reads, with a credential you can actually hold.
/api/v1/leads
That path is the demo-request form on the Stitchwork marketing site — a different thing entirely, with no workspace behind it and no relationship to anything on this page.
Using it from an AI agent
Everything on this page is also in the MCP catalogue, reading the
same lists — so your agent and your shop floor cannot rank the same two people
differently. What the agent does not get is the row's buttons: it can raise a follow-up
through create_follow_up, and cannot take, reassign or merge anything.
| Tab | Tool |
|---|---|
| Callbacks | list_pending_callbacks |
| Shopping now | find_high_intent_customers |
| Left in basket | find_abandoned_orders |
| Due to buy | find_repeat_candidates |
| Awaiting balance | find_outstanding_balances |
find_lapsed_customers is also there, and it is the far end of
find_repeat_candidates rather than a fourth list — the same axis, cut further
out, so everybody it returns is already on the due list with a lapsed flag.
It is worth calling for one thing the due list cannot express:
active_since_days, which narrows it to long-quiet buyers who have
started browsing again. Those are people already back on your site who have not
bought, and it is the sharpest cut in the product.
The morning_run playbook works the lead lists in order, opens with the
callback queue, and stops to ask you what to file. Ask for it by name, or just say
"work today's round".
list_pending_callbacks is read-only, and phone numbers are left out of what
it returns. Claiming needs an email address that only exists once a person has made the
call, and a stranger's mobile — given to one shop, for one purpose — is not something to
copy into a chat transcript. Your agent tells you who is waiting and what they were
looking at; the number is on this page, for whoever is going to dial it.
Next
- Follow-ups & sales credit — what happens to a lead once somebody owns it.
- Nudges — how to ask a browsing stranger for their number in the first place.
- Web tracking tag — what feeds the two behavioural lists.
- AI agents (MCP) — working all of this from Claude.