Back to blog
Profit3 min read

Join ad spend to orders on the click ID

A 5.0 ROAS on the dashboard is worth checking before you celebrate. If 40% of your spend never matched a campaign, the denominator is short and the number is wrong in the direction you like.
A 5.0 ROAS on the dashboard is worth checking before you celebrate. If 40% of your spend never matched a campaign, the denominator is short and the number is wrong in the direction you like.

Revenue lives in your store, spend lives in the ad platforms, and return comes out of the join between them. That join is exactly where most reported ROAS figures go wrong.

Where the gap between 5.0 and 3.0 comes from

Monthly spend is 100,000 SAR across four campaigns. Matching on UTM alone, 60,000 SAR joins to known campaigns and 40,000 SAR lands in an unknown bucket, because links were tagged with different names or not tagged at all.

Recorded revenue is 300,000 SAR.

  • 300,000 ÷ 60,000 = 5.0×, a lovely number and a wrong one, because the denominator is 40% short
  • With the 40,000 restored: 300,000 ÷ 100,000 = 3.0×

The decisions you built on 5.0, raising budget, widening audiences, cutting another channel, were all taken against spend that never entered the calculation.

Step one: size your unknown bucket

Pull total spend from each platform for one closed month and compare it against the spend you can match to known campaigns. The difference is the bucket, and that figure alone tells you how wrong your current ROAS is before you fix anything.

Step two: change the join key

A UTM is a string somebody typed, and that's the whole problem:

  • Names drift. summer, summer_2027 and Summer are three campaigns to a matcher and one campaign to a human.
  • Links get built without tags. Especially in-platform ad creation, where the destination URL is set by whoever built the ad.
  • Redirects strip them. A payment redirect or a link shortener can drop query parameters entirely.
  • Nothing enforces them. No system rejects an untagged link, so there's no moment where the mistake surfaces.

The click identifier solves this. Every platform stamps its own identifier on the click, such as fbclid, gclid and ttclid. It arrives in the URL, and the platform itself can tell you which campaign it belongs to.

Join keyCreated byFails when
UTM stringA personNaming drifts, or someone forgets to tag
Click IDThe ad platformA redirect strips it, or the browser blocks capture

Capturing the click identifier server-side, at the order, is what makes that second row robust. It's the same mechanism that keeps a source through a payment redirect.

Step three: reread every number with spend in the denominator

Spend isn't one report among many. It's the denominator, so an error in it spreads into every efficiency figure you have:

  • ROAS, the headline number, wrong in the direction you like
  • Cost per order and cost per new customer
  • Budget-fit analysis, which compares spend share against revenue share
  • Profit per channel, which subtracts costs from a return that was already overstated

The platform's own ROAS doesn't solve this either, because it uses its own conversion count over its own window: why Meta reports more conversions.

In Flowfy, click identifiers are captured server-side and stored on the order, and orders carry their channel, campaign, ad set and ad, which is the prerequisite for any reliable join. Ad spend connectors, meaning daily spend pulled from Meta, Google, TikTok and Snapchat and joined on the click identifier, haven't shipped and are on the roadmap. Until they do, revenue by source is available in Flowfy, the spend figure comes from your ad accounts, and you join them in a spreadsheet. The arithmetic above works today, but it takes a manual step.

The first thing to do

Size your unknown bucket for a single month. Until you know how big it is, you don't know how wrong the numbers you're acting on are.

Attribution

Six redirects off your site that can lose the order source

Instalment providers take the blame, but the mechanism is broader. Any journey that leaves your domain and comes back can end the session carrying the customer's source. Here's the list, and one fix that covers most of it.

3 min read
Profit

How to work out which payment method earns you more

Deferred payment carries higher fees and a bigger basket. Which of those wins is an arithmetic question, and most stores answer it with an opinion. Here's the maths on a hundred orders, and six steps to run it on your data.

3 min read