01 · Definition
What is an interactive CTA URL message?
An interactive CTA URL message (interactive.type: "cta_url") is a free-form WhatsApp message made of body text and a single button that opens a web page when tapped. It lets an agent or a bot hand a customer a link — a payment page, a booking form, a document portal — as a clean, labelled button such as "Pay now" instead of a long URL pasted into the text.
The payload has four parts: an optional header (text up to 60 characters, or an image, video or document fetched from a public URL), a required body.text of up to 1,024 characters, an optional footer.text of up to 60 characters, and an action with name: "cta_url" and parameters holding display_text — the button label, up to 20 characters — and url. Tapping the button opens the page in the phone's default browser.
It is the session-message counterpart of a template URL button, and narrower than the CTA button overview, which also covers template URL and phone buttons. Because no approval is needed, the link can differ on every send, but the message can go out only while a customer service window is open. It carries one button and sends nothing back to the business when tapped. Compared with a link preview, which decorates the first URL in a text message, a CTA URL message hides the URL behind a label.
Key takeaways
- An interactive CTA URL message is a free-form message with body text and one button that opens a URL, so no raw link appears in the chat.
- Set
interactive.typeandaction.nametocta_url; the button label,display_text, is up to 20 characters. - The body runs to 1,024 characters; an optional header (text, image, video or document) and a 60-character footer frame it.
- Like every session message it needs an open customer service window; outside it, use a template with a URL button.
- Meta sends no webhook when the user taps the button, so count clicks on your own link.
02 · Specifications
An interactive CTA URL message: key facts and limits
| interactive.type | cta_url (action.name cta_url too) |
|---|---|
| Buttons | 1 URL button |
| Button label (display_text) | Up to 20 characters |
| Body | Required, up to 1,024 characters |
| Header | Optional: text (60), image, video or document |
| Footer | Optional, up to 60 characters |
| When you can send | Inside an open customer service window |
| Tap webhook | None — measure clicks on your URL |
03 · Code samples
An interactive CTA URL message in code
curl -X POST "https://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/messages" \-H "Authorization: Bearer {ACCESS_TOKEN}" \-H "Content-Type: application/json" \-d '{"messaging_product": "whatsapp","recipient_type": "individual","to": "919812345678","type": "interactive","interactive": {"type": "cta_url","header": { "type": "text", "text": "Reschedule your session" },"body": { "text": "Pick any free slot this week. Your current booking stays until you choose." },"footer": { "text": "Link valid for 24 hours" },"action": {"name": "cta_url","parameters": {"display_text": "See free slots","url": "https://book.example.in/r/7Kq2Xw?utm_source=whatsapp&utm_medium=chat"}}}}'
Inside an open customer service window only. display_text is capped at 20 characters.
04Playground
A working model of Interactive CTA URL Message. Use its controls to replay it step by step.
Raw link or a labelled button?
Today
- Customer: Hi, can I move Thursday's session? Something came up.10:30
- Pune Physio Clinic: Sure! Use this: https://book.example.in/patients/reschedule?booking=PNQ-88213&token=7Kq2Xw9rT4&src=chat10:31Read
- Customer: Is that link safe? It looks a bit strange.10:32
- Pune Physio Clinic: Reschedule your sessionPick any free slot this week. Your current booking stays until you choose.Link valid for 24 hours10:33ReadSee free slots
- Customer: Done, moved to Friday 6 pm. Thanks!10:34
Message 5 of 5
CustomerText
The tap itself sent no webhook. The clinic knows because its booking page, tagged utm_source=whatsapp, recorded the visit.
Free-form text. A business can send it only within 24 hours of the customer’s last message.
Message 5 of 5: Customer, Text. The tap itself sent no webhook. The clinic knows because its booking page, tagged utm_source=whatsapp, recorded the visit.
05 · Operation
How does an interactive CTA URL message work?
Check the window
Confirm the customer has messaged in the last 24 hours. If not, send an approved template with a URL button instead; a cta_url message would fail.
Generate the link
Create a short, per-customer URL — a payment link or a signed booking link — on a domain you control, and add UTM parameters so the visit is attributed to WhatsApp.
Build the message
Set
type: "interactive",interactive.type: "cta_url", a body that says why to tap, andaction.parameterswithdisplay_textandurl. Add a header image or document if it helps the decision.Send and keep the wamid
POST to
/{PHONE_NUMBER_ID}/messagesand store the returned wamid next to the link, so delivered and read statuses map to it.Measure on your side
No webhook reports the tap. Count visits on the URL itself, through a redirect you control or UTM-tagged analytics.
06 · Cautions
Common mistakes with an interactive CTA URL message
Sending it outside the window
It is a free-form message, so after 24 hours of customer silence it fails. Use an approved template with a URL button instead.
Waiting for a click event
Meta does not report taps. Put a redirect or UTM tags on the link so you can count them yourself.
Labels written for templates
display_textallows 20 characters, fewer than a template button's 25. "View your invoice" fits; "Click to view your invoice" does not.Media headers behind a login
Image, video and document headers are fetched from a public URL. A private or quickly expiring link leaves the header broken.
A link in every reply
Sending customers out of the chat for every step makes support feel like a website. Use cta_url when the task really happens on a page.
07 · Worked example: Rescheduling a physio session in Pune
Example: Rescheduling a physio session in Pune
A Pune physiotherapy clinic's receptionist is chatting with a patient who needs to move Thursday's session. Her first attempt pastes a 90-character booking link, and the patient asks whether it is safe. She resends it as a CTA URL message: header "Reschedule your session", body "Pick any free slot this week. Your current booking stays until you choose.", button "See free slots". The link carries the patient's booking token and utm_source=whatsapp; the clinic's booking system shows the page opened two minutes later and the session moved to Friday at 6 pm.
08 · Rationale
Why does an interactive CTA URL message matter?
Raw links in chat look like phishing, wrap across several lines and break when copied, and customers have been taught not to tap them. A labelled button looks native and tells the customer what will happen. For support and sales teams working inside the window, it is the simplest way to move someone to a checkout, a document upload or a reschedule page with a link generated for that conversation — without creating and approving a new template for every destination.
09 · Recommended practice
Best practices for an interactive CTA URL message
- Put the reason to tap in the body and the outcome in the label: body "Your invoice is ready", button "View invoice".
- Use a short redirect on your own domain so you can change the destination and count clicks in one place.
- Pair a document header with the link when the customer needs both a copy and an action.
- For a choice between options, send reply buttons; for one destination, send cta_url.
10 · Questions and answers
Interactive CTA URL Message FAQs
- Can I send a WhatsApp message with a link button without a template?
- Yes, inside an open customer service window. Send an interactive message with type cta_url, a body and one button whose display_text and url you choose for that message.
- How many buttons can a CTA URL message have?
- One. The cta_url message carries a single URL button; for several options use reply buttons or a list, or a template, which can hold up to two URL buttons.
- What is the character limit for the button text in a cta_url message?
- Twenty characters for display_text. The body can run to 1,024 characters and the header and footer to 60 each.
- Do I get a webhook when the user taps the link?
- No. Meta reports delivery and read statuses for the message, but not the tap. Count clicks on the destination with a redirect or UTM parameters.
- How is a CTA URL message different from a template URL button?
- Approval and timing. A cta_url message is free-form, needs an open window and can use any link each time; a template URL button is approved in advance, can be sent at any time and can end in a variable suffix.