WhatsApp Carousel Templates: Media and Product Cards
A single product photo with a "Shop now" button is fine. But if you are announcing a new range, five products in five separate messages is spam, and one collage image with five links is unreadable. Customers want to swipe.
A WhatsApp carousel template does exactly that: one message with a line of body text and a row of horizontally scrollable cards, each with its own image or video, short description and buttons. There are two kinds, media card carousels that send people to your website and product card carousels that keep them inside WhatsApp, plus non-template carousels you can send while a chat is open.
This guide covers the structure, the limits Meta publishes as of October 2026, working create and send payloads, and how to get carousels approved.
Two carousel templates, plus two in-chat versions
| Media card carousel template | Product card carousel template | |
|---|---|---|
| Category | Marketing only | Marketing only |
| Cards | 2 to 10, fixed at creation | Define 2 at creation, send up to 10 |
| Card header | Image or video you upload | Product image from your catalog |
| Card buttons | Up to 2: quick reply, URL or phone | One View button or one URL button |
| Where the purchase happens | Your website | Inside WhatsApp (View) or your site (URL) |
| Needs a catalog | No | Yes, with inventory, connected to your account |
| Order webhook | No | Yes, for View-button carts |
Both are templates, so they can go to opted-in customers at any time. While a customer service window is open you can also send interactive carousels with no template: an interactive media carousel (2 to 10 cards, image or video headers, card body up to 160 characters) or an interactive product carousel (2 to 10 product cards from one catalog). Our guide to interactive messages covers the in-window formats.
Because carousels are marketing only, every carousel template is billed at the marketing rate for the recipient's market, as one message. Our breakdown of marketing message cost explains how that rate works.
Media card carousel rules
Meta's media card carousel page sets these rules:
- Main body: required, up to 1,024 characters, supports variables. No header or footer on the message itself.
- Cards: minimum 2, maximum 10. The number is fixed when you create the template, and an approved template can only send exactly that many.
- Card header: image or video, uploaded with the Resumable Upload API. Meta crops media to a wide ratio based on the device, so keep key content centred.
- Card body: optional, up to 160 characters. If any card has body text, every card must, so the cards stay the same height.
- Card buttons: up to 2 per card, mixing quick reply, URL and phone number. Labels up to 25 characters. URLs up to 2,000 characters, with one variable appended at the end.
- Consistency: every card must have the same components. If card one has a quick reply and a URL button, so does card ten.
That last rule shapes the design. Pick one structure, such as image, short line, "Shop" link and "More like this" reply, and repeat it.
Creating a media card carousel
Here is a two-card template with a body variable, an image header per card, a quick reply and a URL button that takes a product slug. The examples use v23.0; use the current Graph API version from Meta's changelog.
curl -X POST "https://graph.facebook.com/v23.0/WABA_ID/message_templates" \
-H "Authorization: Bearer $WHATSAPP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "winter_range_carousel_v1",
"language": "en",
"category": "marketing",
"components": [
{
"type": "body",
"text": "Hi {{1}}, our winter range just landed. Swipe to see two favourites.",
"example": { "body_text": [["Priya"]] }
},
{
"type": "carousel",
"cards": [
{
"components": [
{ "type": "header", "format": "image", "example": { "header_handle": ["HEADER_HANDLE_1"] } },
{
"type": "buttons",
"buttons": [
{ "type": "quick_reply", "text": "More like this" },
{ "type": "url", "text": "Shop", "url": "https://example.com/p/{{1}}", "example": ["wool-coat"] }
]
}
]
},
{
"components": [
{ "type": "header", "format": "image", "example": { "header_handle": ["HEADER_HANDLE_2"] } },
{
"type": "buttons",
"buttons": [
{ "type": "quick_reply", "text": "More like this" },
{ "type": "url", "text": "Shop", "url": "https://example.com/p/{{1}}", "example": ["knit-scarf"] }
]
}
]
}
]
}
]
}'
HEADER_HANDLE_1 stands for the handle returned when you upload each sample image. Reviewers see those images, so upload the real product shots, not placeholders.
Sending it
At send time you supply the body values, then one entry per card with its card_index (starting at 0), the header media and the button values. Upload media first with POST /PHONE_NUMBER_ID/media and use the returned IDs.
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "+919811122233",
"type": "template",
"template": {
"name": "winter_range_carousel_v1",
"language": { "code": "en" },
"components": [
{ "type": "body", "parameters": [{ "type": "text", "text": "Priya" }] },
{
"type": "carousel",
"cards": [
{
"card_index": 0,
"components": [
{ "type": "header", "parameters": [{ "type": "image", "image": { "id": "MEDIA_ID_1" } }] },
{ "type": "button", "sub_type": "quick_reply", "index": "0", "parameters": [{ "type": "payload", "payload": "more_coats" }] },
{ "type": "button", "sub_type": "url", "index": "1", "parameters": [{ "type": "text", "text": "wool-coat" }] }
]
},
{
"card_index": 1,
"components": [
{ "type": "header", "parameters": [{ "type": "image", "image": { "id": "MEDIA_ID_2" } }] },
{ "type": "button", "sub_type": "quick_reply", "index": "0", "parameters": [{ "type": "payload", "payload": "more_scarves" }] },
{ "type": "button", "sub_type": "url", "index": "1", "parameters": [{ "type": "text", "text": "knit-scarf" }] }
]
}
]
}
]
}
}
Button index values must match the order defined on the template. Meta's docs give the example: if the URL button is second, sending it with index 0 fails with "Parameter value for URL was expected but was not found". When a customer taps a quick reply, the payload you set (such as more_coats) arrives in your messages webhook, which tells you exactly which card they liked. URL taps open your website, so purchases there produce no WhatsApp order webhook; track them on your site.
Product card carousels
Product card carousels pull title, price and image from your Meta product catalog, so you don't upload media. You define exactly two cards when creating the template, with a product header and either an spm (View) button or a URL button, and the approved template can then send up to 10 cards.
With View buttons the customer opens the product, adds it to a cart and places the order without leaving WhatsApp. That triggers an order webhook and an order confirmation in the chat. With URL buttons they go to your site instead, and no order webhook fires. You need an e-commerce catalog with inventory connected to your WhatsApp Business Account before any of this works.
Choose View buttons when your checkout can take WhatsApp orders, and URL buttons when you rely on your site's checkout, promo codes and upsells.
Getting carousels approved and working
Carousel templates go through normal template review, with more surface for problems. What helps:
- Write a body that stands alone. It is the message's main text, so say what the carousel is ("our winter range just landed"), not "check these out".
- Use the right category. Carousels are marketing only, so don't try to file one as utility.
- Follow the variable rules. No variable at the start or end of the body, none side by side. Our guide to a rejected WhatsApp template lists the common traps.
- Pick the card count you will actually send. A media card template locks the number of cards, so a 4-card template can't send 3. Create separate templates for different counts.
- Use a URL variable for the product, not a separate template per product. One
https://example.com/p/{{1}}button covers your whole range. - Test video cards on Android. Meta's video guidance says H.264 "High" profile files with B-frames aren't supported on Android WhatsApp; use the Main or Baseline profile.
Two scheduling notes. Marketing templates move from the Cloud API to the Marketing Messages API on October 13, 2027, and Meta lists carousels among the formats the new API supports. And Meta does not currently deliver marketing templates to US phone numbers, so carousel campaigns to the US fail with error 131049.
Where Tenashi fits
Carousels earn their keep in promotional campaigns to opted-in lists on the official API. A lot of product sharing, though, happens in conversations: a customer asks what is new, a distributor group wants this week's stock, a repeat buyer asks for options in their size.
Tenashi gives your team one shared inbox on the number customers already message, connected as a linked device rather than through the official platform. It doesn't send carousels or buttons, but your team (or the API) can send product photos with captions, up to 5 MB per image, into DMs and into WhatsApp groups your number is already in, using a conversation ID. Replies land in a shared inbox with a CRM and deal pipeline under each chat, at a flat price from $18/mo. Sends are paced, there is no green tick, and WhatsApp can still ban numbers that spam, so it is not a tool for blasting carousels to cold lists. Our complete guide to the WhatsApp API compares both routes.
Read the API docs · Get started
FAQ
How many cards can a WhatsApp carousel template have?
Up to 10. A media card carousel template needs between 2 and 10 cards, and the count is fixed at creation, so an approved template always sends exactly that number. A product card carousel template is created with two cards and can then send up to 10 product cards from your catalog.
Can I use a carousel template for utility messages?
No. Meta says carousel cards are only available for marketing template messages, and both media card and product card carousel templates must use the marketing category. For a non-promotional set of options inside an open chat, an interactive media carousel or a list message is the better fit.
What buttons can each carousel card have?
In a media card carousel template, each card can have up to two buttons, mixing quick reply, URL and phone number buttons, and every card must use the same combination. Product card carousels use a single View button that opens the product inside WhatsApp, or a single URL button to your website.
How is a carousel template charged?
Meta describes a carousel template as a single marketing template message, so it is billed once at the marketing rate for the recipient's market, not per card. Marketing rates vary by country, get no volume discount, and any provider fees come on top. Check Meta's current rate card for your markets.
Do I need a product catalog to send a carousel?
Only for product card carousels, which pull product names, prices and images from a Meta e-commerce catalog connected to your WhatsApp Business Account. Media card carousels don't need a catalog: you upload your own images or videos for each card and link each one to your website.
Carousels sell to lists; conversations sell to people. For the second part, get started with Tenashi.