Back to blog
Attribution3 min read

How to know the source of every order in your store

Most stores know the total. Few can open a single order and name the channel, campaign and ad behind it. That one field changes how every number after it reads.
Most stores know the total. Few can open a single order and name the channel, campaign and ad behind it. That one field changes how every number after it reads.

The simplest question in e-commerce is where an order came from. It's also the one most stores can't answer for any specific order.

You know the totals: orders today, revenue this month. What's missing is one level down. You open order 4,812 and see the channel, the campaign, the ad set and the ad that produced it.

What stores use instead of that field

With the field missing, three habits fill the gap, and all three measure something other than what you wanted:

  • Asking the customer. "How did you hear about us?" gets answered from memory, and memory credits the last thing someone saw.
  • A question on the thank-you page. Answered by the minority who bother, and that minority isn't random.
  • Discount codes. They count who remembered to type the code, not who was influenced.

Each one produces a number. None of them produces a number you can put next to ad spend and compare.

A fourth habit is to take the answer from each platform's own dashboard. That gives you a number built on that platform's methodology and window, and adding two or three dashboards together yields more conversions than your store had orders. You can't build a comparison on it, because every row was counted under a different rule.

Comparing three influencers on the same fee

Three influencers, each paid 5,000 SAR:

InfluencerVisitsOrdersCost per order
Influencer A90045111 SAR
Influencer B4,20028179 SAR
Influencer C6006833 SAR

Illustrative figures.

Without a source on the order, all you have is the visits column. The visits column names Influencer B the winner, and B costs 68 SAR more per order than A. With the orders column, renewing Influencer C takes about a second to decide.

The same arithmetic works on paid ads. Every order carries its channel, campaign and ad, so you compare source against source instead of comparing visits against orders and hoping the two move together.

Free channels join the same table. Brand search, referral, a WhatsApp message and an email campaign are all measured on the same ruler as paid. That's the first time you can compare a channel that costs you nothing against one you fund daily, because both numbers came from the same place.

A written source against an inferred one

A source you reconstruct later, by matching UTM strings or reading the last referrer at checkout, inherits every gap in whatever it was rebuilt from. A UTM written under a different name, a link somebody forgot to tag, a payment redirect that broke the session. Each one produces an order with no source, and those orders pile up in "direct".

Writing the source onto the order at the moment it's created, from the server, means the field is there whether or not the browser cooperated. It's written once and it doesn't erode.

That's also what keeps historical reads honest. A source stored on the order is still there when you change attribution model six months later. A source inferred from a session isn't, because the session is gone.

The source on every order is live in Flowfy today: channel, campaign, ad set and ad, written from the server at checkout and stored with the order, and it comes out in exports like any other field. Attribution reaches back inside a 90-day window, so an order that lands weeks after the first click still returns to it.

What becomes possible the same day

Three things:

  1. Ranking channels by real contribution instead of by which platform claims loudest.
  2. Finding sources you never tagged, like a QR code in the parcel, a WhatsApp message or a partner page, because each becomes its own row instead of collapsing into "direct".
  3. Settling the argument. When someone insists an order came from Instagram, you open the order and look.

"Direct" stays, and that's honest. Real direct orders exist: someone typed your URL, or opened a bookmark. The goal is for "direct" to stop swallowing orders that had a source you failed to capture.

The number to watch after the change is the share of total orders sitting in "direct". If it drops from a third to under a tenth, what you were losing was sources rather than customers.

Next step

Open the last twenty orders in your store and see how many you can name a source for. If more than a third sit in "direct" while you advertise daily, the problem is in collection rather than in the channels.