Skip to content

Answer library  /  Conversion Tracking  ·  Reconciliation

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

Send Google and Meta the same number: the order subtotal after discounts, before tax and shipping, in one currency, with the order ID, server-side where possible. Then check what the value column holds. On two of three stores I measured from May to August 2026, 19.8% to 25.8% of reported conversion value was cart value.

Pick one definition of “value” and send it everywhere

When Google and Meta disagree on revenue, the first thing I check is whether 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 spec is the order subtotal after discounts, before tax and shipping, in your store’s base currency, sent with the order ID. That’s the number closest to what the customer paid you for the goods, and it maps to margin. 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.

Reconcile gross to gross. The platforms receive the value at the moment of purchase, so compare them against the same orders’ subtotals in Shopify before any refunds come out, and handle refunds and cancellations as a separate step. Comparing platform value to a Shopify figure that has already netted out returns makes a healthy setup look inflated.

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

Then check the platform side, because a setting can change the number after it arrives. On one Shopify account I took over, a $32.99 order showed in Google Ads as $148.95. The dataLayer was clean. The prior agency had turned on Customer Lifecycle Value Optimization with a hardcoded $115.96 added to every new-customer conversion, and Smart Bidding had chased the padded number for nine months. The platform can also be aimed at the wrong event entirely: when I audited Emma Grace Home, its Google Ads was optimizing toward add-to-carts instead of buyers.

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. Don’t leave currency to default. Enhanced conversions don’t carry a value of their own. They attach hashed customer data to the conversion so Google can match it, and the value still rides on the conversion tag or, for offline conversions, on the import row.
  • 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 won’t 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. Either way, send the currency code on every event. A value that arrives without one gets read in the account’s default currency, so an order in yen can land as the same number of dollars.

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 revenue the platform never sees, which is one reason ad-platform revenue can read 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 need a written rule.

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. On the one store in my Ecommerce Tracking Accuracy Benchmark where I could read the order table, about a sixth of the orders in the window were refunded and about a tenth were cancelled, and the ad platform got no restatement for any of them. That’s one store, and the platform’s purchase count still included orders the store no longer held.

Cancellations follow the same rule as refunds. Send the subtotal after discounts at purchase, then correct for cancellations and refunds in their own step, so you always know which number moved and why.

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’s fine. Attribution windows differ, view-through differs, the platforms claim credit Shopify assigns elsewhere. The goal isn’t identical numbers. The goal is a stable, explainable gap.

Before you trust the ratio, confirm the value column is measuring revenue at all. When I measured three ecommerce accounts for the benchmark, from May to August 2026, 19.8% to 25.8% of reported conversion value on two of the three was cart value rather than purchase revenue. A ratio built on that number is stable and wrong.

How much of the value column was cart value

Three stores, May to August 2026

Three bars, one per store, splitting reported conversion value into add-to-cart and begin-checkout value and everything else: Store A 25.8% add-to-cart and begin-checkout value, Store B 0.0%, Store C 19.8%. The remainder is all other conversion value.

On two of three stores I measured from May to August 2026, 19.8% to 25.8% of reported conversion value came from add-to-cart and begin-checkout events, not purchases (N = 3).

Shopify is the ledger. The platform numbers are for steering inside each platform, and the ratio is how you catch them drifting. Pull three numbers for the same date range: Shopify order subtotals after discounts and before refunds, 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 haven’t pinned the definition yet, start there before touching bids or budgets. On one $40K-a-month inherited account, fixing the value signal along with the rest of the stack made reported ROAS fall once the inflated value came out, while contribution-margin ROAS rose. The dashboard number looked worse and the business number got better.

When to bring me in

Bring me in when Google Ads and Meta report more revenue than your store took, when the value column may be carrying cart value, or when refunds and discounts never make it back to the platforms. I’ll compare the value each platform reports against the order totals you pull from your store.

I'm Conner Crowe, and I write every audit myself. Send the free audit request and add me as a read-only user, and within 24 hours of access you'll have a written read on which numbers to trust and what to fix first. No call needed, and nothing in your account or store changes.

Request a free Google Ads audit

See how I fix conversion tracking.

See it in Google Ads

Where to look in your account.

What Google is allowed to count

Goals, then Summary, then View all conversion actions

  1. Tracking status. Inactive or Needs attention means the tag hasn’t recorded anything lately, so check it before you trust the totals.
  2. Primary or Secondary. Only Primary actions feed Smart Bidding; Secondary ones are reported and ignored by the bidding.
  3. Count. One per click for leads, Every for purchases. A lead form set to Every counts a double-submit twice.
  4. Included in account-level goals. Yes is what the campaigns actually optimize toward.

From my own Google Ads account, October 2026. Tap or click the screen to see it full size.

Tools for this diagnosis

All my free tools

Related questions

Back to the full conversion tracking: the diagnosis library

Want your tracking checked?

Same check,
run on your tracking.

Add me as a read-only user and I'll write the audit myself: which of your numbers to trust and what to fix first, 5 to 7 pages, back within 24 hours of access. No call needed. If you'd rather talk first, a call is open too.