FollowThroughwhere your leads died

Your leads did not go cold.
Somebody stopped replying.

FollowThrough reads your WhatsApp exports, call log and lead list on your own machine and finds the conversations where your prospect spoke last and nobody came back — then checks the same timestamps against the UAE marketing rules. No account, no upload, and no API key.

# two commands, then open localhost:8000 pip install -e ".[server]" uvicorn followthrough.api:app
The gap this fills

A CRM cannot see the conversation that mattered

Ask a CRM what happened to a lead and it will tell you about the calls it logged. It cannot tell you that on 14 March a buyer asked “is the 2BR still available?” and nobody ever replied — because that conversation happened on an agent's personal WhatsApp, which the CRM has never seen.

Every audit on the market needs you to onboard first

Speed-to-lead audits read a CRM and want an account connected. WhatsApp analytics platforms read their own Business API and want you migrated onto a new number. Both are forward-looking by construction, so neither can tell you what already happened.

So this one reads the export

A WhatsApp export takes thirty seconds to produce from a phone and contains the whole history. FollowThrough eats it directly — iPhone or Android, English or Arabic, one chat or a zip of four hundred — with whatever your dialer and portal already export.

See it working

A real report, in your browser, right now

The demo runs the same interface the tool runs, on an invented sample brokerage with known problems planted in it. It is a static page: no server, no upload, no key, and nothing to install.

Open the live demo
Measured, not asserted

What the benchmark shows

Every number below comes from benchmarks/run.py against a generated brokerage — 108 WhatsApp exports across both platforms, 120 leads, 145 calls, English and Arabic — with problems planted in it and the right answer written down before the tool ever saw the file.

Outcome agreement
100%
120 of 120 conversations classified as the label says
Prospects left waiting
30 / 30
found, with zero false positives
Died on a buying signal
12 / 12
found, with zero false positives
Compliance problems
36 / 36
across seven checks, zero false positives
Auto-replies that fooled the clock
0
an acknowledgement is not a response
Throughput
17,500
messages a second — 4,320 conversations in 1.6s

What that benchmark is, exactly

A generated brokerage with agent-abandoned threads, threads that died on a buying signal, leads nobody contacted, out-of-hours calls, frequency-cap breaches, re-contact after a refusal in Arabic and English, iPhone and Android exports, 12- and 24-hour clocks, Arabic AM/PM markers, direction marks, media and deleted markers, a group chat that must be skipped and a file whose dates are genuinely undecidable. Synthetic data cannot prove behaviour on your export — it can only show the tool does what it claims where the right answer is known.

How it works

Four screens, and every number clickable

The upload screen

1It reads the files you actually have

iPhone and Android export formats, 12- and 24-hour clocks, Arabic ص/م markers, the direction marks that wrap every timestamp in an Arabic-locale export, multi-line messages, media and deleted markers, call log lines, and group chats it knows to skip. One chat, a folder, or a zip of four hundred.

Detection and column mapping

2Nothing is measured until you have seen the assumptions

Which column is which, detected from the headers and the cell contents — and who the agent was, which is whoever appears in more than one conversation. Both are shown with the reasoning and both are yours to correct. 03/04 is genuinely ambiguous, so the date order is settled across the whole upload; where nothing settles it, the assumption is printed rather than made quietly.

The report overview

3Then it shows you where they died

Every dead thread classified by who spoke last. The ones where your prospect spoke last and nobody came back are the money metric, and the ones whose last message was a request to view or a price question are at the top of the list.

A finding opened onto the conversation

4And opens any of them onto the actual conversation

Click a finding and read what was said, quoted from the export with the file and the line, and the unanswered message ringed. Nothing in the report is a number you have to take on trust.

The compliance section

5Plus what a regulator would see in the same data

Calls outside the permitted window, frequency-cap breaches, contact after a refusal, gaps in the record the rules require — with the instrument named, the published fine schedule stated as fact about the instrument rather than a prediction about you, and a clear line saying this is not legal advice.

What makes it different

Four things nothing else does this way

It measures the silence, not the activity

Every dashboard counts what was sent. This counts what was not: the conversations where your prospect asked a question and the thread simply stops.

An automatic acknowledgement is not a response

Auto-replies are detected — by phrasing, and by the same text going out to several leads within seconds of arrival — and they do not stop the clock. Three separate clocks are kept: the acknowledgement, the first human attempt, and the first two-way conversation.

A call is not a message, and the report knows it

Cabinet Resolution 56 of 2024 regulates marketing by telephone call, 09:00–18:00. Marketing SMS sits under a separate policy with a different window. WhatsApp sits under neither — so an out-of-window call is a breach of a named instrument and an out-of-window message is a flag that says exactly what it is.

The money number is yours, and it shows its working

No default commission, no assumed conversion rate, no industry benchmark anywhere in the tool. Supply nothing and the report says how many leads leaked and declines to price them — better than a figure you cannot defend in the meeting.

Run it yourself

Two commands, on your own machine

Python 3.11 or newer. The tool works with no API key at all — the optional AI step is off by default and never touches a measurement.

# clone, install, run git clone https://github.com/devvaham/FollowThrough && cd FollowThrough pip install -e ".[server]" uvicorn followthrough.api:app # then open http://127.0.0.1:8000 and click "Try it on a sample brokerage"
# or from the command line followthrough autopsy ./exports leads.csv calls.csv --report audit.pdf --csv flagged.csv

Getting the files: in WhatsApp, open a chat → Export chat → Without media. Do that for the conversations that matter, or export the lot and drop the whole folder — or the zip — in at once. The call log and lead list are whatever your dialer and portal already export.

Privacy

Nothing is uploaded, and nothing is kept

What the tool does

  • No database, no session, no cache, no temp file. Files are held in memory for one request and dropped when the response is sent — uploads never touch disk.
  • No webfont, no analytics, no CDN. Not one third-party request, from the app or from this page.
  • The measurement never calls a model. The optional AI step is off by default, and when on it sees a few messages with the names removed — never your file.

What this page does

  • It is static. This site and the demo are plain files on GitHub Pages with no backend behind them and no credentials in them.
  • The demo data is invented. Every conversation, name and number in it was written for the purpose. No real export has ever been near it.
  • Your files never reach this site. The demo cannot accept an upload; to analyse your own export you run the tool locally.
Honesty

What it does not claim

A report that overstates its confidence is worse than no report, so these are stated in the tool itself as well as here:

  • It cannot see what it was not given. A call from a personal phone with no log, or a conversation on a platform nobody exported, is invisible.
  • “Left waiting” is about who spoke last, not who was right. Some were answered by phone or in person; the evidence is printed so you can tell which.
  • Reading intent from a message is a judgement. The matched phrase is always shown, so you can disagree with it.
  • A WhatsApp export carries no timezone. Every time-of-day check rests on an assumption the report prints.
  • The compliance section is not legal advice, and it cannot check the Do Not Call Registry — that requires a telecom operator.
  • The money figure is arithmetic on your assumptions, not a forecast.
  • The benchmark is synthetic. It shows the tool does what it claims where the right answer is known. Your export is the real test.