WhatsApp Carousel

A WhatsApp Carousel message allows you to send a single marketing message template accompanied by up to 10 media cards, displayed as a horizontally scrollable sequence.

Each card can include media, text, and interactive buttons, enabling users to browse options, compare items, or navigate different actions without leaving the conversation.

This format is particularly useful when the goal is to present structured content in a compact, interactive way. Typical use cases include:

  • Product catalogs or featured items
  • Promotional campaigns with multiple offers
  • Step-based navigation or guided experiences
  • Content discovery (articles, services, categories)

Carousel Template Components

A WhatsApp Carousel template is composed of a message body and a set of media cards displayed as a single horizontally scrollable message.

The carousel itself is defined as a collection of cards:

  • Minimum: 2 cards
  • Maximum: 10 cards

This means the first cards will receive more visibility, so their position should be intentional.

Message Body

The message body is defined once and appears above the carousel, providing context or introducing the content that follows. This text applies to the entire message and can include personalized fields (placeholders).

First, enter the text for your message in the language you've chosen. This message should only contain text, personalized fields (placeholders), markdown, and emojis. The total number of characters may not exceed 1024.

This example will help you to understand the location of the Message Body in JSON format. That is, this diagram shows each parameter in which the text message is composed and how it will be displayed by the user.

Card Media Header

The Media Header is a required component in every card and serves as the primary visual element of the carousel. It is the first element rendered within each card and plays a key role in capturing user attention and conveying the main context of the content.

The Media Header contains a single media asset (Image or Video) and is always displayed at the top of the card. This component represents the main visual reference of each card, allowing users to quickly understand the content before interacting with it.

The details below specify the types of media headers that support the platform, along with their maximum file sizes and supported formats:

File typeSupported formatsMaximum file size
Image.jpeg, .jpg, .png5 MB
Video.mp4, .3gpp, .3gp16 MB

Note: Video files must use the H.264 video codec.

The following media header examples will help you understand each media type that contains the media header in JSON format. That is, this diagram shows each parameter that the media header is composed of and how it will be displayed by the user.

Important: the media headers must be consistent across all cards (same type and similar dimensions)

Card Body Text

Below the Media Header, each card can include Body Text. This field is optional but commonly used to describe the content of the card, such as product details or key features, and it can include personalized fields (placeholders). If body text is included in one card, it must be included in all cards.

This example will help you to understand the location of the Body Text in JSON format. That is, this diagram shows each parameter in which the body text is composed and how it will be displayed by the user.

Card Buttons

Cards can also include buttons that allow users to interact directly with the content of each card. In a carousel, buttons are defined at the card level, which means each card can have its own actions associated with the item being displayed. Supported button types include:

  • Quick Reply buttons
  • URL buttons
  • Phone number button

Each card can include up to 2 buttons. Different button types can be combined within the same card, depending on the use case and the capabilities supported by the template. However, the button structure must remain consistent across all cards. This means that if one card includes two buttons, all cards must include two buttons as well. The same rule applies to button type and order. For example, if the first button is a Quick Reply button and the second is a URL button in one card, the remaining cards must follow that same arrangement.

Quick Reply buttons

Quick Reply buttons allow users to respond to a message with a single tap by sending a predefined option back to the business. In carousel cards, these buttons are useful when the goal is to let users express interest, request more information, confirm a preference, or continue a guided interaction without leaving the conversation.

Unlike URL or phone number buttons, Quick Reply buttons do not redirect the user outside WhatsApp. Instead, they trigger an immediate response within the chat, which makes them especially effective for conversational flows and decision-based journeys.

You can configure up to two quick reply buttons per card. Each button includes a visible label (Button Text) and a value that is sent back to the platform when the user selects it.

Quick Reply buttons can be used in different contexts depending on how the payload is configured:

  • Consent Management actions: The payload can be mapped to predefined system actions such as Auto-Reply, Opt-Out, Help Response, or Join Response. In this case, the button triggers a built-in behavior managed by the platform.

    For example, we are going to add two buttons to the message content:

    • Button Text = Yes, Button payload: agree
    • Button Text = No, Button payload: NotAgree

    If the end user selects the button ‘Yes’, the platform receives the payload value ´agree´ and processes it accordingly.

    You set the value of the Button payloads to Consent Management (Auto-Reply, Opt-Out, Help Response, Join Response).

  • Custom automations (keyword-based): The payload acts as a keyword that triggers a specific automation, such as a chatbot or conversational flow.

    The entered value in the button field must match exactly the keyword defined in the automation. The platform uses this value to trigger the corresponding automation. If the value does not match the configured keyword, the automation will not be activated.

    For example,

    • Button Text = Chat with us
    • Button Text = Sign me up

    These two button texts (Chat with us, Sign me up) are keywords that were defined when creating the automations. This action triggers an automated response that directs the user to the corresponding automation. Therefore, once the end user selects one of these options, they will be redirected to the automation that is linked to the quick reply button selected, which contains the keyword to trigger the automation.

URL buttons

URL buttons allow users to open an external link directly from a carousel card with a single tap. Unlike Quick Reply buttons, which keep the interaction inside WhatsApp, URL buttons redirect the user outside the conversation to a web experience, such as a landing page, product detail page, or checkout flow.

Each URL button consists of a visible label (Button Text) and a destination link (URL) that is opened when the user taps the button. Depending on the device and configuration, the link is opened either in the default browser or within an in-app browser.

