flowsk.com
Flowsk Signals — first-party attribution

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.

✓ One snippet ✓ Survives Safari's 7-day cap ✓ Counted once, confirmed by your server
One visitor · one identity · one receipt
  1. Day 0 · 14:02 client $view

    Anonymous click from an ad

    utm_source=facebook · utm_campaign=spring-prospecting · fbclid=IwAR…

  2. Day 0 · 14:05 client $view

    Three pages, then leaves

    /collections/new → /products/lamp → /products/lamp?variant=black

  3. Day 4 · 09:31 server identify

    Returns and gives an email

    hello@example.com · via: newsletter_popup

  4. 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-prospecting

Does 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.

01 One snippet on your site Your server sets a first-party visitor id in an HTTP response — the one kind of cookie Safari does not cap at seven days. → The identity survives
02 Your payment webhook confirms every sale The purchase is reported by the system that took the money. No pixel involved, nothing for an ad blocker to drop. → The money is unblockable
03 Both sides land on one identity A shared de-duplication key collapses the browser event and the server event into one conversion, confirmed by both. → Counted exactly once

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.

One visitor · one identity · one receipt
  1. 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.

  2. 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.

  3. 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.

  4. 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-prospecting

That 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.

Proof, not testimonials

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.

All 11 tools →

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