Promotion Attribution: What to Trust

Promotion attribution on Shopify: what "discount applied", last click and UTM tags each tell you, where they disagree, and which number to decide on.

When a promotion runs, three different Shopify numbers claim credit for the same sale. One says a discount was applied to the order. One says the visit came from a channel. One says the link carried a campaign tag. They are all correct, because each answers a different question, and they often disagree. This page is about promotion attribution done with the tools Shopify already gives you: what each signal measures according to Shopify's own definitions, the cases where they split, and a rule for which number to decide on.

Three signals, three questions

The discount on the order. Shopify's Sales by discount codes report groups sales by the name of the discount, "such as the automatic discount name or discount code," according to the Help Center. Its columns include the discount amount, the number of orders, total sales and shipping. This signal answers: did this order use this offer? It says nothing about where the shopper came from.

The session's source. Shopify's marketing reports attribute a sale to a channel. The Help Center's marketing reports page lists five attribution models. Last non-direct click gives all the credit to the last channel the customer interacted with before buying, excluding direct visits. Last click gives it to the last channel including direct visits. First click gives it to the first channel. Any click gives credit to each channel the customer clicked. Linear spreads equal credit across every click that contributed to the sale. This signal answers: which channel is credited?

The UTM tag. The Help Center's marketing performance page says traffic that arrives with a utm_campaign parameter in the URL is attributed to marketing, and the marketing reports page includes "externally managed efforts that use Urchin Tracking Module (UTM) parameters" in the sales attributed to marketing. This signal answers: what did the link say it was? It depends entirely on someone tagging the link, and it cannot see a visit that was never tagged.

What Shopify's reports count, and which model they use

Two defaults are worth knowing. The marketing reports page says the report named Performance by marketing channel "displays the last 30 days of data using the last non-direct click attribution model" by default, and it says last non-direct click is the default model when you view your marketing activity data. The marketing performance page adds that sessions and sales attributed to activities you create in Shopify are based on the last-clicked interaction.

Three other statements change how you read the numbers. First, the marketing reports page notes that the sales amount in an attribution report "can differ from sales figures in other reports." Second, it says Any click "allocates more credit than orders you've received," so its total can exceed your real order count, and it is best used to analyze a single channel. Third, it lists the older conversion reports (Conversion by first interaction, Conversion by last interaction and Attribution model comparison) as deprecated, and points to the Marketing top channel performance report for that analysis instead. Report names move, so check the live admin before you build a routine around one.

Where the signals disagree

SituationDiscount on the order saysSource and model saysUTM says
A shopper clicks an email, then returns by typing your address and buys with the email's codeThe email's codeLast click: direct. Last non-direct click: emailEmail, if the first visit was tagged
A code from a creator's post is shared in a coupon group and a stranger uses itThe creator's codeThe group's referral, or directNothing, no tagged link was used
A shopper clicks both an email and a shopping ad before buyingOne offer, if one code was usedThe email and the ad can each record a conversion, according to ShopifyBoth campaigns, if both links were tagged
An automatic discount applies to a shopper from any channelThe automatic discount, on every order it touchesThe channel that sent the sessionWhatever the link said
A shopper uses two combinable discounts on one orderThe order appears once for each discount applied, according to ShopifyOne credited channelOne campaign
A link was posted without tagsA code if one was usedReferral or directNothing

The rows are our reading of Shopify's definitions, applied to common cases, and the third and fifth rows are stated by Shopify directly. The duplicate-order behavior in the fifth row comes from the sales report page: with combinable discounts the same order can be included multiple times, once for every applied discount. The conversion behavior in the third row comes from the marketing performance page, which says a customer who clicks both an email and a Google Shopping ad can have a separate conversion recorded for each, while the marketing activity report credits the sale only to the most recently clicked ad in the past 30 days. Neither tool is wrong. They count different things.

What the disagreement means for a decision

A discount-applied count tells you how many orders used an offer. It cannot tell you how many of those orders would have happened without it, and neither can the other two signals. A last-click number tells you which channel was last in the path. It does not tell you which one caused the sale. Attribution, however well configured, answers a question about credit. Whether a promotion worked is a question about cause, and cause needs a comparison.

A UTM tag is also a promise made by a person. It is a name someone typed into a link, and a typo makes a second campaign. The marketing reports page says that in the Performance by marketing campaign report, traffic that is not associated with a campaign is not included, so an untagged link disappears from it instead of appearing as an error.

A decision rule

As planning advice, not a Shopify rule, here is an order of preference.

  1. Use a holdout when you can. Withhold the offer from a random slice of the audience, for example half the people on an email list, and compare what each half buys. This is the only method here that measures cause directly. It needs enough people to see a difference, so it suits an email list better than a small ad budget. Incrementality for Small Stores: Holdouts shows how to split the list and read the result.
  2. Otherwise compare matched weeks. Run the offer in one window and compare it with an equivalent window without it, allowing for seasonality. How to Measure Whether a Promotion Worked describes how to pick the windows and watch for pull-forward.
  3. Use attribution only to compare channels. Last non-direct click in Shopify's report is a fair way to ask whether email is bringing more sessions than a paid campaign this month. It is not a way to say how many sales an offer created.
  4. Use the discount report for the offer's cost. The Sales by discount codes report is the right place to read how much you gave away and on how many orders. Read it with the duplicate-order note in mind.

Whether UTM tags are useful depends on a habit. The convention below is ours, not Shopify's: write tags in lowercase, use one spelling for each channel, and record every tagged link in a list that says what it was sent to. Use utm_source for the platform or list, utm_medium for the kind of channel, and utm_campaign for the offer. The marketing reports page says the Sidekick assistant can group data by UTM campaign, source, medium or referrer, so tags that follow a pattern are easier to group. A tag that is spelled two ways is two rows in every report.

One code per channel

The simplest way to make the discount signal useful is to give each channel its own code. When the email list gets one code, the creator gets another and the shop's home page banner gets a third, the Sales by discount codes report becomes a channel report as well. A code can still leak, which is why Unique Discount Codes for Creators and Email covers one code per person, and the difference between an offer that needs a code and one that does not is in Discount Codes vs Automatic Discounts. Keep leakage in mind when you read a code's result, and treat it as an upper bound on what that channel sent.

In Freebies Engine by Log Studio Lab, the Single code template is described as one code shoppers type at checkout. Build one per channel, name each so the report shows the channel at a glance, and write down the code, the channel, the start and end dates and the discount in the same log you use for your UTM links. When the window closes, read three numbers side by side: orders with the code, sessions credited to the channel, and your baseline weeks. If the three tell different stories, believe the comparison with the baseline, and use the other two to ask why.

Plan requirements for the template are on the pricing page.

Sources

Build this offer from the “Single code” template.