Know which ads are losing you money — today, not next month.
Meta says 180 sales. Your bank says 122. Flowsk joins the ad click to the email to the payment on one identity — so every sale traces back to the ad that paid for it.
Not a model. A receipt for every conversion, event by event, that you can open and read.
-
Day 0 · 14:02 client $view
Anonymous click from an ad
utm_source=facebook · utm_campaign=spring-prospecting · fbclid=IwAR…
-
Day 0 · 14:05 client $view
Three pages, then leaves
/collections/new → /products/lamp → /products/lamp?variant=black
-
Day 4 · 09:31 server identify
Returns and gives an email
hello@example.com · via: newsletter_popup
-
Day 11 · 20:47 both purchase
Buys — counted once
order_10482 · $129.00 · confirmed by client + server
This is not a model. It is the receipt for one conversion — and you can pull it for any of them.
first touch: facebook / spring-prospectingDoes any of this sound familiar?
None of these are facts about your customers. They are facts about your measurement — and every one of them has the same cause.
Retargeting looks brilliant. Prospecting looks like a disaster.
Retargeting converts inside the window. Prospecting starts journeys that finish outside it.
Direct traffic grows every time you raise ad spend.
That is not how direct traffic works. Those are your own customers, returning without a memory.
Repeat customers show up as brand-new visitors every week.
Safari deletes any cookie written by JavaScript after seven days. To your tracking, they are new.
Add up your channel reports and you have more conversions than orders.
Every platform attributes independently and none can see the others. The same sale gets claimed twice.
Email appears to drive 30% of revenue.
Under last-touch it does. Under first-touch, the same store usually shows 10%.
Someone asks where a sale came from and the honest answer is “direct”.
The click that paid for it expired before the purchase happened.
If two of these are true, your attribution is not measuring — it is guessing. And it guesses in a consistent direction: against whatever takes longer than a week to convert.
How it works, in three steps.
Concrete enough for a developer to evaluate in a minute, and for everyone else to see why it holds.
What you get is the receipt, not a percentage.
Every other tool hands you a number and asks you to trust it. Search by cookie or by email and read the whole path — what brought them, what they did, when they became a person, what they paid.
-
Day 0 · 14:02 client $view
Anonymous click from an ad
utm_source=facebook · utm_campaign=spring-prospecting · fbclid=IwAR…
A durable first-party id is minted by your server — not by JavaScript, so Safari does not delete it in seven days. The campaign that paid for this click is written to the visitor as first touch.
-
Day 0 · 14:05 client $view
Three pages, then leaves
/collections/new → /products/lamp → /products/lamp?variant=black
Behavioural events, sent client-side. Cheap, fast, and expendable — if an ad blocker eats one, nothing important is lost.
-
Day 4 · 09:31 server identify
Returns and gives an email
hello@example.com · via: newsletter_popup
The anonymous-to-known bridge. Every session before this moment retroactively belongs to a known person, and the server records what caused the identification — not just that it happened.
-
Day 11 · 20:47 both purchase
Buys — counted once
order_10482 · $129.00 · confirmed by client + server
The browser reports the purchase and so does your backend. A shared dedup key collapses them into one conversion, marked confirmed by both sides, with the server's amount as the truth.
This is not a model. It is the receipt for one conversion — and you can pull it for any of them.
first touch: facebook / spring-prospectingThat is one conversion. The same events roll up into CAC and ROAS by campaign — first touch and last touch side by side, never blended into one misleading number.
We run our own acquisition through our own product.
This page runs the Flowsk snippet. Your visit right now is a journey in the same database a customer's data lands in — set by the same server-side cookie, confirmed by the same API, read by the same reporting code. There is no internal shortcut: our own instrumentation calls the public interface, exactly as yours would.
We will publish that funnel — channel by channel, computed live — once there is enough of it to be worth reading. When it goes up, it stays up, including the bad months.
See what we'll publish →Diagnose it yourself, free
No account, no email required. Each one runs on your numbers or your URL and gives you a real answer.
ITP Attribution-Loss Estimator
Safari caps JS cookies at 7 days. See the share of conversions your window structurally can't credit.
Open tool →First-Party Tracking Scanner
Paste a URL: we list every tracker on the page and flag which ones are third-party (ITP and ad-block bait).
Open tool →Cookie & Storage Inspector
Every cookie a page sets — first vs third party, expiry, HttpOnly, SameSite — plus who wrote it.
Open tool →Ghost-Conversions Checker
Compare what Meta reports to what your payment processor actually banked, and price the gap.
Open tool →Attribution Window Visualizer
See how much of your funnel falls outside a 7-day window — and what a durable window recovers.
Open tool →Client + Server De-Dup Simulator
Watch client and server events double-count the same sale, then watch a dedup key collapse them.
Open tool →Frequently asked questions
How is this different from GA4?
GA4 is session-based and models the conversions it could not observe. Flowsk is person-based and shows you the events themselves. GA4 answers 'roughly how is traffic behaving'. Flowsk answers 'which campaign paid for this specific $129 order' — and lets you open the journey and check.
Isn't this just a dashboard that connects my data?
No. A dashboard puts your Meta spend next to your Stripe revenue in two charts. It cannot tell you that this order came from that ad. Flowsk joins one person's journey across those tools onto a single identity. The join is the product; the chart is not.
What do I actually have to install?
One script tag before your closing head tag gets you tracking in minutes. Sending purchases from your payment webhook takes an afternoon and is what makes the count unblockable. Making the visitor id durable takes about an hour of a developer's time.
Will this survive Safari?
In proxy mode, yes. Safari caps cookies written by JavaScript at 7 days; a cookie set by your own server in an HTTP response is not capped. That single implementation detail is the difference between a 30-day attribution window and a decorative one.
How do I know your numbers are right?
Not on our numbers — we started in August 2026 and they would be near zero. Judge the mechanism instead: every claim on this site has a page showing how it works, and our own site runs the same code, through the same public interface your API calls would use. We have committed to publishing the funnel once it is worth reading.
Stop guessing which ad made the sale.
One snippet, a durable first-party id, conversions confirmed by your own server, and a journey you can read for every sale. Install it in five minutes and see your first journeys today.
Prefer to look first? How it works · Pricing