Why it happens
The purchase value is revenue. A tracking app or pixel sends each purchase with its value: what the buyer paid for the products. Value-based bidding then looks for more buyers who pay a lot, whatever the margin on what they buy.
Meta takes profit as a second number on the same purchase. Meta's value optimization for profit lets you "optimize ad delivery toward the profit of a conversion rather than its revenue". You add the profit to your existing Purchase event in the field net_revenue, "The margin value of a conversion event". The purchase keeps its value. There is no separate currency for net_revenue: the currency of the Purchase applies to both.
Meta has thresholds before it optimizes for profit. Meta's overview lists at least 3 distinct positive profit values and at least 100 conversions over a one-week period, and recommends at least 30 daily conversions per campaign where possible. The ad set then uses the performance goal Maximize value of conversions, the conversion event Purchase and the conversion value Purchase profit.
Meta generally keeps the first event of a pair. When the browser pixel and the Conversions API send the same purchase, Meta's deduplication page says it generally prefers "the event that is received first" and discards the later one. Meta's value optimization guide asks for the same parameters on both sources. Meta does not document this case, so if another pixel sends the purchase first without a profit, the profit sent later from a server may be dropped with the duplicate.
Google Ads takes profit as its own conversion. A conversion action has one value, so profit goes to a separate conversion action next to your purchase. Google calls a secondary action "for observation only": it is reported in All conversions, not in Conversions, and not used for bidding unless it is part of a custom goal. Google asks you to wait 4 to 6 hours after creating a new conversion action before uploading conversions to it. Target ROAS on Search and Shopping needs at least 15 conversions in the past 30 days.
Google's own profit metrics are reports. Conversions with cart data, combined with the cost of goods sold in your Merchant Center feed, give Google Ads metrics "based on gross profit". Google's pages describe these as reporting metrics.
GA4 has no profit field. In GA4 the purchase value is the sum of price times quantity for the items, without shipping or tax, and its ecommerce metrics are revenue metrics. GA4's purchase event has no cost, profit or margin parameter. Putting profit in value would turn every GA4 revenue report into a profit report with a revenue label, so GA4 should stay on revenue.
Profit needs your product costs. In Shopify, Cost per item is "how much it costs you for the product or variant". You set it in the product's Price section, for each variant, or in the bulk editor or a CSV import. Shopify's own profit reports cover only products and variants "that had a cost recorded at the time they were sold". A product without a cost has no profit to send.
Check it yourself
- 1Your costs. In Shopify, open a few of your top-selling products and look at Cost per item on each variant. Products missing from Shopify's profit reports, such as Gross profit by product, likely had no cost when they sold.
- 2What Meta gets. In Meta Events Manager, open your pixel, find a recent Purchase and look at its parameters. With profit sent, net_revenue is there next to value and currency.
- 3Meta's thresholds. Count your purchases in Meta for the last 7 days: Meta's overview asks for at least 100 conversions over a one-week period before it optimizes for profit.
- 4Who sends first. In Events Manager, look at the Purchase event by source. If a browser pixel sends purchases without a profit, the profit sent from a server may be dropped in deduplication.
- 5Google Ads. In Goals > Conversions, check that the profit action is Secondary while you compare, and that your purchase action stays Primary. All conv. and All conv. value then count the purchase and the profit together.
- 6To test bidding on profit in Google Ads. Google uses a secondary action for bidding when it is part of a custom goal. Add a custom goal that holds only the profit action to one campaign, and leave your other campaigns on the purchase action. Give it 2 to 4 weeks. Its ROAS and conversion value will look lower, because they now count profit, not revenue, so set the target ROAS from the profit the campaign earns.
- 7When you switch Google to profit. If you make the profit action Primary to bid on it, make the purchase action Secondary in the same step, so Conversions does not count each order twice. Then review your target ROAS: a target set for revenue is too high for profit.
FAQ
What is profit as value?
Sending each order's profit to the ad platform, so value-based bidding learns from what you earn on an order, not only from what the buyer paid.
Does sending profit change the purchase value Meta sees?
Not with net_revenue. Meta's integration guide adds the profit to the existing Purchase event; the value stays as it was.
Why not send profit to GA4 too?
GA4's purchase value and its ecommerce reports are revenue. It has no profit field, so profit in the value would make your revenue reports show profit.
What happens to orders with products that have no cost?
They have no profit, unless your tool uses a margin you enter for products without a cost. Shopify's profit reports leave them out too.
Can profit be negative?
Meta's overview asks for at least 3 distinct positive profit values and does not say how it treats a loss. A tool can send a loss as 0, or send nothing for it.