The symptom
Someone in the account asks Google Ads or Meta to bid toward profit instead of revenue, points at the order total in Shopify, and expects the number that reaches the ad platform to already mean profit. It does not. The value that lands in a conversion action is whatever was sent to it, and by default that is the order's revenue, full price paid, not what was left after the product cost and the eventual return.
The gap does not show up as an error. It shows up as a bidding algorithm that keeps optimizing toward orders that look identical on paper and are not, because one carried a wide margin and the other barely covered its own cost, and nothing in the feed told either platform the difference.
Fixing it is not a bidding setting. It is a data problem first: where the cost figure actually lives in Shopify, whether it was filled in before the sale happened, and whether the number that reaches Google Ads or Meta still matches reality by the time a return comes back.
Where the inputs actually live
Shopify does not compute profit unless it is told the cost of what was sold. That figure sits on the variant, one entry per variant in the shop's default currency, and Shopify's own developer documentation describes it as the merchant's per-unit cost, held on the InventoryItem behind the variant. Shopify's help documentation calls the field "cost per item" and defines it as how much it costs the merchant for the product or variant, excluding tax, shipping or anything else layered on top.
The field is manual, and it is not retroactive. Shopify's own profit reports documentation states it directly: "Profit is reported only for products and variants that had cost recorded at the time they were sold." A variant that shipped for six months before anyone filled in its cost has six months of orders with no profit figure to draw on at all, not an estimated one, none. Whatever feed is meant to carry profit back to an ad platform inherits that same hole, because there is no number to send for those orders.
Even once cost is filled in going forward, Shopify's own margin number moves with net sales, the same documentation states gross margin "is based on the net sales of the product, which takes into account any discounts or refunds you offered during the reporting period," a different figure from the margin shown on the product's own page at full price. Whatever value gets sent to an ad platform has to track that same net figure, not the sticker one, or it is describing a sale that did not happen.
Why returns arrive late
A return does eventually correct the number. The question is whether it arrives before the ad platform stops listening.
On the Shopify side, Shopify's own documentation on Shopify Payments refunds states a refund sits in a pending state for up to two business days internally, and it can then take the customer's own bank up to a further ten business days to actually show the refunded amount, with a refund still possible up to 120 days after the original transaction depending on the bank. That is Shopify's clock, and it already stretches well past a week before a refund is fully settled.
Google Ads runs a separate, shorter clock on the advertiser's side. Its own documentation on adjusting conversions states that "when retracting or restating conversion values, you have up to 7 days after they're first recorded for autobidding readability," with conversion adjustments overall, restating or retracting a value, accepted for up to 54 days. Restating a value requires the order ID and the name of the conversion action it belongs to, or the click ID and conversion time if no order ID was attached at the time.
Put the two clocks side by side. A refund that clears on day nine or day twenty is still well inside Google's 54-day window for correcting the books, so the reported number does eventually catch up. It has already missed the 7-day window Google names for autobidding readability, meaning the bidding algorithm made its own decisions off the original, pre-refund value in the meantime. The correction lands in the reporting. It does not reach back and undo what Smart Bidding already learned from the wrong number.
What good looks like
Neither platform computes profit on an advertiser's behalf, and neither is built to. Google Ads' own documentation on conversion value rules describes them as a way to adjust a conversion's value by geographic location, device or a first-party or Google audience list at auction time, a segment-level multiplier, not a per-order profit calculation. Meta's Conversions API parameter documentation is just as explicit on its side: value is "required for purchase events or any events that utilize value optimization" and "must represent a monetary amount," alongside a required currency. Both platforms will faithfully bid toward whatever value arrives. Getting that value to actually mean profit, cost per item subtracted, discounts and refunds accounted for, has to happen before it reaches either one.
That is a build-versus-buy decision, not a bidding decision. A packaged profit app reads the same cost-per-item field and layers ad spend and fees on top of it, which is faster to turn on and reasonable for a single store with clean cost data. It also means trusting a third party's margin math and its own timing for when a refund gets folded back in, which matters most exactly where the two clocks above already disagree. Building the calculation instead, on data an agency actually owns, means the profit figure and the refund timing are both visible and correctable, rather than arriving pre-packaged from somewhere else.
Archon Pixel is built for that second route. It streams a store's raw events, cost data included, first-party into a BigQuery table an agency owns, so the profit-per-order calculation is a metric defined once in that warehouse rather than a black box inside an app, and the value sent back to Google Ads or Meta is whatever that definition currently says, refunds and all.

FAQ
Does Shopify send profit data to Google Ads or Meta automatically?
No. Shopify's own profit reports are an internal analytics feature, not a feed to an ad platform. Getting a profit-adjusted value into a Google Ads conversion action or a Meta Purchase event requires sending it deliberately, through an offline conversion import or conversion adjustment on the Google Ads side, or the value field on a server-side Purchase event on Meta's.
What happens to orders where cost per item was never filled in?
Shopify's own documentation is explicit that profit is reported only where cost was recorded at the time of sale, so those orders simply have no profit figure to draw on, not a zero or an estimate. Anything built on top of that data inherits the same gap for the same orders.
If we backfill cost per item today, does it fix past orders?
No. Because Shopify only reports profit where the cost was recorded at the time of sale, a backfill changes what gets calculated for new orders going forward. It does not create a profit figure for orders that already shipped without one.
Can conversion value rules in Google Ads just handle this for us?
Not the profit part. Conversion value rules adjust a conversion's value by location, device or audience at auction time, a segment-level rule, not a per-order profit calculation drawn from that order's actual cost and refund status. The profit math still has to happen before a value reaches Google Ads at all.
Is there a way to make the refund timing match Google Ads' window?
Not by changing Google's side. The 7-day autobidding-readability window and the 54-day overall adjustment window are fixed by Google Ads. The only lever an agency has is shortening how long it takes a return to be recorded and reflected in the value sent back, which is a process question inside the store's own returns handling, not something Google Ads adjusts on request.
For the reporting side of this, which number actually belongs in a client's report, see POAS vs ROAS for agencies. A free tracking audit covers whether a store's profit data can actually reach Google Ads and Meta in a shape that means something.