Shopify revenue
Connect your Shopify orders, see exact revenue by source, and understand how Muro attributes each order.
Connecting orders is step 3 of the Shopify setup. Once it's done, Shopify sends Muro every paid order, and the Revenue panel shows what each source, campaign and landing page earned, to the cent. It takes about 3 minutes.
Revenue attribution works with Shopify only today. Other payment and checkout platforms aren't supported yet.
Before you start
- Team plan or free trial. Connecting orders and seeing revenue amounts needs the Team plan or an active trial. On Starter, the checklist shows See exact revenue by source with Team instead of the form.
- You're the project owner. Only the owner can connect, reconnect or disconnect a store. Members see the checklist without the setup instructions.
- Steps 1 and 2 are done. The tracking script and the Muro pixel are what tie each order to a visit. Without them, orders still arrive but can't be attributed. See Install on Shopify.
- Your store's .myshopify.com domain. Shopify shows it under Settings → Domains. Use it even if your store has a custom domain.
Each store can be connected to one Muro project at a time.
Create the app in Shopify
Muro connects through a custom app that you create and own, with read-only access to orders. Open Settings → Integrations → Shopify in Muro, find step 3 Connect orders for exact revenue, and follow along there or here.
Create the app
In the Shopify Dev Dashboard, click Create app and name it Muro Analytics.
Allow it to read orders
Under Versions, set Access scopes to only read_orders, then Release the version.
Declare protected customer data
Under API access requests → Protected customer data access, select Protected customer data with no individual fields, choose Analytics as the reason, and save. Without this, Shopify refuses to send orders.
Install it on your store
On the app's home page, under Distribution, choose Custom distribution, enter your store's .myshopify.com domain and click Generate link. Open the link to install the app on your store.
Copy the credentials
Under App settings, copy the Client ID and Client secret. You'll paste both into Muro next.
Connect in Muro
Back in Settings → Integrations → Shopify, fill in the form under step 3:
| Field | What to enter |
|---|---|
| Shop domain | Your store's .myshopify.com domain, like your-store.myshopify.com. A pasted admin or storefront URL is cleaned up for you, but a custom domain isn't accepted. |
| Client ID | From the app's App settings page. |
| Client secret | From the same page. It's never shown again after you connect. |
Click Connect orders. When it works, step 3 turns green and reads Orders are connected. Revenue appears within a minute of each payment. The step also shows your store, its currency, and when the last order was received.
Muro only reads orders. It never reads customer names, emails or addresses.
Earlier orders
Muro records orders from the moment you connect. Within about a day, a catch-up also picks up orders from roughly the 48 hours before you connected. Older order history isn't imported. Those earlier orders usually show as Unattributed or via Shopify, because Muro may not have seen the visits behind them.
If connecting fails
Muro tells you what Shopify said and highlights the step to go back to.
| Message | What to do |
|---|---|
| Shopify rejected the Client ID or Client secret. | Copy both again from the app's App settings page (step 5), and check the shop domain is the store you installed the app on. |
| The Muro Analytics app isn't installed on this store yet. | Complete step 4: choose Custom distribution for your store, then install the app. |
| The app isn't allowed to read orders. | Complete step 2: set Access scopes to read_orders, release the version, then connect again. |
| Shopify blocked order access. | Complete step 3: select Protected customer data with no fields, choose Analytics as the reason, save, then connect again. |
| This store is already connected to another Muro project. | Disconnect it in that project first, then connect it here. |
| Enter your store's .myshopify.com domain… | Use the your-store.myshopify.com domain, not a custom domain. |
| Connecting orders needs a Team plan or an active trial. | Upgrade in Billing, then try again. |
| Only the project owner can connect Shopify. | Ask the owner to connect the store. |
| Too many attempts — try again in 10 minutes. | Wait, then try again. |
| Couldn't reach Shopify right now. | Shopify didn't respond. Try again in a moment. |
The Revenue panel
Once orders are connected, the Revenue panel appears on your Dashboard, below Top insights. Until the first paid order arrives it reads Waiting for your first order….
- Stats: Revenue, Orders and Avg. order value for the selected date range, each with its change against the previous period of the same length.
- Chart: revenue over the range, bucketed like the main chart, in your project's timezone.
- Coverage line: N% of revenue attributed, the share Muro could tie to a visit. Hover the hint icon for what lowers it.
- Breakdown tabs: Source, Campaign, Landing page, Country and Device, with Orders, Revenue and Share columns. View all opens every row. The Source tab prefers an order's
utm_sourceover its referrer, because a tagged link names its source more precisely. - Special rows: Unattributed for orders Muro couldn't tie to a visit, and a via Shopify badge where the source came from Shopify instead of the pixel.
The panel always covers the whole project for the selected range. Dashboard filters don't change it, and it shows Filters don't apply to revenue while any are on.
If you've added the pixel but haven't connected orders, the panel shows a Purchases count reported by the pixel, plus a Connect your Shopify orders to see exact revenue button. Pixel events can't be verified, so Muro shows counts only, never amounts.
How attribution works
First touch
Muro credits an order to the first touch: the source that first brought that buyer to your store. If someone found you through a newsletter on Monday and came back by typing your URL on Friday to buy, the newsletter gets the credit.
The pixel remembers a buyer's first touch for 30 days. When Shopify reports that the visitor hasn't allowed analytics, the pixel keeps the first touch for the current browser tab only.
Attribution order
For each paid order, Muro takes the first of these that it can find:
- The pixel's first touch. The source, campaign and landing page the pixel remembered for this buyer.
- The purchase session's first pageview. If the pixel had no first touch, Muro uses where the session that ended in the purchase started.
- Shopify's own data. If Muro has no visit at all for the order, it uses the referring site and UTM parameters Shopify recorded. These rows carry a via Shopify badge.
- Unattributed. If none of the above is available, the order still counts in revenue, in its own Unattributed row.
Unattributed is never folded into Direct. Direct means Muro saw the visit and it had no referrer. Unattributed means Muro couldn't tie the order to a visit at all.
Unattributed and "via Shopify"
An order usually ends up Unattributed because:
- the buyer's ad blocker or tracker blocker stopped the Muro pixel,
- the buyer never reached the thank-you page,
- the order was created by staff (a draft order, for example), or
- the buyer never answered your consent banner, when the pixel is set to wait for consent.
A via Shopify row means the Muro pixel was blocked for that buyer, but Shopify itself reported where they came from. One source can appear twice in a breakdown, once as Muro saw it and once via Shopify, so each row describes a single kind of attribution.
Attribution coverage
Under the Revenue chart, a line reads "N% of revenue attributed". It's the share of revenue in the selected period that Muro tied to a visit through the pixel or the purchase session (steps 1 and 2 above). Revenue attributed via Shopify and Unattributed revenue is outside that share.
The number is rounded down, so it never says 100% while any revenue is unattributed. Blockers, buyers who skip the thank-you page, staff and draft orders, and unanswered consent banners all lower it.
How the consent setting affects attribution
When you add the Muro pixel, Shopify asks how it should treat visitor consent (the Customer privacy setting). Muro doesn't choose for you:
- Not required matches how the Muro script already runs: cookieless, with no consent banner. Carts, checkouts and purchases are recorded without waiting, so coverage is highest.
- Analytics makes the pixel wait for each visitor's consent. Visitors who never accept your banner aren't tracked at checkout, so fewer orders are tied to a source. Their orders still count in revenue, as via Shopify or Unattributed.
Whether you need consent is a legal question for your store. See Privacy for how Muro collects data.
What counts as revenue
- Paid orders only. Pending and cancelled orders are left out.
- Net of refunds. Muro uses each order's current total, so a partial refund lowers it and a fully refunded order drops out of Revenue and Orders.
- No test orders. Shopify test orders are excluded.
- Online orders only. Point-of-sale (POS) orders are excluded.
- One currency. Amounts are shown in your store's currency. Orders in any other currency are excluded, and the panel says so when a period contains some.
- Dated by payment. An order lands in the period when it was paid, in your project's timezone.
If tracking is paused for the project, or the monthly pageview limit is reached, orders still arrive and count toward revenue, but they show as Unattributed until tracking resumes. If the account's plan is no longer active, new orders aren't recorded until it's renewed.
Purchases in session journeys
In Sessions, a session that ended in a purchase shows the purchase in its journey, for example Purchase — $629.95, with a Refunded or Cancelled badge if that happened later. The amount appears only if you can see revenue: the project owner on the Team plan or a trial, or a member the owner has shared revenue with. See Sessions.
Let members see revenue
By default, project members see order counts but not amounts. Their Revenue panel shows Amounts visible to the owner, with Revenue and Avg. order value locked.
To share amounts, turn on Let project members see revenue in step 3 (it appears once orders are connected). Members then see the same Revenue panel you do, and purchase amounts in session journeys. Turn it off to hide amounts again. See Team members.
Disconnect or reconnect
Disconnect
Click Disconnect store under step 3 and confirm. Muro deletes its order webhooks and its copy of your app secret, and stops receiving new orders. Orders already recorded stay, so your revenue history is kept if you reconnect later.
Disconnecting doesn't revoke the credentials themselves. To fully revoke Muro's access, delete the Muro Analytics app in your Shopify Dev Dashboard.
Deleting the Muro project also disconnects the store.
Reconnect
If Shopify stops accepting Muro's connection (for example, the app was uninstalled or its credentials changed), step 3 shows the reason, such as Shopify rejected Muro's credentials for this store. Reconnect to resume revenue tracking. The owner also gets one email about it.
Fix the cause in the Dev Dashboard, then enter the app's current Client ID and Client secret and click Reconnect orders.
If your plan changes
If you move to Starter while connected, the store stays connected and orders keep recording, but amounts are hidden behind See which sources bring revenue with Team. Upgrading again shows your full revenue history with no gap.
What revenue doesn't cover
- Revenue isn't in the daily digest, Slack posts or insights. Those cover traffic only.
- Dashboard filters don't apply to revenue. The Revenue panel always shows the whole project for the selected range, and it says Filters don't apply to revenue while filters are on.
- No multi-touch models. Muro uses first touch only.
- No full history import. Muro records orders from when you connect, plus about the previous 48 hours.
Verify it works
- Wait for the next paid order, or place a small real order yourself. Shopify test orders aren't counted. If you refund your own order in full afterwards, it drops out of revenue.
- Within a minute of payment, check that Last order received in step 3 updates.
- On the Dashboard, set the range to Today and find the order in the Revenue panel.
- Open the Source tab to see which source it was credited to.