URL buttons can be configured in two ways:

  • Static URLs: A fixed link that is the same for all users. These are typically used for general landing pages, product pages, or promotional content.

    Example: https://example.com/product/123

  • Dynamic URLs: A link that includes a URL Suffix Value that is replaced at send time. This allows you to personalize the destination.

    Example: https://example.com/{{url_suffix_value}}

From an implementation perspective, URLs must use HTTPS, be valid and accessible at the time of delivery, and should not redirect to broken or unsupported destinations, as this can negatively impact the user experience. The button text should remain concise and clearly indicate the action, such as “View product”, “Buy now”, or “Learn more”.

As with all carousel components, URL buttons must follow a consistent structure across all cards. If a URL button is included in one card, it must be included in all cards, and its position relative to other buttons must remain the same. For example, if the first button is a URL button and the second is a Quick Reply button in one card, all other cards must follow that same order.

URL buttons can use either static or dynamic links. This does not affect template validation, as both are considered the same button type. However, the button position and type must remain consistent across all cards.

🚧

WARNING

WhatsApp does not allow direct links to WhatsApp in Call-to-Action buttons.

Card Buttons can only be used to open external websites. If you need to share a WhatsApp link (for example, a wa.me link), include it directly in the message body instead of using a button.

Example:

Not supported (CTA button) - Using a card button with a direct WhatsApp link:

Button URL: https://wa.me/XXXXXXXX

Supported (message body) - Including the WhatsApp link directly in the message body:

