Why it happens
Meta counts the value it was sent. Every Purchase event carries a value and a currency. Meta requires both for a purchase. Meta does not look up your order in Shopify. If the sender used the subtotal, Meta shows the subtotal.
Shopify's order total has several parts. An order total in Shopify includes the items after discounts, shipping and taxes. Shopify's sales report splits the same money into gross sales, discounts, shipping, taxes and total sales. A sender that uses the items only leaves out shipping and tax. A sender that uses the total includes them. Both are valid choices. They give different numbers.
Tax inside the price changes the subtotal. If your prices include tax, the subtotal already contains the tax. In a store that adds tax at checkout, it does not. The same setting in a sender gives a different result in each store.
Discounts depend on where they are read. A discount code lowers the order total. A sender that reads the item prices before the discount reports a higher value than the buyer paid.
Refunds stay in Meta. Meta's list of standard events has no refund event. A refunded order keeps its purchase value in Meta. In Shopify a refund lowers total sales on the day it was processed, so the two totals drift apart over time.
Meta shows only purchases it gives to your ads (see 27-meta-attribution-setting-changes-purchases.md). The value in Ads Manager covers the purchases Meta attributes to your ads under your attribution setting. Your Shopify total covers every order. Compare a full week, and compare purchase counts first.
Currency. In a store with several currencies, the value can be sent in one currency and labelled with another. That has its own page: Multi-currency Shopify store: purchase value in the wrong currency.
Check it yourself
- 1In Shopify admin > Orders, open one recent order. Write down the subtotal, the discount, shipping, taxes and the total.
- 2In Meta Events Manager > Data sources > your pixel > Test events, place a test order with a discount code and paid shipping. Open the Purchase event and read the value and currency parameters it received. Match the value to one line of your order: the total, the subtotal or the items without tax.
- 3If the Purchase event arrives twice, from the browser and from the server, read the value of each copy. Two senders can use two definitions.
- 4In Shopify admin > Settings > Taxes and duties, check whether your prices include tax.
- 5In Shopify admin > Analytics > Reports, open the sales report for the last 7 full days. Note gross sales, discounts, shipping, taxes, sales reversals and total sales.
- 6In Meta Ads Manager > Columns > Customize columns, add the purchases and the purchases conversion value. Set the same 7 days. Compare the value with the Shopify line that matches what your events send.
- 7Check the refunds in those 7 days in Shopify. Meta keeps those orders at their full value.
What Meta needs with each purchase, value and currency included, is in the Meta Conversions API on Shopify.
FAQ
Should Meta get the total or the subtotal?
Meta asks for a value and a currency and leaves the definition to you. Pick one and keep it. The total is what the buyer paid. If you compare return on ad spend with your margin, the subtotal without tax is closer to what you earn.
Why is Meta's value higher than my Shopify net sales?
Net sales in Shopify leave out shipping and tax, and subtract discounts and sales reversals. Meta keeps what was sent at the time of the purchase, refunds included.
Can I send refunds to Meta?
Meta's standard events do not include a refund. The purchase value in Meta stays as it was sent.
Will the value ever match to the cent?
Not across a period. Attribution, refunds and timing differ. One order can match exactly when you compare the value Meta received with the right line of that order.