Skip to content

Conversion Tracking  ·  Reconciliation

What conversion value should I send to Google and Meta, and how do I keep them reconciling?

Send one value, defined once, to both platforms: pre-tax, pre-shipping order subtotal in a single currency, fired server-side on the purchase event. Use the same definition for Google Ads conversion value and Meta's purchase value so the two reconcile against each other and against Shopify.

Pick one definition of “value” and send it everywhere

The reason Google and Meta disagree on revenue is almost never the platforms. It is that each one received a different number for the same order. One got the grand total with tax and shipping, the other got the subtotal. One got the value in USD, the other in the customer’s local currency. Once that happens, no amount of dashboard tweaking will make them line up.

So the first decision is what “value” means, and it has to be made once. My default is the pre-tax, pre-shipping order subtotal, in your store’s base currency. That is the number that maps cleanly to margin, and it is the number you can reconcile against Shopify’s “net sales” line later. Tax and shipping inflate ROAS without adding a dollar you can spend. If you send the grand total to one platform and the subtotal to the other, your blended ROAS is a fiction.

Whatever you choose, write it down. The definition is a one-line spec: “value = order subtotal, excluding tax, excluding shipping, excluding discounts already applied, in USD.” Every conversion tag, server event, and offline import then has to honor that one line.

Send the same number to Google and Meta

Google Ads expects a value and a currency on the conversion. Meta’s Purchase event expects value and currency in the same way. Send identical figures.

  • Google Ads: the value parameter on the purchase conversion action, with currency_code set explicitly. Do not leave currency to default. If you run a server-side setup, this is the value field on the Enhanced Conversions or the offline conversion upload.
  • Meta: the value and currency custom data on the Purchase event, sent through the Conversions API. The pixel-only value and the CAPI value must match, or Meta’s deduplication will keep one and you will not always know which.

If your store sells in multiple currencies, convert to a single base currency before the event fires, and tag the original currency in a separate parameter for your own records. Sending mixed currencies with no conversion is the most common reason a multi-currency store’s ROAS looks impossible.

Fire it server-side, with the order id as the key

Browser tags drop value constantly. Ad blockers, ITP, a customer who closes the tab on the thank-you page before the pixel loads. Every dropped purchase is a dollar of revenue the platform never sees, which is why ad-platform revenue almost always reads lower than Shopify.

Send the purchase from the server: Shopify’s order-created event, a server-side GTM container, or a direct Conversions API call. Server events fire whether or not the browser cooperated. On both platforms, attach a stable identifier so the browser event and the server event collapse into one:

  • Meta: event_id on both the pixel and the CAPI call. Same id, same order, deduplicated.
  • Google: the transaction_id (order id) on the conversion. This also lets you import corrections later without double-counting.

Use the actual order id, not a timestamp or a random string. When you reconcile a month later, the order id is what lets you trace a single sale across Shopify, Google, and Meta.

Decide how you handle refunds and discounts

Two edge cases break reconciliation more than anything else.

Discounts. If a customer uses a 20% code, do you report the value they paid or the full subtotal? Report what they paid. The platforms optimize toward the value you feed them, and you want them chasing real revenue, not list price. Pick one rule and apply it to both Google and Meta.

Refunds. A sale that gets refunded is still sitting in the platform as revenue unless you send a correction. Google accepts refund adjustments through the conversion-adjustment upload (a negative or retraction keyed to transaction_id). Meta’s handling is weaker, so many stores accept a known gap there and account for it in reporting rather than trying to claw each refund back. Whatever you do, document the rule, because a 10% refund rate quietly inflates reported ROAS by roughly 10% on both platforms.

Reconcile on a cadence, not a hunch

Once the same value is firing server-side to both platforms with an order id, the platforms will still not match Shopify exactly, and that is fine. Attribution windows differ, view-through differs, the platforms claim credit Shopify assigns elsewhere. The goal is not identical numbers. The goal is a stable, explainable gap.

Pull three numbers for the same date range: Shopify net sales, Google Ads conversion value, Meta purchase value. Track the ratio of each platform to Shopify week over week. When the value definition is clean, those ratios hold steady. When someone edits a tag, swaps the total for the subtotal, or breaks the currency field, the ratio jumps, and that jump is your alarm.

If you have not pinned the definition yet, start there before touching bids or budgets. A tracking-stack audit that nails the value spec, moves the events server-side, and sets up refund handling fixes more reporting noise than any optimization on top of a broken signal ever will.

Want this diagnosed in your account?

Same diagnosis,
run on your account.

Thirty minutes on the phone. I look at your spend, your tracking, and your search-term reports before the call. You walk out with a clear list of what is leaking and what to fix first.

Book a Call