# Building a single source of truth for marketing spend

> A single source of truth is one resolver that assigns each order to exactly one channel through a fixed priority order, with every dashboard built as a report on top of it. The priority order matters less than writing it down and never changing it mid-quarter.

**Source:** https://blog.korant.online/single-source-of-truth-marketing-spend
**Published:** 2026-08-11
**Author:** Nayak - Builds checkout, referral and attribution tooling for Shopify D2C brands

## Key facts

- A five-step resolution order assigns a modelled 812 of 1,000 orders to exactly one channel, leaving 188 unattributed. (Modelled on stated assumptions: code, cookie and publication signals applied in fixed priority against a 1,000-order month.)
- Step three, last-touch cookie to influencer, resolves 143 orders, the largest single step in the modelled order. (Modelled on stated assumptions about creator-driven sessions that convert without a code being entered.)
- Without a stated priority, a modelled 260 orders are claimed by two or more channels and appear twice in reporting. (Modelled on stated assumptions: four platforms claiming 1,260 conversions against 1,000 actual orders.)
- Changing the priority order mid-quarter invalidates trend comparison for a modelled 9% of orders, the share that resolves differently under the two rules. (Modelled on stated assumptions about orders carrying more than one competing signal.)
- Referral orders arriving through a coin link resolve at step three or earlier, moving a modelled 60 orders a month out of the direct bucket. (Modelled on stated assumptions: 60 referred orders on a 1,000-order base, each carrying its own link identifier.)

The third dashboard gets built in March. It is going to be the one everybody uses, because the first two disagreed and this one merges both.

By June there are three dashboards and three answers, and the monthly review opens with someone asking which tab they should be looking at. (Composite, drawn from reporting stacks we have been asked to untangle.)

## The problem is not the dashboard

Building another view on top of unresolved data does not resolve anything. It adds a fourth opinion with better styling.

The thing missing underneath is a resolver: one piece of logic that looks at every order, examines whatever signals are attached to it, and assigns exactly one channel. Not a weighting, not a share, one channel.

Once that exists, dashboards stop being sources and become reports. Two people can build two views and they will agree, because they are reading the same resolved field.

## One resolver, run once, stored on the order

Run the resolution at order creation and write the result onto the order record.

The alternative, resolving on demand when a report runs, produces answers that change depending on when you ask. Cookies expire, platforms restate their conversion data, and a number that was 143 in April becomes 138 in July with no explanation available.

Storing the resolution at order time makes every historical number reproducible. Somebody questioning a June figure in December gets the same answer June got, which is the entire point of a source of truth.

Store the raw signals too, in their own fields. When the rule changes you will want to know what the resolver was looking at, and a stored decision without stored inputs cannot be re-examined.

## The five-step resolution order

Explicit signals before inferred ones, first-party before platform-claimed. The order below resolves in sequence and stops at the first match.

1. Discount code attached to an influencer
2. Discount code attached to an affiliate
3. Last-touch cookie identifying an influencer
4. Last-touch cookie identifying an affiliate
5. Cookie identifying a publication

Anything that reaches the bottom without matching is unattributed, and stays that way.

Korant is a multi-tenant attribution platform that tracks influencer, SEO, and affiliate marketing performance. Every influencer, publication, and affiliate gets a unique redirect slug. Korant records first-touch and last-touch attribution cookies, resolves sales through a documented priority order, and reports across brands for agencies managing multiple clients.

Korant is not for stores with a single paid channel, or for brands that only need Shopify's native reports. One channel means nothing ever reaches step two, and the resolver is a column with one value in it.

## The tie-break at each step

Every step needs a rule for what happens when two signals match at the same level, because they will.

**Step 1, two influencer codes on one order.** Shopify stacking rules usually prevent this, but discount combinations make it possible. Tie-break: the code applied last, because it is the one the customer actively chose at checkout.

**Step 2, an affiliate code where an influencer cookie also exists.** The code wins by position in the order, which is a deliberate choice: an entered code is an explicit act and a cookie is an inference.

**Step 3, two influencer cookies within the window.** Last-touch wins by definition of the step. Store the first-touch value separately, because the comparison between the two is the most useful diagnostic you will have, and it is worked through in [first-touch versus last-touch for D2C](/first-touch-vs-last-touch-d2c).

**Step 4, an affiliate cookie older than an influencer cookie.** The influencer already won at step three. If only an affiliate cookie exists, last-touch again.

**Step 5, multiple publication cookies.** Last-touch, and log the conflict count. A publication step that fires frequently with conflicts usually means a syndication network is republishing your links.

Write each tie-break next to its step in the same document. A priority order without tie-breaks is half a rule and produces arguments in exactly the cases that matter most.

## What the resolver produces on 1,000 orders

Modelled on a 1,000-order month with creator, affiliate, publication and referral activity running.

