Tracking & Attribution

How Do You Tell Which Influencer Drove Sales When They All Share One Discount Code?

One discount code, three influencers, no idea who sells. Here's why codes can't attribute sales, and how per-creator links credit each order properly.

Quick answer

You can't, from the code alone. A shared discount code tells you a discount was used, not who sent the buyer, and codes leak to coupon sites and group chats within days. Give each creator their own UTM-tagged link, then credit each order to the visit that link produced, matched by visitor ID or email whatever code the buyer typed. Group sales by campaign, read first touch and last touch side by side, and treat untagged code-only orders as unknown rather than guessing.

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

You can’t tell which influencer drove a sale from a shared discount code, because the code only records that a discount was used, not who sent the buyer. To split credit, give each creator a unique tracked link and credit each order to the visit that link produced. Orders with only a code stay “unknown”.

That sounds like a small change, and it is. The hard part is resisting the temptation to keep reading the code report as if it answered the question. It never did.

Why doesn’t a shared discount code tell you who drove the sale?

A discount code is a pricing instruction. Your store records that the order used CREATOR15, and that is all it records. There is nothing in the code about which Instagram story, TikTok video or podcast ad put it in the buyer’s head. Three creators reading out one code produce one undifferentiated pile of orders.

Even a unique code per creator only half works, for three reasons.

Codes leak. Once a code is public, it gets scraped onto coupon sites and picked up by browser extensions that auto-apply codes at checkout. A buyer who came from your own Google ad can end up with Ava’s code applied, and Ava gets the credit.

Codes get swapped. Buyers forget which creator they heard it from and type whichever code they remember, or search “yourbrand discount code” and take the first one they find.

Codes only see the last step. A code is entered at checkout. It says nothing about whether the buyer first found you through the creator three weeks ago, or through a retargeting ad yesterday. Code-based reporting quietly assumes every buyer who typed a creator’s code was that creator’s buyer, and that nobody else helped.

So a per-creator code tells you who got paid a commission. A per-creator link tells you who sent a visitor. You want the second one for budget decisions.

What does a shared code hide in practice?

It hides the ranking. Say three creators promote CREATOR15 in the same week and the discount report shows 200 orders. You pay each creator the same flat fee and assume they did a third each.

Now trace the visits. Ava’s link produced 120 of those orders. Leo’s produced 50. Mia’s produced 10. The other 20 came from buyers who typed the code with no creator visit anywhere in their history, mostly from a coupon site. Mia costs you the same as Ava for a twelfth of the sales, and you only find out if the orders are tied to visits.

The numbers are illustrative, but the shape is common: creator performance is rarely even, and a shared code averages the winners and losers into one flattering number.

How do per-creator links fix it when the code stays the same?

You can keep the shared code. What changes is that every creator gets their own link, and credit follows the link, not the code. The code becomes a detail on the order, like the shipping method.

A per-creator link is your normal landing URL with UTM parameters (Urchin Tracking Module tags, the utm_ values on the end of a link) that name the creator:

https://yourstore.com/products/serum?utm_source=instagram&utm_medium=influencer&utm_campaign=spring-creators&utm_content=ava
https://yourstore.com/products/serum?utm_source=tiktok&utm_medium=influencer&utm_campaign=spring-creators&utm_content=leo
https://yourstore.com/products/serum?utm_source=youtube&utm_medium=influencer&utm_campaign=spring-creators&utm_content=mia

Use utm_medium=influencer for all of them, so creators roll up as one channel, and put the creator name in utm_campaign or utm_content so you can split them apart. Pick one convention and never change it mid-campaign. If you are unsure how UTMs relate to ad click IDs, the difference is covered in gclid vs fbclid vs UTM parameters.

Three creator links with different utm_content values feeding one buyer's journey ribbon: Instagram click from Ava's link, a return visit as Direct, then a purchase using the shared code CREATOR15, credited to Ava's visit

What about podcasts and videos where nobody can click?

Give each creator a short, speakable URL on your own domain, like yourstore.com/ava, and redirect it to the UTM-tagged landing page. People remember a name more easily than a code anyway. Click your own short link after setting it up and confirm the UTMs arrive on the landing page, because some redirects and link shorteners drop them.

Should you add a post-purchase survey?

Yes, as a second opinion. A “where did you hear about us?” question at checkout catches word-of-mouth and podcast listeners who typed your URL by hand. Treat it as self-reported: people misremember and pick the first option. Use it to spot creators your links are missing, not as the ledger.

Why do creator sales still show up as Direct or as a Meta ad?

Because the visit that placed the order is often not the visit that came from the creator. That is the single biggest reason influencer programmes look worse in analytics than they feel in the inbox.

The usual path looks like this. A follower taps Ava’s link inside Instagram, which opens your store in Instagram’s in-app browser. They browse, don’t buy, and leave. Two days later they open Safari on the same phone, type your URL, and check out. Or they see a retargeting ad, click it, and check out.

To your store’s last-click report, the first path is Direct and the second is a Meta ad, the same pattern behind ad conversions that show as Direct. Ava’s link did the finding and gets nothing. The in-app browser and Safari don’t share cookies, so the two visits look like two strangers. It is the same problem as a mobile ad click that turns into a desktop purchase, just with a creator at the start instead of an ad.

This is why you need two views. First touch credits the visit that started the journey, which is where creators usually earn their keep. Last touch credits the visit that closed it. Paid retargeting often closes creator-found buyers, and Meta will claim those sales in its own reporting too, since it credits purchases inside its attribution window (7-day click, 1-day view by default). Both views are true at once. If you only look at last click, you will cut the creators who fill your retargeting pools.

How do you work it out by hand?

