# Set a max price for marketing messages (BETA)
**Note:** The max price feature on the MM API for WhatsApp enables businesses to **increase ROI** and have **more control over their marketing message spend**. Max price enters open beta on October 1, 2026. View our [explainer asset on Highspot](https://meta.highspot.com/items/69aedbc000c74039fc1633d7#1) for go-to-market details.
## What is a max price?
In 2026, Meta is introducing new pricing features on the Marketing Messages API for WhatsApp to enable businesses to control and optimize spend for their marketing messaging campaigns.
The first pricing feature allows you to **set a maximum price (max price) per marketing message delivery; when a max price is set, Meta will charge that max price or lower for delivery**. Businesses can choose to set a max price the same as, lower than, or higher than the published rate to achieve their objectives per campaign.
- *Lower costs while maintaining delivery rates similar to current WhatsApp campaigns*, by setting max prices the same as published rates.
- Reach more customer cohorts on WhatsApp at lower cost, by setting max prices lower than published rates.
- Increase delivery rates during periods such as holidays and peak sales periods, by setting max prices higher than published rates.
The second pricing feature is the **reach estimation tool**, which helps businesses set the right max price by helping them understand estimated delivery rates and costs at different max prices.
### Max price explainer
The max price feature allows you to set the maximum price you are willing to pay per message delivery. Meta charges your max price or lower. In the API, you express this as a `bid_amount` value per 1,000 deliveries within the `optimization_spec` object.
- [Max price explainer PDF](https://meta.highspot.com/items/69c54bf9ee04590bb215a1b5?lfrm=srp.1#1)
## Phased roll-out of the max price feature
The max price feature rolls out in three phases:
1. Limited Beta starting **May 15, 2026** -- Any partner and any directly integrated business can integrate and use the max price feature and reach estimation tool. Each partner can enable these features for a limited number of clients.
2. Open Beta starting **October 2026** -- Any partner can enable these features for all their clients.
3. General Availability (GA) as of **Q2 2027** -- The max price feature will become required in eligible geographies and fixed, published rates for marketing messages will only apply on the Cloud API.
## Before you begin
To use the max price feature, you must:
## Recommendations
**Note:** Max price is an early-stage feature; performance may vary as Meta's systems learn and improve.
1. **Set your max price at the template level.** The `bid_amount` in `optimization_spec` is what Meta's delivery system optimizes against. Setting the right max price when you create the template gives the system the best signal for delivery optimization.
2. **Set `bid_amount` to your highest acceptable price and use `per_message_bid_multiplier` to scale down.** Set the template's `bid_amount` to the highest amount you are willing to pay per 1,000 deliveries, then apply a `per_message_bid_multiplier` of less than 1 to lower the effective max price for individual messages. This gives the delivery system the widest range to optimize against and generally improves overall performance.
For example, if you set a template's `bid_amount` to 100,000 and apply a multiplier of 0.5 to a message, the effective max price for that message is 50,000.
3. **Ramp up traffic gradually.** When sending messages with a new max price template for the first time, increase volume slowly before sending at scale. This aligns with [Template pacing](https://developers.facebook.com/documentation/business-messaging/whatsapp/templates/template-pacing) best practices and helps the delivery system optimize effectively.
4. **Start with A/B tests.** This helps you assess the impact of different bidding rates on your delivery rates and cost per delivery. Run a four-arm test (10,000 send requests per arm) with a similar audience and time window, with the following conditions:
- Arm A: No max price set
- Arm B: Max price set at rate card
- Arm C: Max price set at 1.5x rate card (1.2x for India and Saudi Arabia)
- Arm D: Max price set at 0.9x rate card
## Create templates with max price
Use the [Message Templates API](https://developers.facebook.com/documentation/business-messaging/whatsapp/reference/whatsapp-business-account/message-template-api#post-version-waba-id-message-templates) to set a maximum price and include the `optimization_spec` object in the request body.
**Note:** `optimization_spec` replaces `bid_spec` as of June 18, 2026. `bid_spec` continues to be accepted until July 31, 2026, after which it is no longer supported. The `bid_amount` and `bid_strategy` fields are identical in both objects.
### Request syntax
```html
curl 'https://graph.facebook.com/<API_VERSION>/<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates' \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '
{
"name": "seasonal_sale_promo",
"category": "MARKETING",
"language": "en",
"components": [
{
"type": "BODY",
"text": "Shop our seasonal sale! Up to 50% off selected items."
}
],
"optimization_spec": {
"bid_amount": <BID_AMOUNT>,
"bid_strategy": "LOWEST_COST_WITH_BID_CAP",
"bid_country_multiplier_overrides": { "IN": 1.2, "MX": 0.8 }
}
}'
```
If `optimization_spec` is not included, the template uses standard rate card pricing.
### Request parameters
| Placeholder | Description | Example Value |
| --- | --- | --- |
| `<ACCESS_TOKEN>`<br><br>_String_ | **Required.**<br><br>[System token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#system-user-access-tokens) or [business token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-integration-system-user-access-tokens). | `EAAA...` |
| `<API_VERSION>`<br><br>_String_ | **Optional.**<br><br>Graph API version. | v26.0 |
| `<WABA_ID>`<br>_String_ | **Required.** | `102290129340398` |
| `<BID_AMOUNT>`<br><br>_int32_ | **Required.** | `87000` |
| `<BID_STRATEGY>`<br><br>_Enum_ | **Required.**<br><br>The bid strategy to use. Currently supports only `LOWEST_COST_WITH_BID_CAP`. | `LOWEST_COST_WITH_BID_CAP` |
| `bid_country_multiplier_overrides`<br><br>_Object (map)_ | **Optional.**<br><br>Map of destination country to a bid multiplier, set inside `optimization_spec`. Keys are ISO 3166-1 alpha-2 country codes; each value is the multiplier applied to `bid_amount` for sends to that country. Countries you do not list use a multiplier of `1.0` (the unmodified `bid_amount`).<br><br>**Constraints on `bid_country_multiplier_overrides`**<br><br>- Up to **50** entries.<br>- Each multiplier must be **greater than `0` and at most `10`**.<br>- Keys must be valid **ISO 3166-1 alpha-2** country codes (for example, `MX`, `IN`, `BR`). | `{"IN": 1.2, "BR": 1.5, "MX": 0.8}` |
### Calculating max price amounts
**Example**: To set a max price of ₹0.87 per delivery:
- Convert to paise: 0.87 Rupees = 87 paise
- Multiply by 1,000: 87 x 1,000 = 87,000
Set `bid_amount` to `87000`.
**Example**: To set a max price of $0.05 USD per delivery:
- Convert to cents: $0.05 = 5 cents
- Multiply by 1,000: 5 x 1,000 = 5,000
Set `bid_amount` to `5000`.
### How "optional" per-country bid multipliers work
A per-country bid multiplier scales the template's `bid_amount` (max price) for a specific destination country, so you can bid more or less in some countries without creating a separate template for each one. You set the multipliers in the `bid_country_multiplier_overrides` map inside `optimization_spec`.
When a message is sent, Meta determines the recipient's country from their phone number and applies the matching multiplier to the template's `bid_amount` to produce the effective bid for that message:
Effective bid = `bid_amount` x `country_multiplier`
If the recipient's country is not listed in the map, the multiplier is `1.0`, so the template's `bid_amount` is used unchanged. The effective bid is the maximum price Meta uses for that delivery — as with any max price, Meta charges that amount or lower per message delivered. A higher multiplier raises the max price for that country (which can increase delivery rates and cost per delivery); a lower multiplier lowers it.
**Example**
`"bid_country_multiplier_overrides": { "IN": 1.2, "MX": 0.8 }`
The effective bid then depends on where each message is sent:
| Recipient country | Multiplier applied | Effective bid (per 1,000 messages delivered) |
| --- | --- | --- |
| India (`IN`) | 1.2 | 1000 x 1.2 = **1,200** |
| Mexico (`MX`) | 0.8 | 1000 x 0.8 = **800** |
| Brazil (`BR`) — not listed | 1.0 (default) | 1000 x 1.0 = **1,000** |
## Retrieve max price information
Use the [Template API](https://developers.facebook.com/documentation/business-messaging/whatsapp/reference/whatsapp-business-account/message-template-api#get-version-template-id) to get the max price setting on an existing template by querying the `optimization_spec` field.
**Note:** Query `optimization_spec` as of June 18, 2026. Querying `bid_spec` continues to return the max price configuration until July 31, 2026, after which only `optimization_spec` is supported.
### Request syntax
```html
curl 'https://graph.facebook.com/<API_VERSION>/<TEMPLATE_ID>/?fields=optimization_spec' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
```
### Request parameters
| Placeholder | Description | Example Value |
| --- | --- | --- |
| `<ACCESS_TOKEN>`<br><br>_String_ | **Required.**<br><br>[System token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#system-user-access-tokens) or [business token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-integration-system-user-access-tokens). | `EAAA...` |
| `<API_VERSION>`<br><br>_String_ | **Optional.**<br><br>Graph API version. | v26.0 |
| `<TEMPLATE_ID>`<br><br>_String_ | **Required.**<br><br>ID of the WhatsApp message template. | `1733678867511493` |
### Example response
```json
{
"optimization_spec": {
"bid_strategy": "LOWEST_COST_WITH_BID_CAP",
"bid_amount": 87000,
"bid_country_multiplier_overrides": [
{"key": "IN", "value": 1.2},
{"key": "BR", "value": 1.5},
{"key": "MX", "value": 0.8}
]
},
"id": "1733678867511493"
}
```
**Note:** **Reading `bid_country_multiplier_overrides`.** When you **read** `bid_country_multiplier_overrides`, it is returned as a list of `{"key": <country_code>, "value": <multiplier>}` objects. When you **write** it, you pass a map (`{"IN": 1.2}`). This is expected: the read and write formats differ. The field returns an empty list if the template has no multipliers set.
## Update max price for templates
Use the [Template API](https://developers.facebook.com/documentation/business-messaging/whatsapp/reference/whatsapp-business-account/message-template-api#post-version-template-id) to update the max price setting on an existing template.
- **Rate card pricing:** The template has no maximum price configured and uses the applicable published rate.
- **Max price:** The template has a maximum price per 1,000 message deliveries.
**Note:** Send updates using `optimization_spec` as of June 18, 2026. Updates sent with `bid_spec` continue to be accepted until July 31, 2026, after which only `optimization_spec` is supported.
Other constraints follow the standard [template editing limits](https://developers.facebook.com/documentation/business-messaging/whatsapp/templates/overview):
- **Approved templates**: Up to 100 edits per hour, 2,400 per day. Content edits still follow the existing limit of 1 per day and 10 per 30 days.
- **Rejected or paused templates**: Unlimited edits
### Set or update a max price
Set both `bid_amount` and `bid_strategy` in `optimization_spec`. Use the same request to change the amount when the template already has a max price.
#### Request syntax {#set-or-update-max-price-request-syntax}
```html
curl 'https://graph.facebook.com/<API_VERSION>/<TEMPLATE_ID>/' \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"optimization_spec": {
"bid_strategy": "LOWEST_COST_WITH_BID_CAP",
"bid_amount": <BID_AMOUNT>,
"bid_country_multiplier_overrides": { "IN": 1.4, "MX": 0.9 }
}
}'
```
### Remove a max price and return to rate card pricing
Set both `bid_amount` and `bid_strategy` to `null`. This clears the template-level maximum price and returns the template to standard rate card pricing.
This action also clears all `bid_country_multiplier_overrides`, if any. If you later switch back to max price, include any country overrides you want to restore.
#### Request syntax {#remove-max-price-request-syntax}
```html
curl 'https://graph.facebook.com/<API_VERSION>/<TEMPLATE_ID>/' \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"optimization_spec": {
"bid_strategy": null,
"bid_amount": null
}
}'
```
**Warning:** Omitting `optimization_spec` from an update does not request a pricing-mode change. To return to rate card pricing, `optimization_spec` must contain exactly `bid_amount` and `bid_strategy`, with both explicitly set to `null`. Do not include any other fields.
### Request parameters
| Placeholder | Description | Example Value |
| --- | --- | --- |
| `<ACCESS_TOKEN>`<br><br>_String_ | **Required.**<br><br>[System token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#system-user-access-tokens) or [business token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-integration-system-user-access-tokens). | `EAAA...` |
| `<API_VERSION>`<br><br>_String_ | **Optional.**<br><br>Graph API version. | v26.0 |
| `<TEMPLATE_ID>`<br><br>_String_ | **Required.**<br><br>ID of the WhatsApp message template. | `1733678867511493` |
| `<BID_AMOUNT>`<br><br>_int32_ | **Required for max price.** | `5000` |
| `<BID_STRATEGY>`<br><br>_Enum_ | **Required for max price.**<br><br>The bid strategy to use. Currently supports only `LOWEST_COST_WITH_BID_CAP`. | `LOWEST_COST_WITH_BID_CAP` |
| `bid_country_multiplier_overrides`<br><br>_Object (map)_ | **Optional.**<br><br>Map of destination country to a bid multiplier (ISO 3166-1 alpha-2 keys). Same constraints as create: up to 50 entries, each multiplier greater than `0` and at most `10`.<br><br>**Update behavior for `bid_country_multiplier_overrides`**<br><br>- Whenever you send `optimization_spec` to set or update a max price, you must include `bid_amount` and `bid_strategy`.<br>- When setting or updating a max price, **omit** `bid_country_multiplier_overrides` to keep the current map unchanged.<br>- When setting or updating a max price, send an **empty object** (`{}`) to remove all overrides.<br>- A non-empty map **fully replaces** the existing map — it is not merged with it. Send the complete set of countries you want each time.<br>- When returning to rate card pricing, omit this field. The reset clears all overrides even when this field is omitted. | `{"IN": 1.4, "MX": 0.9}` |
### Update behavior while using max price
| Current pricing mode | Update | Result |
| --- | --- | --- |
| Rate card pricing | Non-null `bid_amount` and supported `bid_strategy` | The template switches to max price. |
| Max price | Different non-null `bid_amount` and supported `bid_strategy` | The template remains in max price mode with the updated amount. |
| Max price | Both bid fields explicitly set to `null` | The template switches to rate card pricing and clears all country multiplier overrides. |
| Either mode | `optimization_spec` omitted | The pricing mode does not change. |
### Common errors
## Adjust max price when sending messages
**Warning:** The message-level max price multiplier is subject to change during the beta period.
Use the [Marketing Messages API](https://developers.facebook.com/documentation/business-messaging/whatsapp/reference/whatsapp-business-phone-number/marketing-messages-api-for-whatsapp) to apply a multiplier at sending time to adjust the template-level max price for individual messages. This allows you to adjust the max price for individual messages without editing the template.
### Request syntax
```html
curl 'https://graph.facebook.com/<API_VERSION>/<WHATSAPP_BUSINESS_PHONE_NUMBER_ID>/marketing_messages' \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"recipient_type": "individual",
"messaging_product": "whatsapp",
"to": "<WHATSAPP_USER_PHONE_NUMBER>",
"type": "template",
"template": {
"name": "seasonal_sale_promo",
"language": {
"code": "en"
}
},
"bid_spec": {
"per_message_bid_multiplier": "<PER_MESSAGE_BID_MULTIPLIER>"
}
}'
```
In this example, the multiplier of 1.5 increases the template's `bid_amount` by 50%. If the template's `bid_amount` is 2000, the effective max price for this message becomes 3000.
### Request parameters
| Placeholder | Description | Example Value |
| --- | --- | --- |
| `<ACCESS_TOKEN>`<br><br>_String_ | **Required.**<br><br>[System token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#system-user-access-tokens) or [business token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-integration-system-user-access-tokens). | `EAAA...` |
| `<API_VERSION>`<br><br>_String_ | **Optional.**<br><br>Graph API version. | v26.0 |
| `<WHATSAPP_BUSINESS_PHONE_NUMBER_ID>`<br><br>_String_ | **Required.**<br><br>WhatsApp business phone number ID. | `106540352242922` |
| `<WHATSAPP_USER_PHONE_NUMBER>`<br><br>_String_ | **Required.**<br><br>WhatsApp user phone number. | `+16505551234` |
| `<PER_MESSAGE_BID_MULTIPLIER>`<br><br>_Float_ | **Optional.** Default: `1`<br><br>A positive multiplier applied to the template's `bid_amount`. For example, `1.5` increases the max price by 50%, `0.5` decreases it by 50%, and `1` (default) uses the template's max price amount unchanged. | `1.5` |
## Estimate reach and costs
The Reach estimation helps you understand your expected deliveries and costs at different max price levels.
### Request syntax
Use the [WhatsApp Business Account API](https://developers.facebook.com/documentation/business-messaging/whatsapp/reference/whatsapp-business-account/whatsapp-business-account-api#get-version-waba-id) to get the estimated delivery ranges and cost ranges at various max price amounts.
Meta generates estimates from historical data, and they are for informational and planning purposes only. They do not guarantee future delivery outcomes, costs, or performance. Actual results may differ due to changes in platform conditions or other variables.
The `targeting_spec` value must be serialized JSON. For example:
```html
curl 'https://graph.facebook.com/<API_VERSION>/<WHATSAPP_BUSINESS_ACCOUNT_ID>/reachestimate?targeting_spec={"geo_locations":{"countries":["IN"]}}&date_interval=<DATE_INTERVAL>' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
```
### Request parameters
| Placeholder | Description | Example Value |
| --- | --- | --- |
| `<ACCESS_TOKEN>`<br><br>_String_ | **Required.**<br><br>[System token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#system-user-access-tokens) or [business token](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-integration-system-user-access-tokens). | `EAAA...` |
| `<API_VERSION>`<br><br>_String_ | **Optional.**<br><br>Graph API version. | v26.0 |
| `<WABA_ID>`<br>_String_ | **Required.** | `102290129340398` |
| `<DATE_INTERVAL>`<br><br>_Enum_ | **Required.**<br><br>Lookback period for the historical data used to generate estimates. One of: `L1D` (last 1 day), `L7D` (last 7 days), `L14D` (last 14 days), `L28D` (last 28 days). | `L7D` |
| `<TARGETING_SPEC>`<br><br>_JSON_ | **Required.**<br><br>Serialized JSON specifying geographic targeting. Must include `geo_locations` with a `countries` array. | `{"geo_locations":{"countries":["IN"]}}` |
### Example response
```json
{
"waba_currency": "USD",
"estimates": [
{
"bid_amount": 400,
"users": 1000,
"deliveries_lower_bound": 500,
"deliveries_upper_bound": 570,
"cost_lower_bound": 389.74,
"cost_upper_bound": 390.74
},
{
"bid_amount": 520,
"users": 1000,
"deliveries_lower_bound": 600,
"deliveries_upper_bound": 650,
"cost_lower_bound": 400.74,
"cost_upper_bound": 510.74
}
]
}
```
The response contains multiple `estimates` entries at different max price amounts, allowing you to compare expected delivery volumes and costs across price points.
### Response fields
| Field | Description |
| --- | --- |
| `waba_currency` | |
| `bid_amount` | |
| `users` | Targeted user count. Fixed at 1,000 during beta. |
| `deliveries_lower_bound` | Lower bound of the estimated delivery range for this max price amount. |
| `deliveries_upper_bound` | Upper bound of the estimated delivery range for this max price amount. |
| `cost_lower_bound` | |
| `cost_upper_bound` | |
## Metrics and billing
Messages sent with or without the max price feature use the same **Marketing Lite** product type (SKU) for billing purposes.
Marketing messages sent with max price appear in analytics with the following identifiers:
- **Pricing Analytics** [`/<WHATSAPP_BUSINESS_ACCOUNT_ID>?fields=pricing_analytics`](https://developers.facebook.com/documentation/business-messaging/whatsapp/analytics#pricing-analytics): `pricing_category` = `MARKETING_LITE`
- **Template Analytics** [`/<WHATSAPP_BUSINESS_ACCOUNT_ID>?fields=template_analytics`](https://developers.facebook.com/documentation/business-messaging/whatsapp/analytics#template-analytics): `product_type` = `MARKETING_MESSAGES_LITE_API`
Webhooks use lowercase `marketing_lite` for `pricing.category`, while analytics APIs use uppercase `MARKETING_LITE` for `pricing_category`. When max price is enabled, the delivered and read status webhooks also include a `cost` object with the estimated charge for the message.
### Delivered/read webhook example (with max price)
```json
"pricing": {
"billable": true,
"pricing_model": "PMP",
"category": "marketing_lite",
"type": "regular",
"cost": {
"amount": 0.035,
"currency": "USD"
}
}
```
#### Webhook cost fields
| Field | Type | Description |
| --- | --- | --- |
| `amount` | Float | Cost of the delivered or read message. Appears on `delivered` and `read` events. The unit is the currency base unit (dollar for USD, rupee for INR), consistent with the analytics API `cost` field. |
| `currency` | String | |
*The price reported in the delivered/read webhook may differ from the final charge on your invoice due to small variations in data processing (same as Analytics API). Your billing invoice is the source of truth for final pricing.*
### Pricing analytics response example
```json
{
"pricing_analytics": {
"data": [
{
"data_points": [
{
"start": 1748761200,
"end": 1748847600,
"country": "IN",
"pricing_type": "REGULAR",
"pricing_category": "MARKETING_LITE",
"volume": 1,
"cost": 10
}
]
}
]
}
}
```
### Template analytics response example
```json
{
"data": [
{
"granularity": "DAILY",
"product_type": "MARKETING_MESSAGES_LITE_API",
"data_points": [
{
"template_id": "1421988012088524",
"start": 1718064000,
"end": 1718150400,
"sent": 1,
"delivered": 1,
"read": 1,
"cost": [
{
"type": "amount_spent",
"value": 0.01
},
{
"type": "cost_per_delivered",
"value": 0.01
}
]
}
]
}
]
}
```
For more details on metrics, see [Viewing metrics](https://developers.facebook.com/documentation/business-messaging/whatsapp/marketing-messages/view-metrics).
## Error codes
| Code | Message | Possible reasons and solutions |
| --- | --- | --- |
| 131061 | Marketing templates containing bid_spec are not supported by the Cloud API. To use templates with bid_spec, please use the Marketing Messages API for WhatsApp. | You are sending a template that has a max price set (`optimization_spec`, or `bid_spec` before its July 31, 2026 deprecation) to the Cloud API `/messages` endpoint. Send to the `/marketing_messages` endpoint instead. |
| 100 | You need to sign the testing legal agreement before sending out messages. | You have not signed the testing legal agreement. Please sign the agreement to gain access to this feature. |
For a full list of error codes, see [Error codes](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes).