Profit and metrics

Meta value optimization for profit, not revenue

Meta value optimization can chase profit instead of revenue. Learn how to send gross profit as the conversion value, what Meta requires and the trade-offs.

·9 min read·By the ROASaurus team

Key takeaways
  • 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.

Example store: the value Meta sees per order
Value as revenueValue as gross profit
Espresso machine (resold)
$400
$48
Subscription box (own brand)
$90
$54
With revenue as the value, one machine order is worth 4.4 box orders to Meta. With gross profit, a box order is worth more than a machine order.

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 monthOptimized for revenueOptimized for gross profit
Ad spend$1,000$1,000
Orders6 machines, 2 boxes2 machines, 18 boxes
Revenue$2,580$2,420
ROAS2.582.42
Gross profit$396$1,068
POAS0.401.07
Profit after ads−$604+$68
An illustrative example. The revenue campaign has the higher ROAS and loses $604. The profit campaign has a lower ROAS and makes $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 example cm-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, fbp and fbc as 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.

Order paidBox order, $90 without tax
Profit analyticsGross profit $54 after costs
Two server eventsPurchase $90 and ContributionMargin $54
Ads ManagerAd set maximizes ContributionMargin value
Purchase keeps the revenue for reporting. ContributionMargin carries the gross profit that the ad set optimizes for.
The ContributionMargin event next to the Purchase (trimmed)
{
  "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:

Value sent=revenue − refunds − COGS − shipping − fees − handling
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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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?

What you gain
  • 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
What it costs
  • 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
Profit optimization replaces a simple revenue signal with one that is closer to what you earn, but it needs volume and correct costs.

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

  1. Meta Business Help Center: About maximizing the value of conversions using the Sales campaign objective
  2. Meta Business Help Center: Requirements to use Maximize value of conversions
  3. Meta for Developers: Integration Guidance: Value Optimization
  4. Meta for Developers: Value optimization for profit: overview
  5. Meta Business Help Center: About the learning phase

In ROASaurus

Keep reading

Profit and metricsBreak-even ROAS: the minimum ROAS your ads needBreak-even ROAS is the ROAS at which ads pay for themselves. Learn the formula, work through examples and set a target ROAS for each product line.Profit and metricsCohort analysis for ecommerce: are new customers worth it?Cohort analysis for ecommerce: group customers by first-order month, read retention and gross profit per customer, and avoid the common mistakes.Profit and metricsContribution margin in ecommerce: CM1, CM2, CM3 explainedContribution margin in ecommerce explained: CM1, CM2 and CM3, a worked example from revenue to net profit, and which profit layer fits which decision.
FAQ

Questions, answered

Can Meta optimize ads for profit instead of revenue?

Yes, if you send a profit value as the conversion value. You can send it as a custom event with the profit as its value, which is what ROASaurus does with its ContributionMargin event, or in Meta's net_revenue field on the Purchase event.

Does a profit event replace the Purchase event?

No. ROASaurus keeps sending Purchase with the order value, and ContributionMargin goes out next to it with its own event id. Purchase reporting in Ads Manager keeps working.

How many orders do I need for value optimization on a custom event?

For website events, Meta recommends at least 100 conversion events with at least five distinct values over the past 14 days. It also advises a budget that covers at least 50 conversions per week.

What value does ROASaurus send for an order that loses money?

It sends 0. The ContributionMargin event never carries a negative value, so Meta treats a loss-making order as an order that earned nothing.

Will my ROAS in Ads Manager go down?

It can. Meta warns that value optimization may bring fewer conversions at a higher cost per result, and a campaign that favors high-margin orders may have a lower revenue ROAS. Judge it on gross profit and profit after ads.

Every sale, traced to the ad that earned it

Server-side tracking, profit and lifetime value in one app. 14-day free trial, no credit card.

Start your free trial →