If you are not ready to add a tool, a spreadsheet gets you most of the way for a single campaign.

  1. Export orders for the campaign window, with order ID, email, date, total and discount code.
  2. Export sessions from your analytics tool filtered to utm_medium=influencer, with the landing date and utm_content.
  3. Join on whatever you can. Most analytics tools don’t expose buyer email next to sessions, so you are usually matching by date and order ID from the analytics purchase event, which only works when the purchase happened in the same browser as the creator click.
  4. Label the leftovers honestly. Orders with the code and no matching creator session go in an “unknown” row. Do not split them evenly across creators.

The spreadsheet breaks down exactly where the interesting buyers are: the ones who switched browsers or came back days later. That gap is what an identity-stitched ledger closes.

How does PartialLeads credit the creator whatever code the buyer types?

PartialLeads records each creator link click as a visit with its UTMs, then matches every paid order back to the visits that led to it, regardless of the discount code on the order. On Shopify, the order arrives from the store’s order webhook. The match is tiered: the visitor ID echoed from the storefront first, then email, then phone, then IP.

That tiering is what rescues the in-app-browser case. The tag stitches a person’s sessions into one identity across visits and devices using visitor ID, email, phone, IP plus user agent, and click IDs, so “tapped Ava’s link in Instagram, came back in Safari, bought” can read as one journey instead of two strangers. How that stitching works is explained in how visitor identity resolution works. Every matched order gets a first-touch row and a last-touch row, snapshotting the UTMs of each visit.

The Attribution report then groups sales by source, medium, campaign, content or term. Group by campaign or content and each creator becomes a row with revenue, purchases, average lag and visitors, with first touch, last touch and the PartialLeads resolved model side by side. The general rules for reading those models without fooling yourself are in the guide to reading an attribution report.

To audit a single order, open the lead. The journey ribbon on the Leads list shows each touch as a badge from left to right, ending in the conversion, and the journey timeline shows the timestamp and UTMs of every session.

PartialLeads Attribution report grouped by campaign content, showing first-touch and last-touch revenue for creators Ava, Leo and Mia next to Meta retargeting and Direct, with the model totals equal to real revenue

Honest limits. PartialLeads does not report by discount code, so if you need commission payouts per code, keep using your store’s discount report for that. A buyer who heard a podcast and typed the code without ever clicking a tagged link has no creator visit to credit, so that order lands wherever its visit came from, often Direct. Matching is maximised, not guaranteed: an order that can’t be tied to any visit shows as unmatched rather than being guessed. Only paid orders are sent to ad platforms, and PartialLeads imports Meta ad spend, not creator fees, so cost per creator and ROAS per creator stay a calculation you do with your own fee sheet.

What breaks The mechanism Where you see it in the dashboard
One shared code, no idea which creator sold Each paid order matched to the visit a creator’s UTM link produced, whatever code was typed Attribution report grouped by campaign or content
Leaked codes credit the wrong creator Credit follows visits, not codes; orders with no creator visit stay with their real source Channels table, Direct and unmatched rows
In-app browser click, purchase later in Safari Sessions stitched per person by visitor ID, email, phone and IP Journey ribbon on the Leads list
Retargeting ad closes a creator-found buyer First-touch and last-touch rows written for every matched order Attribution Models panel, First/Last toggle
Can’t prove what happened on one order Per-person journey with UTMs on every session Journey timeline on the lead

Keep the code for the discount and the commission. Give every creator a link, credit the visit, and let the orders nobody can place stay unplaced. That is the only version of the ranking you can pay creators against.

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

Sources

https://www.facebook.com/business/help/458681590974355

https://developers.facebook.com/docs/marketing-api/conversions-api


Frequently asked questions

QShould I give every influencer their own discount code?
It helps with commission payouts, but it is not reliable attribution. Codes leak onto coupon sites, browser extensions auto-apply them, and buyers type whichever code they remember. A unique code tells you whose code was used, not who sent the buyer. Pair unique codes with unique tracked links, and use the links for performance decisions.
QWhich UTM parameter should hold the influencer's name?
Keep utm_medium the same for every creator, such as influencer, so creators roll up as one channel. Put the creator's name in utm_campaign or utm_content, whichever your team already uses for splitting. What matters most is consistency: one convention, written down, applied to every link, and never changed partway through a campaign.
QHow do I track influencer sales from a podcast or YouTube video with no clickable link?
Give each creator a short, speakable URL on your domain, such as yourstore.com/ava, that redirects to a UTM-tagged landing page. Test it yourself to confirm the UTMs survive the redirect. Listeners who type only your homepage and the code still can't be traced, so add a post-purchase survey question to catch them.
QCan PartialLeads show sales by discount code?
No. PartialLeads credits orders to the visits that led to them and groups them by source, medium, campaign, content or term. It does not report by discount code. Keep your store's discount report for commission payouts per code, and use the attribution report to see which creator's link actually brought the buyer.
QWhy does my influencer campaign look weak in Shopify analytics?
Shopify's default view credits the visit that placed the order. Creator traffic often browses first and buys later, from another browser, a direct visit or a retargeting ad, so the sale lands elsewhere. Look at first-touch attribution to see which journeys creators started, next to last-touch to see what closed them.
QWhat should I do with orders that used the code but have no creator visit?
Leave them in an unknown row. Splitting them evenly across creators rewards the weak ones and hides leakage. If that row is large, check whether the code has spread to coupon sites, and consider moving creators to links that apply the discount automatically so buyers don't need to search for a code.

Find the qualified leads your forms are currently throwing away.

Install PartialLeads on one landing page, send traffic, and compare what your CRM captured against what PartialLeads recovered and qualified.