Ads and Commerce

Website ads that click to message

Updated: May 7, 2026
Website ads that click to message let you add a messaging banner to your website destination ads. When customers click the ad on mobile, the website opens in an in-app browser for Facebook and Instagram. At the bottom of the page, customers see a footer with a button to redirect to the specified messaging destination and can click on it to have a conversation about your products or services.
Website ads that click to message and click-to-message ads are distinct products that use different API field combinations:
FieldWebsite ads that click to messageClick-to-message
destination_type
WEBSITE or UNDEFINED
MESSENGER, WHATSAPP, or INSTAGRAM_DIRECT
optimization_goal
Choose based on your objective:
- Sales: OFFSITE_CONVERSIONS
- Leads: OFFSITE_CONVERSIONS
- Engagement: OFFSITE_CONVERSIONS
- Traffic: LANDING_PAGE_VIEWS
- Awareness: REACH
CONVERSATIONS
CTA type
LEARN_MORE (or other website CTAs)
MESSAGE_PAGE or WHATSAPP_MESSAGE with app_destination
asset_feed_spec
message_extensions: [{"type":"messenger"}] (or whatsapp, instagram_message)
Not used
Primary user action
User lands on your website with a messaging button as a secondary entry point
User is sent directly to a messaging conversation

Prerequisites

  • An ad account with access to the Marketing API.
  • A Facebook Page linked to your messaging destination (WhatsApp Business number, Messenger, or Instagram Professional account).
  • A valid access token with the ads_management permission.
  • Your ad set must use destination_type: WEBSITE or UNDEFINED. Website ads that click to message do not work with other destination types.

Step 1: Create an ad campaign

Create an ad campaign with a supported objective. The supported objectives vary by messaging channel:
ChannelSupported objectives
Website to WhatsApp
Sales, Traffic, Engagement, Leads, Awareness
Website to Messenger
Sales, Traffic, Leads, Awareness
Website to Instagram Direct
Sales, Traffic, Leads
curl -X POST \
  -F 'name=Website-to-Messaging Campaign' \
  -F 'objective=OUTCOME_TRAFFIC' \
  -F 'buying_type=AUCTION' \
  -F 'status=PAUSED' \
  -F 'special_ad_categories=["NONE"]' \
  -F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/campaigns
On success, your app receives a JSON response with the ad campaign ID.
{
  "id": "<CAMPAIGN_ID>"
}

Step 2: Create an ad set

Set destination_type to WEBSITE or UNDEFINED.
Note: Do not use messaging-specific destination types such as MESSAGING_WHATSAPP, MESSAGING_MESSENGER, or MESSAGING_INSTAGRAM_DIRECT.
curl -X POST \
  -F 'name=Website-to-Messaging Ad Set' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'daily_budget=500' \
  -F 'bid_amount=200' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'optimization_goal=LANDING_PAGE_VIEWS' \
  -F 'destination_type=WEBSITE' \
  -F 'promoted_object={"page_id":"<PAGE_ID>"}' \
  -F 'status=PAUSED' \
  -F 'targeting={"geo_locations":{"countries":["US"]},"age_min":18,"age_max":65,"publisher_platforms":["facebook"],"facebook_positions":["feed"]}' \
  -F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets
On success, your app receives a JSON response with the ad set ID.
{
  "id": "<AD_SET_ID>"
}

Step 3: Create an ad using an inline creative

You must pass the creative inline in the POST /ads request.
Note: Creating a standalone creative via POST /adcreatives with message_extensions is not supported and returns error code 3.
The message_extensions property in asset_feed_spec determines the messaging channel:
Channelmessage_extensions value
Website to WhatsApp
[{"type": "whatsapp"}]
Website to Messenger
[{"type": "messenger"}]
Website to Instagram Direct
[{"type": "instagram_message"}]
Use a non-messaging call_to_action type such as LEARN_MORE.
Note: Messaging calls to action such as WHATSAPP_MESSAGE, INSTAGRAM_MESSAGE, and MESSAGE_PAGE are not compatible with website ads that click to message.

Website to WhatsApp

curl -X POST \
  -F 'access_token=<ACCESS_TOKEN>' \
  -F 'name=Website to WhatsApp Ad' \
  -F 'adset_id=<AD_SET_ID>' \
  -F 'creative={"object_story_spec":{"page_id":"<PAGE_ID>","link_data":{"image_hash":"<IMAGE_HASH>","link":"<WEBSITE_URL>","message":"<AD_PRIMARY_TEXT>","call_to_action":{"type":"LEARN_MORE","value":{"link":"<WEBSITE_URL>"}}}},"asset_feed_spec":{"message_extensions":[{"type":"whatsapp"}]}}' \
  -F 'status=PAUSED' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/ads

Website to Messenger

curl -X POST \
  -F 'access_token=<ACCESS_TOKEN>' \
  -F 'name=Website to Messenger Ad' \
  -F 'adset_id=<AD_SET_ID>' \
  -F 'creative={"object_story_spec":{"page_id":"<PAGE_ID>","link_data":{"image_hash":"<IMAGE_HASH>","link":"<WEBSITE_URL>","message":"<AD_PRIMARY_TEXT>","call_to_action":{"type":"LEARN_MORE","value":{"link":"<WEBSITE_URL>"}}}},"asset_feed_spec":{"message_extensions":[{"type":"messenger"}]}}' \
  -F 'status=PAUSED' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/ads

Website to Instagram Direct

curl -X POST \
  -F 'access_token=<ACCESS_TOKEN>' \
  -F 'name=Website to Instagram Direct Ad' \
  -F 'adset_id=<AD_SET_ID>' \
  -F 'creative={"object_story_spec":{"page_id":"<PAGE_ID>","link_data":{"image_hash":"<IMAGE_HASH>","link":"<WEBSITE_URL>","message":"<AD_PRIMARY_TEXT>","call_to_action":{"type":"LEARN_MORE","value":{"link":"<WEBSITE_URL>"}}}},"asset_feed_spec":{"message_extensions":[{"type":"instagram_message"}]}}' \
  -F 'status=PAUSED' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/ads
On success, your app receives a JSON response with the ad ID.
{
  "id": "<AD_ID>"
}

Step 4: Publish your ad

When you are ready to go live, update the ad status from PAUSED to ACTIVE:
curl -X POST \
  -F 'status=ACTIVE' \
  -F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/<AD_ID>

Verify your ad

Verify that message_extensions and destination_type are set correctly by making a GET request to the ad:
curl -G "https://graph.facebook.com/v25.0/<AD_ID>" \
  -d "access_token=<ACCESS_TOKEN>" \
  -d "fields=creative{asset_feed_spec{message_extensions}},adset{destination_type}"
The response for a website to WhatsApp ad looks like this:
{
  "creative": {
    "asset_feed_spec": {
      "message_extensions": [{"type": "whatsapp"}]
    }
  },
  "adset": {
    "destination_type": "WEBSITE"
  },
  "id": "<AD_ID>"
}

Identify website ads that click to message

You can identify website ads that click to message by checking the ad set destination_type and the ad creative’s message_extensions configuration.
To determine whether an ad is a website ad that clicks to message, check for both of the following:
  1. The ad set has destination_type: "WEBSITE" or "UNDEFINED"
  2. The ad creative contains asset_feed_spec.message_extensions
Click-to-message ads (such as click-to-WhatsApp) use messaging-specific destination types such as MESSAGING_WHATSAPP, MESSAGING_MESSENGER, or MESSAGING_INSTAGRAM_DIRECT. Website ads that click to message always use destination_type: "WEBSITE" or "UNDEFINED" combined with message_extensions.