Campaign returns puts what you spent on each ad campaign next to the store sales that came from it, so you can see which campaigns pay for themselves. Sales come from your connected store; costs are what your team enters, or what an ad platform's script sends.
Before you start
- Campaign returns are available when your plan includes Campaign returns.
- Everyone in the company can read the report. Only owners and administrators can add and void costs.
- Sales are matched to campaigns from the order's own data: the campaign name the store records with the order, the same name as
utm_campaignin your ad links. Orders that arrive without one are counted under No campaign. Visitors appear only when your plan also includes Tracking and customer journey. See Tracking.
To open the report, select Reports, then Campaign returns. Choose 30 days, 90 days or 365 days at the top.
Read the report
At the top, for each currency: Sales, Cost and Return on paid campaigns. The return at the top counts only campaigns that have a cost, so sales from free traffic don't flatter it.
The table By campaign has one row for each campaign and currency, largest sales first, up to 50 rows:
| Column | What it means |
|---|---|
| Campaign | The campaign name, with its source when there is one |
| Visitors | Visitors who first arrived from this campaign in the period. Shown when tracking is on. |
| Orders | Store orders with a sale status (paid, processing, completed or delivered), by order date |
| New customers | Customers whose first order falls in the period |
| Sales | The total of those orders |
| Cost | The total of the costs entered for the period |
| Return | Sales divided by cost, for example 3.2× |
| Cost per order | Cost divided by orders |
The return is revenue, not profit: it doesn't know your product costs or margins.
Add a campaign cost
- Open Reports, then Campaign returns.
- Under Add campaign cost, fill Campaign. Write it exactly as in
utm_campaign. The box suggests the campaign names already found in your orders. - Optionally fill Source, for example the ad platform.
- Choose the Date the money was spent. It can't be in the future.
- Fill the Amount (more than zero) and choose the Currency.
- Select Save.
You can add one cost for the whole campaign or one for each day. A cost counts in the period that contains its date.
Fix a mistake
Under Recent costs (the 30 most recent), select Void next to the wrong entry, then add the right one. A voided cost is no longer counted, but it isn't deleted.
Sending costs automatically
Instead of typing costs, an ad platform's own script can send the daily cost of each campaign through the API, for example a Google Ads script. Sending the same campaign, day and source again replaces the earlier amount, so a daily run can safely resend the last month. See Google Ads.
Good to know
- Names are matched loosely. Capital letters and spaces at the start or end don't matter: "Summer-Sale" and "summer-sale " are the same campaign.
- Currencies are never converted. Each currency has its own row. If a campaign's cost is in one currency and its sales in another, its return shows "—", not zero, and its cost is left out of the return at the top. Ad platforms often bill in US dollars: to get a return, enter the cost in your store's currency.
- Visitors have no currency, so a campaign that sold in two currencies shows its visitors once.
- Costs are not fetched from Meta or Google accounts by themselves, and there is no profit margin.
Troubleshooting
My campaign shows sales but no cost. The name you entered doesn't match the order's campaign name. Check the spelling against utm_campaign.
Return shows "—". There is no cost for that campaign in that currency, or the cost is in a different currency from the sales.
All my sales are under No campaign. Your store isn't sending campaign data with orders. Check your ad links carry utm_campaign, and see your store's guide, for example WooCommerce.
Last updated 2026-11-08