- Meta value optimization shows ads to people likely to bring the most conversion value, and it weighs each conversion in proportion to the value you send.
- When that value is revenue, a $400 order with a 12% margin counts for more than a $90 order with a 60% margin, so revenue can grow while profit falls.
- ROASaurus can send a ContributionMargin custom event next to the Purchase, valued at the order's gross profit, which you choose as the conversion event in Ads Manager.
- Meta recommends at least 100 conversion events with 5 distinct values in 14 days and a test of at least 3 weeks, so this suits stores with steady order volume.
- Profit optimization only changes something when margins differ between orders; with one margin for everything, profit is a fixed share of revenue.
Meta value optimization, the Maximize value of conversions performance goal, shows your ads to the people most likely to bring in a high conversion value. If that value is revenue, Meta chases large orders, even when they leave little profit. If you send each order's gross profit as the conversion value instead, Meta optimizes for the money you keep.
This guide explains how value optimization works, why revenue as the value favors low-margin orders, how ROASaurus sends a profit value to Meta, how to set up a campaign on it, and the trade-offs: volume, the learning phase and reporting.
What is Meta value optimization?
A Sales campaign that maximizes the number of conversions looks for the people most likely to buy at the lowest cost. Value optimization looks for the people most likely to bring in the highest total conversion value. Meta may then get fewer conversions, at a higher cost each, if their total value is higher.
To use it, you send a value and a currency with a conversion event, through the Conversions API (Meta lists it as required) and the Meta pixel. Meta's integration guidance says its system values conversions in proportion to the value you send back. In practice, whatever number you put in the value field is what Meta tries to maximize.
Value optimization works for standard events such as Purchase and for custom events on the Sales objective. The value does not have to be revenue. Meta describes custom event values as a way to optimize for any internal goal you define.
Why does optimizing for revenue favor low-margin orders?
Take a store with two product lines. It resells espresso machines with a 12% gross margin and sells its own coffee subscription box with a 60% gross margin.
With revenue as the value, Meta treats machine buyers as the valuable ones and looks for more of them. Here is what that can look like for the same $1,000 of ad spend:
| Illustrative month | Optimized for revenue | Optimized for gross profit |
|---|---|---|
| Ad spend | $1,000 | $1,000 |
| Orders | 6 machines, 2 boxes | 2 machines, 18 boxes |
| Revenue | $2,580 | $2,420 |
| ROAS | 2.58 | 2.42 |
| Gross profit | $396 | $1,068 |
| POAS | 0.40 | 1.07 |
| Profit after ads | −$604 | +$68 |
Ads Manager would show the first campaign as the better one, because its ROAS is higher. Only the gross profit shows that it loses money. That gap is what POAS (profit on ad spend) measures, and it is the same reason a single break-even ROAS for a whole store hides losses.
How ROASaurus sends a profit value to Meta
ROASaurus does this with one setting. In Tracking & platforms, open the settings of your Meta pixel and tick POAS bidding: also send each order's contribution margin. From then on, every Purchase that ROASaurus sends to the Conversions API with a profit figure is joined by a second event in the same request:
- Name:
ContributionMargin, a custom event. - Value: the order's gross profit, in the same currency as the Purchase.
- Event id: the purchase id with
cm-in front, for examplecm-order-1042. The event is sent only from the server, so there is no browser copy to deduplicate. - Customer information: the same hashed contact data, IP address, user agent,
fbpandfbcas the Purchase, so Meta can match it just as well.
The Purchase event itself does not change. It still carries the order value, so purchase reporting in Ads Manager keeps working.
{
"event_name": "ContributionMargin",
"event_time": 1792929600,
"event_id": "cm-order-1042",
"action_source": "website",
"event_source_url": "https://yourstore.com/checkouts/thank-you",
"user_data": {
"em": ["<SHA-256 of the normalized email>"],
"ph": ["<SHA-256 of the normalized phone>"],
"client_ip_address": "203.0.113.24",
"client_user_agent": "Mozilla/5.0 (iPhone; ...)",
"fbp": "fb.1.1792928400000.1234567890"
},
"custom_data": { "value": 54.00, "currency": "USD", "order_id": "1042" }
}The value comes from profit analytics, with the same costs you see in your profit reports:
- Revenue
- The order revenue without VAT or sales tax, including the shipping the customer paid, with the default settings.
- Refunds
- Refunds already recorded when the event is sent.
- COGS
- The product cost of the items, from your product costs.
- Shipping
- What you pay the carrier for the order.
- Fees
- Payment and order fees.
- Handling
- Packing and other per-order handling costs.
For the box order: $90 − $27 − $5 − $2.70 − $1.30 = $54.00. An order that loses money is sent as 0, never as a negative value.
Three details decide how good the signal is:
- The value is calculated when the purchase is sent, shortly after the order arrives. A refund that comes later does not change the value Meta already has.
- Missing product costs count as zero unless you set Estimate missing costs at % of price in Cost settings. A product without a cost looks far more profitable than it is, and Meta would chase it. Fill in Product costs before you switch.
- No profit figure, no extra event. If ROASaurus has no profit figure for an order, it sends the Purchase alone.
Profit figures exist for orders in profit analytics: Shopify orders, and orders sent to the ROASaurus orders API, which the WooCommerce plugin uses. Orders that come in through the other webshop connectors have no profit figure yet, so for those stores ROASaurus sends the Purchase without a ContributionMargin event.
How to set up a profit-optimized campaign
- Enter your costs
Add product costs, shipping, payment fees and handling in profit analytics. Meta learns from these numbers. Profit analytics marks products and orders that have no cost.
- Turn on POAS bidding
In Tracking & platforms, tick the POAS bidding option on the Meta pixel. Check the Event log: each Purchase request should now also hold a ContributionMargin event.
- Review the event in Events Manager
ContributionMargin appears next to Purchase. Meta requires a custom event to be reviewed in Events Manager before you can maximize value for it.
- Wait for enough events
For standard and custom website events, Meta recommends at least 100 conversion events with at least 5 distinct values over the past 14 days. The option can take a few weeks to appear after that.
- Create the campaign
Use the Sales objective with Website as the conversion location, Maximize value of conversions as the performance goal and ContributionMargin as the conversion event. Start without a ROAS goal, as Meta recommends for a first test.
- Test it for at least three weeks
Run it next to your current campaign, ideally as an A/B test, with a budget for at least 50 conversions per week. Compare profit after ads, not ROAS.
What are the trade-offs?
- Meta weighs each order by what it earns you, not by its order value
- Low-margin products stop pulling the budget toward them
- The ContributionMargin value in Ads Manager is gross profit, so value ÷ spend is close to POAS
- Enough volume: 100 events with 5 distinct values in 14 days
- A new learning phase and a test of three weeks or more
- Possibly fewer conversions, at a higher cost per result
- A signal that is only as good as your cost data
Volume
ContributionMargin fires once per order, so it never has more volume than your server-side purchases. A store with 15 orders a week will not reach Meta's recommended 100 events in 14 days, and a campaign that cannot exit learning stays unstable. Meta also advises a budget that covers at least 50 conversions per week.
The learning phase
A new ad set, or a significant edit to an existing one, starts a learning phase. Meta says an ad set usually exits it after about 50 results in the week after the last significant edit. During learning, cost per result is usually higher and results are less stable. Meta warns that value optimization can also show a higher cost per result and fewer total conversions, so do not judge it in the first week.
Reporting
Keep the Purchase event as it is. Your purchase counts, revenue and ROAS columns in Ads Manager still come from it. The Results column follows the event the ad set optimizes for, so it counts ContributionMargin events, and their conversion value is gross profit. Divide that value by spend and you get close to POAS, with break-even at 1.0. It is slightly too high when some orders lose money, because those are sent as 0. If you later add a ROAS goal to this ad set, check which value Ads Manager uses for it. If it uses the ContributionMargin value, a goal of 1.0 means break-even on gross profit, not a revenue ROAS of 1.0. Try your own numbers in the POAS calculator.
What about Meta's own profit option?
Meta also documents a profit value type for value optimization. There, you send the profit of a purchase in a net_revenue field on the Purchase event, next to the purchase value, or you set an estimated_margin per product in your catalog for Advantage+ catalog ads. In the ad set you then choose Purchase as the event and Purchase profit as the conversion value.
Meta lists its own requirements for that option: at least 3 distinct positive profit values and at least 100 conversions over one week, with at least 30 conversions per day per campaign recommended where possible. It also says not to delay a purchase event while you wait for a profit value. ROASaurus does not fill net_revenue. It sends the separate ContributionMargin event described above, which uses Meta's standard value optimization for custom events. The idea and the trade-offs are the same: Meta can only optimize for profit if it receives a profit value with every order.
Is profit optimization right for your store?
It is worth testing when three things are true. Your margins differ clearly between products or orders. You send enough purchases to Meta through the Conversions API to meet the volume requirements. And your product costs, shipping and fees are filled in, so the value is close to the truth. If one of these is missing, fix it first: a revenue campaign with a correct break-even ROAS is better than a profit campaign that learns from wrong costs.
To check how much a profit signal could change, look at gross profit per product line in profit analytics. If your best-selling products by revenue are not your best products by gross profit, a revenue value points Meta at the wrong ones. For how the Purchase event and its deduplication work, see our Meta Conversions API guide, and the Meta integration page lists everything ROASaurus sends.
Sources
- Meta Business Help Center: About maximizing the value of conversions using the Sales campaign objective
- Meta Business Help Center: Requirements to use Maximize value of conversions
- Meta for Developers: Integration Guidance: Value Optimization
- Meta for Developers: Value optimization for profit: overview
- Meta Business Help Center: About the learning phase