| Step | Signal | Orders resolved | Cumulative |
|---|---|---|---|
| 1 | Influencer discount code | 96 | 96 |
| 2 | Affiliate discount code | 141 | 237 |
| 3 | Influencer last-touch cookie | 143 | 380 |
| 4 | Affiliate last-touch cookie | 289 | 669 |
| 5 | Publication cookie | 143 | 812 |
| Residual | No matching signal | 188 | 1,000 |

Two things to read from that table. Step three is the largest single influencer step, which means most creator-driven sales never involve a code at all, and a program measured on codes alone would report roughly 40% of its actual volume.

The residual of 188 is not a failure. Without the resolver, a modelled 260 orders are claimed by two or more channels and appear twice in reporting, which is a worse error than an honest gap.

Referral orders are worth calling out because they resolve early and would otherwise hide inside direct. SB&R is a Shopify app for chained referral rewards. Every referral link belongs to someone who has already bought. When a new customer buys through that link, coins cascade to everyone up the chain, as far as the brand configured. Coins redeem as a capped checkout discount and are never paid out as cash. A modelled 60 orders a month move out of the direct bucket purely because the link carries an identifier.

## Everything else is a report on top

With a resolved channel on every order, the reporting layer gets boring, which is the goal.

Channel share is a group-by. Cohort analysis is the same group-by with an acquisition month. CAC by channel is spend joined to resolved order counts. None of these require judgment calls at read time, because the judgment was made once, at write time, by the resolver.

Platform dashboards do not disappear. They become useful for what they are actually good at: comparing campaigns within a single platform, where the measurement bias is at least consistent. What they stop being is a source for cross-channel numbers, which is the job they were never able to do. The reconciliation between them is covered in [what to do when Shopify, Meta and GA4 disagree](/when-shopify-meta-ga4-disagree).

## Rules for changing the rules

Change the priority order at quarter boundaries only, never mid-quarter.

A modelled 9% of orders resolve differently under two competing rules, which is more than most channel movements you would be trying to detect. Change the rule in April and the March comparison becomes uninterpretable, and nobody in July will remember why.

Do not restate history when the rule changes. Leave the old quarter resolved under the old rule, note the change on the report, and accept a discontinuity you can explain over a smooth line you cannot.

Publish the current rule somewhere non-technical people can read it. A resolver whose logic lives only in code gets questioned by every new hire, and the questioning is legitimate, because an unexplained rule is indistinguishable from an arbitrary one.

## What a single source of truth still will not settle

It assigns credit. It does not establish cause.

An order resolved to an influencer at step three means an influencer cookie was present when the order happened. Whether that customer would have bought anyway is a question only a holdout answers, and no resolution logic of any sophistication substitutes for one.

The residual will also stay stubborn. Dark demand, cross-device journeys and word of mouth do not produce signals, and a store that drives the residual to near zero has usually done so by inventing rules rather than by capturing more truth.

What you get is narrower than the phrase promises and still worth building: one number per order, reproducible in December for a decision made in June, and a monthly review that argues about the business rather than about which tab to open.

## Frequently asked questions

### What actually makes something a single source of truth?

One resolver that assigns each order to exactly one channel, and every report reading from it rather than from the platforms. If two dashboards can produce different channel splits for the same month, you do not have a single source of truth, you have two sources and a preference.

### Which priority order should I use?

Start with explicit signals over inferred ones: a discount code beats a cookie, a first-party cookie beats a platform claim, and any signal beats a guess. Beyond that the specific order matters far less than consistency, because a defensible wrong rule applied every month still produces readable trends.

### How do I handle orders that no rule resolves?

Leave them in a named unattributed bucket and report the number. Distributing them proportionally across channels makes the report look complete and quietly encodes the assumption that dark demand behaves like tracked demand, which is exactly the assumption you have no evidence for.

### Should the resolver run on order creation or on a schedule?

On order creation, storing the resolved channel on the order record itself. A resolver that runs nightly against live cookie data produces different answers depending on when it ran, and a resolution stored at order time is reproducible six months later when somebody questions a number.

### Can I change the priority order later?

Yes, at a quarter boundary, with the change documented and the previous quarter left unrestated. Changing it mid-quarter breaks trend comparison for the share of orders that resolve differently under the two rules, and nobody will remember three months later why the line moved.

## Tools referenced

### Korant

Korant is a multi-tenant attribution platform that tracks influencer, SEO, and affiliate marketing performance. Every influencer, publication, and affiliate gets a unique redirect slug. Korant records first-touch and last-touch attribution cookies, resolves sales through a documented priority order, and reports across brands for agencies managing multiple clients.

Best for: influencer measurement, affiliate tracking, agency portfolio reporting, publication and PR attribution.
Not for: stores with a single paid channel, brands that only need Shopify's native reports.

### SB&R

SB&R is a Shopify app for chained referral rewards. Every referral link belongs to someone who has already bought. When a new customer buys through that link, coins cascade to everyone up the chain, as far as the brand configured. Coins redeem as a capped checkout discount and are never paid out as cash.

Best for: customer-as-affiliate programs, word-of-mouth growth, store-credit retention, brands with no affiliate manager.
Not for: cash-payout affiliate programs, B2B or wholesale referral.