Message body: Chat with us on WhatsApp (https://wa.me/XXXXXXXX)

Phone number button

Phone Number buttons allow users to initiate a phone call directly from a carousel card with a single tap. Unlike Quick Reply buttons, which trigger an in-chat response, or URL buttons, which open a web page, this button type enables direct voice communication by launching the device’s native dialer with a predefined phone number.

Each Phone Number button includes:

  • Button Text: The visible label shown to the user. This should clearly indicate that the action will initiate a call, such as “Call now”, “Contact us”, or “Speak to an agent”.
  • Phone Number: The destination phone number that will be dialed when the user taps the button.

This example will help you to understand the location of the Body Text in JSON format. That is, this diagram shows each parameter in which the body text is composed and how it will be displayed by the user.

This example helps you understand how Phone Number buttons are structured in JSON format. It shows the parameters required to define the button, including its type, display text, and phone number, and how it will be displayed by the user.

Considerations

The requirements and considerations before sending the WhatsApp Carousel message template to the recipients via WhatsApp Business API are the following:

  • First, create the carousel message template through the Templates API.
  • The Template Category must be Marketing.
  • Once you have created the carousel message template, you'll need to submit it for WhatsApp approval.
  • It takes WhatsApp up to 48 hours to review the carousel message template.
  • After the carousel message template is created and approved, you can send it to recipients via API.
🚧

WARNING

Carousel cards must follow the same internal structure across the entire template. This means that optional components cannot be added to only some cards and omitted from others.

For example, if Body Text is included in one card, it must also be included in all remaining cards. The same rule applies to button configuration: all cards must define the same number of buttons, using the same button types and in the same order.

This requirement exists because WhatsApp validates carousel cards as repeated instances of a single card structure, rather than as fully independent elements. If one card differs from the others in its component layout, the template may fail validation or render incorrectly.

To avoid the template being rejected, make sure all cards in the carousel follow a consistent structure before submitting the message template.

Create Carousel Message Template

If you want to create the carousel message template via Templates API, you need to provide the WhatsApp Business Account ID (WABA) or the unique identifier of the sender, and enter the following parameters in the request body:

HTTP Request: POST /whatsapp/templates

Required ParameterDescription
wabaIdWhatsApp Business Account ID (WABA).
senderIdUnique identifier of the Sender.

The following example shows a carousel message template request body that includes a message body with one personalized field and composed of two cards. The first card contains a card media header (image type), card body text with two personalized fields, and two buttons: a quick reply button and a dynamic URL button. The second card includes a card media header (image type), card body text without personalized fields, and two buttons: a quick reply button and a static URL button:

{
  "name": "carousel_demo_template",
  "category": "MARKETING",
  "templateLanguages": [
    {
      "language": "en",
      "components": [
        {
          "type": "BODY",
          "text": "Hi {{customer_name}}! Explore our solutions and choose the best option for you:",
          "example": {
            "body_text": [
              ["John"]
            ]
          }
        },
        {
          "type": "CAROUSEL",
          "cards": [
            {
              "components": [
                {
                  "type": "HEADER",
                  "format": "IMAGE",
                  "example": {
                    "header_handle": [
                      "https://example.com/image1.png"
                    ]
                  }
                },
                {
                  "type": "BODY",
                  "text": "Track your order {{order_id}} placed on {{order_date}} and check the delivery status in real time.",
                  "example": {
                    "body_text": [
                      ["#12345", "March 10"]
                    ]
                  }
                },
                {
                  "type": "BUTTONS",
                  "buttons": [
                    {
                      "type": "QUICK_REPLY",
                      "text": "Track order"
                    },
                    {
                      "type": "URL",
                      "text": "View details",
                      "url": "https://example.com/orders/{{order_path}}",
                      "example": [
                        "12345"
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "components": [
                {
                  "type": "HEADER",
                  "format": "IMAGE",
                  "example": {
                    "header_handle": [
                      "https://example.com/image2.png"
                    ]
                  }
                },
                {
                  "type": "BODY",
                  "text": "Browse our other products and find your favorite item in just a few taps."
                },
                {
                  "type": "BUTTONS",
                  "buttons": [
                    {
                      "type": "QUICK_REPLY",
                      "text": "Show products"
                    },
                    {
                      "type": "URL",
                      "text": "Browse catalog",
                      "url": "https://example.com/products"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

The parameters of the request body are divided into two main sections to create a WhatsApp Carousel message template:

  • Main parameters: Define the core configuration of the template. This section includes the template name, category, and language settings, as well as the main message body that is displayed above the carousel. These parameters establish the template's base structure and are required for template creation and approval.
  • Carousel cards parameters: Define the structure and content of the carousel itself through the CAROUSEL component. This section contains the cards array, where each card is composed of its own set of components, including a media header (image or video), body text, and buttons. Each card must follow the same structure, ensuring consistency across the carousel. This includes maintaining the same media type, presence of body text, and button configuration (type, number, and order). These parameters control how each card is rendered and how users interact with the carousel content.

Main Parameters

Parameter Required Description
name Yes

Unique name of the template within your WhatsApp Business Account (WABA).

Template names must be unique and cannot be reused once created.

category Yes

Type of message template.

Supported Template Categories for WhatsApp Carousel Message Template.

  • "MARKETING": Send promotional offers, product announcements, and more to increase awareness and engagement.

templateLanguages Yes

Array of languages objects containing the language that message template may be rendered in and the components.

templateLanguages.
language
Yes

Language of the message template.

Currently the API supports 3 Languages: English, Spanish and Portuguese. Required if you want to send templates in languages other than English.

English: "en"

Spanish: "es"

Portuguese: "pt_BR", "pt_PT"

templateLanguages.
components
Yes

The parts of the message template.

Array of components that define the structure and content of the message template for the specified language. These components determine how the message is rendered to the end user.

templateLanguages.
components.
type
Yes

Type of component of the message template you want to send.

  • "BODY": The main content of the message template.
  • "CAROUSEL": Defines the carousel component of the message template.

templateLanguages.
components.
text
Yes

Only applies to the "BODY" type.

Enter the text message body to be sent. Only contain text, personalized fields (placeholders), markdown, and emojis. A text body has a limit of 1024 characters including emojis.

You can include personalized fields, also known as placeholders. These placeholders are defined within double curly braces {{…}}. When creating a message template, you can set the value for each placeholder in the "body_text" parameter.

templateLanguages.
components.
example
No

Only applies to the "BODY" type.

Object that provides an example of possible data for your message template. This helps Meta during the review and approval process, so they can understand what kind of message you plan to send. Make sure these are examples and do not include any confidential or personal information.

It is required when the text message body contains placeholders.

templateLanguages.
components.
example.
body_text
No

Only applies to the "BODY" type.

It is required when the message body contains placeholders.

Specifies the value(s) as a sample data for the placeholder(s) defined in the "templateLanguages.components.text" parameter.

Array of personalized fields values containing the message body.

Carousel cards parameters

Parameter Required Description
templateLanguages.
components.
cards
Yes

Only applies to the "CAROUSEL" type.

Array of card objects that define the content of the carousel. Each item represents a card displayed in the horizontal sequence.

templateLanguages.
components.
cards.
components
Yes

Only applies to the "CAROUSEL" type.

Array of components that define the structure of each card. Supported component types include media header, body text, and buttons.

templateLanguages.
components.
cards.
components.
type
Yes

Only applies to the "CAROUSEL" type.

Type of component within a carousel card.

  • "HEADER": Defines the media content displayed at the top of the card (image or video).
  • "BODY": Defines the text content of the card, including optional placeholders.
  • "BUTTONS": Defines the interactive buttons of the card, such as Quick Reply, URL, or Phone Number buttons.

templateLanguages.
components.
cards.
components.
format
Yes

Only applies to the "CAROUSEL" type and "HEADER" (card media header) type.

Specifies the format of the media content used in the card header, which is displayed at the top of each carousel card.

The media header supports the following format options:

  • "IMAGE": Displays an image as the header of the card. Accepts image files in .jpeg, .jpg or .png format, with a maximum file size of 5 MB.
  • "VIDEO": Displays a video as the header of the card. Accepts video files in .mp4, .3gpp or .3gp format, with a maximum file size of 16 MB. Video files must use the H.264 video codec.
templateLanguages.
components.
cards.
components.
text
No

Only applies to the "CAROUSEL" type and "BODY" (card body text) type.

Enter the body text to be sent. Only contain text, personalized fields (placeholders), markdown, and emojis.

You can include personalized fields, also known as placeholders. These placeholders are defined within double curly braces {{…}}. You can set the value for each placeholder in the "templateLanguages.components.cards.components.example.body_text" parameter.

templateLanguages.
components.
cards.
components.
example
Yes

Only applies to the "CAROUSEL" type, "HEADER" (card media header) type, and "BODY" (card body text) type.

Object that provides an example of possible data for your template. This helps Meta during the review and approval process, so they can understand what kind of message you plan to send. Make sure these are examples and do not include any confidential or personal information.

By setting a Media Header type, it is required when the card media header contains a media link (image, video).

If you set the Body Text type, it is required when the card body text contains placeholder(s).

templateLanguages.
components.
cards.
components.
example.
header_handle
Yes

Only applies to the "CAROUSEL" type and "HEADER" type (card media header).

Array of the URL containing the media header.

If you set a video or image as media file, enter the URL of the chosen media

The URL of the media header (image, video) must be a valid URL that starts with "http://…" or "https://…" and provides a direct download. Redirects are not supported.

templateLanguages.
components.
cards.
components.
example.
body_text
No

Only applies to the "CAROUSEL" type and "BODY" type (card body text).

Array of personalized fields values containing the text message body.

it is required when the body text contains placeholders.

Specifies the value(s) as a sample data for the placeholder(s) defined in the "templateLanguages.components.cards.components.text" parameter.

templateLanguages.
components.
cards.
components.
buttons
Yes

Only applies to the "CAROUSEL" type and "BUTTONS" type (card buttons).

Array of button objects that define the interactive actions (Quick Reply, URL, or Phone Number) available within the carousel card.

templateLanguages.
components.
cards.
components.
buttons.
type
Yes

Only applies to the "CAROUSEL" type and "BUTTONS" type (card buttons).

Specifies the type of button to include in the carousel card:

  • "QUICK_REPLY": Sends a predefined response back to the platform when the user taps the button. This type is used to trigger automations, and consent management actions. It does not redirect the user outside the conversation.
  • "URL": Opens an external website when the user taps the button.
  • "PHONE_NUMBER": Opens the device dialer with a predefined phone number when the user taps the button.

Considerations:

  • Each carousel card can include up to 2 buttons.
  • All cards in the carousel must use the same button structure. This means the number of buttons, the button types, and their order must remain consistent across all cards.
  • If one card uses "QUICK_REPLY" as the first button and "URL" as the second button, all remaining cards must follow that same arrangement.
  • For "URL" buttons, the destination can be static or dynamic. This does not change the button type, since both are still considered "URL" buttons.
templateLanguages.
components.
cards.
components.
buttons.
text
Yes

Only applies to the "CAROUSEL" type and "BUTTONS" type (card buttons).

Specifies the visible label of the button displayed to the end user.

Regardless of the button types you choose (Quick Reply, URL, Phone Number), set the text button or keyword (quick reply) to be displayed on the button.

templateLanguages.
components.
cards.
components.
buttons.
phone_number
No

Only applies to the "CAROUSEL" type, "BUTTONS" type (card buttons), and "PHONE_NUMBER" button type.

Phone number that is called on clicking the button.

if you set "PHONE_NUMBER" as the button type, enter a valid phone number that will redirect the user to the phone call.

templateLanguages.
components.
cards.
components.
buttons.
url
No

Only applies to the "CAROUSEL" type, "BUTTONS" type (card buttons), and "URL" button type.

If you set "URL" as a static or dynamic website URL button, enter a valid URL that starts with "http://…" or "https://…" that will redirect the user to the website.

If the carousel card is defined with a dynamic URL, set the URL suffix. The URL suffix is then propagated as an extension of the registered URL address.

For the dynamic website URL button, enter a forward slash at the end of the link → "https://www.google.com/". At least, enter the URL suffix (dynamic content of the url) as placeholder inside double curly braces {{...}}.

For example: "https://www.google.com/{{survery_url}}"

WhatsApp does not allow direct links to WhatsApp in card buttons. These buttons can only be used to open external websites. If you need to share a WhatsApp link (for example "https://wa.me/XXXXXXXX"), included directly in the message body rather than configured as a button.

templateLanguages.
components.
cards.
components.
buttons.
example
No

Only applies to the "CAROUSEL" type, "BUTTONS" type (card buttons), and "URL" button type if you set a dynamic URL.

Array that provides an example of possible data for your carousel card. This helps Meta during the review and approval process, so they can understand what kind of message you plan to send. Make sure these are examples and do not include any confidential or personal information.

If you set "URL" as a dynamic website URL button, enter the static URL, plus the forward slash and the URL suffix value (dynamic content of the url -> placeholder).

For example: "https://www.google.com/45yuhgfhj"

When you create a WhatsApp Carousel message template, the response body contains the following data:

{
  "meta": {
    "timestamp": 17780,
    "transactionId": "a9153ea"
  },
  "data": {
    "wabaId": 1518302235,
    "name": "carousel_demo_template",
    "category": "MARKETING",
    "templateLanguages": [
      {
        "id": "1586503969317227",
        "language": "en",
        "components": [
          {
            "type": "BODY",
            "text": "Hi {{customer_name}}! Explore our solutions and choose the best option for you:",
            "example": {
              "body_text": [
                [
                  "John"
                ]
              ]
            }
          },
          {
            "type": "CAROUSEL",
            "cards": [
              {
                "components": [
                  {
                    "type": "HEADER",
                    "format": "IMAGE",
                    "example": {
                      "header_handle": [
                        "https://example.com/image1.png"
                      ]
                    }
                  },
                  {
                    "type": "BODY",
                    "text": "Track your order {{order_id}} placed on {{order_date}} and check the delivery status in real time.",
                    "example": {
                      "body_text": [
                        [
                          "#12345",
                          "March 10"
                        ]
                      ]
                    }
                  },
                  {
                    "type": "BUTTONS",
                    "buttons": [
                      {
                        "type": "QUICK_REPLY",
                        "text": "Track order"
                      },
                      {
                        "type": "URL",
                        "text": "View details",
                        "url": "https://example.com/orders/{{order_path}}",
                        "example": [
                          "12345"
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "components": [
                  {
                    "type": "HEADER",
                    "format": "IMAGE",
                    "example": {
                      "header_handle": [
                        "https://example.com/image2.png"
                      ]
                    }
                  },
                  {
                    "type": "BODY",
                    "text": "Browse our other products and find your favorite item in just a few taps."
                  },
                  {
                    "type": "BUTTONS",
                    "buttons": [
                      {
                        "type": "QUICK_REPLY",
                        "text": "Show products"
                      },
                      {
                        "type": "URL",
                        "text": "Browse catalog",
                        "url": "https://example.com/products"
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ],
        "disabledTrackingButton": false
      }
    ]
  }
}

Regardless of the types of objects you chose to customize the message template, the response body provides you with the WhatsApp Business Account ID (WABA) ("data.wabaId") and the template ID ("data.templateLanguages.id"), which will allow you to obtain information, edit or delete from a specific message template, and list message templates.

📘

Retrieving the Status of a WhatsApp Message Template

After creating a WhatsApp message template, it is important to monitor its approval status, as this determines whether the template can be used in messaging campaigns. We provide two API endpoints that allow users to retrieve the current status of each template created:

  • Get Template: Returns the status of a specific message template.
  • List Templates: Returns a list of all message templates associated with the WABA, including the current status of each one.

These endpoints help you verify whether a template has been approved by WhatsApp, is under review, or requires further action.

Below are the possible statuses a WhatsApp message template can return, along with their meanings:

StatusDescription
APPROVEDThe message template has been reviewed and accepted by Meta. It is now active and can be used in message campaigns.
PENDINGThe message template has been submitted and is awaiting initial processing.
PENDING_APPROVALThe message template is under review by Meta and is waiting for final approval.
REJECTEDThe message template was reviewed and not approved due to content violations or formatting issues. A new version may need to be submitted.
IN_APPEALAn appeal has been submitted for a previously rejected template. It is under re-evaluation.
PAUSEDThe message template has been temporarily paused and cannot be used until reactivated.
LIMIT_EXCEEDEDThe message template has reached usage or submission limits as defined by Meta. Further use is restricted until limits reset or are adjusted.
DISABLEDThe message template has been disabled and is no longer available for use.
DELETEDThe message template has been permanently deleted from the account.
PENDING_DELETIONThe message template is in the process of being deleted and will no longer be available once deletion is completed.

Send Carousel Message Template

Before sending a WhatsApp Carousel message template, it is essential to understand how to include placeholders in the payload when the template that has been created contains personalized fields in the Message Body or in the Card Body Text component. Furthermore, if the template included a Buttons component with a dynamic URL, it is important to know how to add each button to the payload based on its respective position index to send the carousel message template properly to recipients when initiating the API call.

📘

Message Throughput (TPS)

To know about delivery throughput and how TPS is applied across channels (WhatsApp), go to the Message Throughput (TPS) section.

Personalized Fields (placeholders)

This section will guide you on how to include placeholders in the request body to send the WhatsApp Carousel message template you set up during template creation.

Message Body

If the created carousel message template includes placeholder(s) in the Message Body, the example payload JSON will be as follows:

"placeholders": {  
    "name": "Elizabeth",  
    "lastName": "Smith"  
}

From the "placeholders" object, set as parameter the placeholder you configured that is inside double curly braces {{...}} when creating the tcarousel message template. Then set the value of the placeholder parameter.

For instance, according to the previous example, the text message body of the created carousel message template is as follows:

{
  "type": "BODY",
  "text": "Welcome {{name}} {{lastName}} we have a new offer for you!",
  "example": {
    "body_text": [
      [
        "Elizabeth",
        "Smith
      ]
    ]
  }
}

The placeholders must be correctly formatted in order of how the template was created.

Card Media Header

When the carousel message template includes a media file (Image or Video) in the Card Media Header component, the example payload JSON will be as follows:

{
  "cards": [
    {
      "cardIndex": 0,
      "templateHeader": {
        "type": "image",
        "url": "https://example.com?media=image.png"
      }
    }
  ]
}

The "cards.templateHeader.type"parameter includes the header type chosen when creating the carousel message template in lower case: "image" or "video". And enter the URL of the chosen media from the "cards.templateHeader.url" parameter.

From the above example, the media type was an image.

Card Body Text

If the created carousel message template includes placeholder(s) in the Card Body Text component, the example payload JSON will be as follows:

{
  "cards": [
    {
      "cardIndex": 0,
      "placeholders": {
        "name": "Julian",
        "date": "02/02/2025"
      }
    }
  ]
}

From the "cards.placeholders" object, set as parameter the placeholder you configured that is inside double curly braces {{...}} when creating the tcarousel message template. Then set the value of the placeholder parameter.

For instance, according to the previous example, the card body text of the created carousel message template is as follows:

{
  "cards": [
    {
      "components": [
        {
          "type": "BODY",
          "text": "Hi {{name}}, would you like to schedule your visit on {{date}}?",
          "example": {
            "body_text": [
              [
                "Julian",
                "02/02/2025"
              ]
            ]
          }
        }
      ]
    }
  ]
}

The placeholders must be correctly formatted in order of how the template was created.

Position Index (Buttons)

If the created carousel message template includes a Card Buttons component with Dynamic URLs type buttons, the example payload JSON will be as follows:

This request body example, when sending the message template, includes a dynamic URL (cta) button in the carousel card.

{
  "cards": [
    {
      "cardIndex": 0,
      "templateButtons": [
        {
          "type": "cta",
          "values": [
            {
              "index": 1,
              "value": "user-71421"
            }
          ]
        }
      ]
    }
  ]
}

For Quick Reply and Dynamic URL buttons, the "cards.templateButtons.values.index" parameter indicates the position index of the button of how it was defined when creating the carousel message template (0, 1).

{
  "cards": [
    {
      "components": [
        {
          "type": "BUTTONS",
          "buttons": [
            {
              "type": "QUICK_REPLY",
              "text": "Accept"
            },
            {
              "type": "URL",
              "text": "New Offer",
              "url": "https://www.elipackagedomain.com/{{offer}}",
              "example": [
                "https://www.elipackagedomain.com/user-71421"
              ]
            }
          ]
        }
      ]
    }
  ]
}

From the example above, we can notice that

  • The quick reply button with the keyword “Accept” is in the first position (0).
  • The Dynamic URL button is in the second position (1).

Furthermore, when sending the message template, it’s important to maintain this order (position index) for each button.

Following the request body example when sending a carousel message template, the "cards.templateButtons.values.value" parameter,

  • For Dynamic URL buttons, enter the URL suffix value defined when creating the message template. The URL suffix value is then propagated as an extension of the registered URL address.
🚧

Carousel Message Template Placeholders Editable

The personalized fields (placeholders) you set when creating the WhatsApp Carousel Message Template are editable when you send the message template.

Remember, when creating the Message Template only provide example placeholder values for each component if the template includes placeholders. This helps Meta during the review and approval process, so they can understand what kind of message you plan to send. Make sure these are examples and do not include any confidential or personal information.

Once the template is approved and ready to be sent, replace the placeholders with the actual (real) placeholder values.

Therefore, you are only able to provide dynamic values for:

  • Card Media Header (Image or Video)
  • Placeholders in the Message Body and Card Body Text
  • Dynamic URL buttons (URL suffix values)

Quick Reply buttons must not be included in the send request body, as they are static components already defined and approved during message template creation.

Additionally, if the Message Body or Card Body Text do not include placeholders, they must not be included in the send request body.

Dynamic URLs (Card Buttons)

After understanding the position index of buttons, the next step is to learn how to include dynamic URLs in the payload if the template created contains dynamic URL buttons.

Remember, dynamic URLs in WhatsApp Carousel Message Templates allow for the inclusion of personalized links in buttons, making it possible to provide unique URLs for each recipient. These dynamic URLs are defined using placeholders (URL suffix), which are replaced with actual values (URL suffix value) when sending the message template.

Creating the Carousel Message Template

When creating a carousel message template with a dynamic URL button, you specify the URL suffix in the "url" parameter of the card button. Here’s an example of how the payload might look during message template creation:

{
  "cards": [
    {
      "components": [
        {
          "type": "BUTTONS",
          "buttons": [
            {
              "type": "URL",
              "text": "To locate your order, click Here!",
              "url": "https://www.packageorders.com/{{order}}",
              "example": [
                "https://www.packageorders.com/hj07taw12"
              ]
            }
          ]
        }
      ]
    }
  ]
}

In this payload:

  • "url": Includes a URL suffix ({{order}}) for the dynamic portion of the URL.
  • "example": Provides a sample of the final URL after replacing the URL suffix with a URL suffix value (e.g., "hj07taw12"). This helps illustrate how the dynamic portion of the URL will be resolved.

Sending the Carousel Message Template Creation

When sending the Carousel Message Template, the URL suffix ({{order}}) must be replaced with an actual value (URL suffix value) in the payload.

The payload for sending the message template includes the "templateButtons" field, which specifies the type of button for Dynamic URLs ("cta") and the URL suffix value ("hj07taw12"):

{
  "cards": [
    {
      "cardIndex": 0,
      "templateButtons": [
        {
          "type": "cta",
          "values": [
            {
              "index": 0,
              "value": "hj07taw12"
            }
          ]
        }
      ]
    }
  ]
}

In this payload:

  • type: Indicates a call-to-action (cta) button.
  • index: Specifies the position of the button in the message template. In this example, the dynamic URL button was placed in the first position when the message template was created. Therefore, when sending the message template, the index must be set to "0".
  • value: Provides the actual URL suffix value to replace the URL suffix.

This dynamic URL system enables personalized and actionable buttons tailored to each recipient, improving engagement and usability.


After understanding how to include personalized fields (placeholders) in the Message Body and Card Body Text component, how dynamic URLs of card buttons are configured, and how button indexes (positions) are applied—when these elements are defined in the message template—and once the carousel message template has been created via API and approved, you can proceed to send it using the Messages API.

⚠️

Edit Restrictions

You cannot edit or modify static components such as phone numbers, static URLs, or Quick Reply buttons when sending the carousel message template, as these values were already approved by Meta during message template creation. For this reason, Quick Reply buttons and static URL buttons are not included in the send request payload.

You are only able to provide dynamic values for the Card Media Header (Image or Video), placeholders in the Message Body and Card Body Text, and dynamic URL buttons.

Additionally,if the Message Body or Card Body Text do not include placeholders, they must not be included in the send request body.

This ensures that only dynamic and personalized elements are sent at runtime, while all static components remain defined by the approved template.


Now we proceed to send the carousel message template example we created earlier:

HTTP Request: POST /whatsapp/messages

{
  "templateName": "carousel_demo_template",
  "from": "525500000000",
  "to": "+525511111111",
  "templateLanguage": "en",
  "type": "carousel",
  "placeholders": {
    "customer_name": "John"
  },
  "cards": [
    {
      "cardIndex": 0,
      "templateHeader": {
        "type": "image",
        "url": "https://example.com/image1.png"
      },
      "placeholders": {
        "order_id": "#12345",
        "order_date": "March 10"
      },
      "templateButtons": [
        {
          "type": "cta",
          "values": [
            {
              "index": 1,
              "value": "12345"
            }
          ]
        }
      ]
    },
    {
      "cardIndex": 1,
      "templateHeader": {
        "type": "image",
        "url": "https://example.com/image2.png"
      }
    }
  ]
}

The parameters of the request body are divided into two (2) main sections to send a Carousel Message Template:

  • Main parameters: Outline the essential information needed to send a WhatsApp Carousel Message Template. It highlights the importance of identifying the message template, specifying the sender and recipient, ensuring the message template is sent in the correct language, and providing the personalized fields (placeholders) for the Message Body, only if they were defined when the message template was created. when the template contains them. These parameters are crucial for delivering the message accurately and effectively.

  • Carousel cards parameters: Define the only fields that can be included in the request body to customize and personalize a WhatsApp Carousel Message Template at send time. These parameters apply exclusively when the message template includes the Card Media Header (Image or Video), placeholders in the Card Body Text, and the URL suffix values for dynamic URL buttons. No other components should be provided in the request payload, as only personalized elements require runtime values.

    In the example above, only the placeholders from the Message Body and Card Body Text, the Card Media Header (image), and the dynamic URL button with its corresponding URL suffix value were included in the send request body. This is because only these elements require personalized values at runtime.

    Although two Quick Reply buttons were defined during template creation, they are not included in the send request, since they do not require dynamic values and were already approved as part of the template structure by Meta. Likewise, the static URL button defined in the second card is not included because it does not include dynamic parameters and is part of the approved template.

    Additionally, if the Message Body or Card Body Text does not contain placeholders, they should not be included in the send request body.

    This ensures that only dynamic and personalized elements are provided at send time, while static components remain defined by the approved template.

Main Parameters

Parameter Required Description
templateName Yes Name of the template created in your WhatsApp Business Account.
templateId No Unique identifier of the message template.
from Yes

Phone number of the sender.

Phone number provided during the WABA account setup will be used as the sender of the notification message.

Only accepts numeric characters. Do not include the "+" sign.

to Yes Determines the destination phone number for your template message. Numbers are specified in E.164 format → (‘+’ and a country code).
templateLanguage Yes

Template Language you set when creating the template.

Currently the API supports 3 Languages: English, Spanish and Portuguese. Required if you want to send templates in languages other than English.

English: "en"

Spanish: "es"

Portuguese: "pt_BR", "pt_PT"

type Yes

Specifies the type of message template being sent.

For carousel message templates, this value must be set to "carousel".

placeholders Yes

Only applies if the "BODY" type (Message Body) contains personalized fields (placeholders).

Object of personalized fields (placeholders) containing the message body.

From the "placeholders" object, set as parameter the placeholder you configured that is inside double curly braces {{...}} when creating the message template. Then set the value of the placeholder parameter.

The placeholders must be correctly formatted in order of how the message template was created.

For example, for a message body like “Here is your {{code}}”, you would set the placeholder as "code": "34871".

Carousel cards parameters

Parameter Required Description
cards Yes

Array that defines the content of each card in the carousel at send time.

Each object in this array corresponds to a card defined in the message template and must follow the same order.

cards.
cardIndex
Yes

Specifies the position of the card within the carousel.

This value is zero-based, meaning the first card starts at 0, the second at 1, and so on.

Each cardIndex must match the order in which the cards were defined in the approved template, ensuring that the correct content, placeholders, and dynamic values are applied to the corresponding card.

cards.
templateHeader
Yes

Only applies if the carousel message template created contains the "HEADER" type (Card Media Header).

Defines the media content (Image or Video) chosen when creating the message template.

cards.
templateHeader.
type
Yes

Only applies if the carousel message template created contains the "HEADER" type (Card Media Header).

Enter the media header option chosen when creating the message template in lower case: "image", "video".

cards.
templateHeader.
url
Yes

Only applies if the carousel message template created contains the "HEADER" type (Card Media Header).

if you set the Video or Image as Media Header option when creating the message template, enter the URL of the chosen media.

The URL of the card media header (image or video) must be a valid URL that starts with "https://…" and provides a direct download. Redirects are not supported.

cards.
placeholders
Yes

Only applies if the "BODY" type (Card Body Text) contains personalized fields (placeholders).

Object of personalized fields (placeholders) containing the card body text.

From the "placeholders" object, set as parameter the placeholder you configured that is inside double curly braces {{...}} when creating the message template. Then set the value of the placeholder parameter.

The placeholders must be correctly formatted in order of how the message template was created.

For example, for a body text like “Here is your {{code}}”, you would set the placeholder as "code": "34871".

cards.
templateButtons
Yes

Only applies if the message template created contains the "BUTTONS" type (card buttons) with a Dynamic URL.

Array of card button objects used to provide URL suffix values for dynamic URL buttons defined in the message template.

Quick Reply card buttons and static URL card buttons must not be included in the send request body, as they are already part of the approved message template structure.

cards.
templateButtons.
type
Yes

Only applies if the message template created contains the "BUTTONS" type (card buttons) with a Dynamic URL.

Specifies the type of dynamic button being sent.

For dynamic URL card buttons, this value must be set to "cta".

cards.
templateButtons.
values
Yes

Only applies if the message template created contains the "BUTTONS" type (card buttons) with a Dynamic URL.

Array of values (URL Suffix value) used to replace the URL suffix defined in the dynamic URL button.

cards.
templateButtons.
values.
index
Yes

Only applies if the message template created contains the "BUTTONS" type (card buttons) with a Dynamic URL.

The index parameter specifies the position of a button as defined during the message template creation process. This index determines the order of the buttons within the message template and is crucial for correctly mapping the button actions when sending the message template.

The index value corresponds to the button’s position in the message template, starting from 0 for the first button, 1 for the second.

The order defined during message template creation must be maintained when sending the message template.

For detailed information on set the position index of the button when sending WhatsApp Carousel Message Templates, refer to Position Index (Buttons).

cards.
templateButtons.
values.
value
Yes

Only applies if the message template created contains the "BUTTONS" type (card buttons) with a Dynamic URL.

Enter the URL suffix value to replace the URL Suffix in the dynamic URL. This URL suffix value corresponds to the dynamic portion of the URL suffix defined during the template creation process.

Remember, dynamic URLs in WhatsApp message templates allow for the inclusion of personalized links in buttons, making it possible to provide unique URLs for each recipient. These dynamic URLs are defined using the (URL suffix) (e.g., {{orderID}}) , which is replaced with the actual value (URL suffix value) (e.g., "141518") when sending the message template.

For detailed information on set dynamic URLs when sending WhatsApp Carousel Message Templates, refer to Dynamic URLs (Card Buttons).

When you send a Carousel Message Template, the response body contains the following data:

{
  "meta": {
    "timestamp": 17755683,
    "transactionId": "00b79c0af089dd82"
  },
  "data": {
    "id": "77fae259575b2",
    "body": null,
    "from": "525500000000",
    "to": "+525511111111",
    "date": "2023-02-08T14:43:55.689921048Z",
    "statusDate": "2026-04-06T02:59:05.679606142Z",
    "externalId": null,
    "owner": "[email protected]",
    "operator": "[email protected]",
    "status": "QUEUED",
    "providerId": null
  }
}

Parameters presented in the response body example when sending a Carousel Message Template are the following:

Parameter Description
data Data contained in the Message object.
data.
id
Unique identifier of the WhatsApp message.
data.
body

Content of the WhatsApp message.

data.
from

Phone number of the sender.

Phone number provided during the WABA account setup will be used as the sender of the notification message.

Only accepts numeric characters. Do not include the "+" sign.

data.
to
Determines the destination phone number for your message. Numbers are specified in E.164 format → (‘+’ and a country code).
data.
date
Date when the message has been sent.
data.
statusDate
Date when the last update or status change.
data.
externalId
Alphanumeric identifier used for reporting purposes.
data.
owner
Owner or creator of the message.
data.
operator
User who is a member of the owner or creator’s space.
data.
status

When a Message is sent, the system assigns one of the following possible statuses to an WhatsApp message:

  • "CODE_NOT_ALLOWED": Messangi suggests that the WhatsApp Business Account (WABA) used is either not activated on the platform or lacks the capability to message the recipient. Additionally, it could be because the owner does not have a WABA assigned , which is required to send the message.

    Contact our support team to verify the WABA.

  • "INCOMPLETE": Messangi indicates that a personalized WhatsApp message was sent without the necessary placeholder data filled in.

    Please note, personalized messages are those that feature dynamic fields—like "Name", "Phone Number", "Last Name", and similar—which need to be populated before sending.

  • "BLACKLISTED": Messangi indicates that the intended recipient's phone number is on a blacklist, preventing any messages from being sent to that number.

    When a number is blacklisted, it is essentially blocked from receiving any further communications from the sender's number or campaign, ensuring that no messages are delivered to that recipient.

  • "QUOTA_EXCEEDED": The WhatsApp Business Account (WABA) has surpassed the allowed limit for sending messages within a specified period, as defined by WhatsApp's messaging policies or limits.

  • "SENT": Indicates that the message has been successfully dispatched from our system and is en route to META. This status means that the message is on its way to the recipient but does not confirm that the message has been delivered to the end user. It signifies a successful handoff to the next stage in the message delivery process.

  • "DELIVERED": Messangi has received confirmation of message delivery from META.

    The message has successfully reached the recipient's device. This status confirms that the message not only was sent and processed by META but also was received by the intended recipient's WhatsApp application, ensuring that the communication was successfully completed.

  • "READ": Indicates that the recipient has opened and seen the message.

  • "FAILED": Indicates that META could not deliver the message to the recipient's device.

data.
providerId
Unique identifier of the provider. The support team provides this Id once the account has been approved.

If your business has already engaged in communication with a customer through broadcasts or automations, and the customer has contacted your business within the last 24 hours, you can send a session message without using a message template. To reply to messages, go to the Creating WhatsApp Session Messages.