MoEngage WhatsApp Integration

Send your approved WhatsApp templates to any MoEngage segment through your DoubleTick number, using a MoEngage Connector campaign.

Use a MoEngage Connector campaign to send your approved WhatsApp templates to any MoEngage segment, through your DoubleTick number.

This integration allows MoEngage to:

  • Send approved WhatsApp templates to any MoEngage segment
  • Personalise each message with the user's details from MoEngage
  • Send templates with images, videos, documents, buttons and carousels

Prerequisites

Before starting the integration, make sure you have:

  1. An active DoubleTick account
  2. Your DoubleTick API Key
  3. The exact name and language of an approved template
  4. Access to MoEngage Dashboard

📘

NOTE

If you do not have your DoubleTick API Key, you can obtain it by following this guide:
https://docs.doubletick.io/docs/quickstart-guide#step-2-generate-your-api-key


Step 1 — Create a Custom Connector campaign

  1. Login to your MoEngage Dashboard.
  2. Navigate to: Engage → Create campaign
  3. Open Connector → Custom.
  4. Choose One Time (or Periodic / Event Triggered).
MoEngage New Campaign menu with Connector → Custom selected, showing the One Time, Periodic and Event Triggered options

Step 2 — Choose who gets it

  1. Name the campaign.
  2. Choose Filter users by → Custom segment.
  3. Pick your segment and click Show count.
MoEngage campaign audience set to Filter users by a custom segment, with the Show count results

Step 3 — Point it at DoubleTick

On the Content step fill in exactly:

Add Headers

KeyValue
Authorizationdoubletick-api-key
Content-Typeapplication/json

🚧

IMPORTANT

The Authorization header must contain your DoubleTick API Key: just the key, no "Bearer".

MoEngage Content step with the POST method, the DoubleTick webhook URL, and the Authorization and Content-Type headers

Step 4 — Paste the message body

  1. Set Body type to Raw (not JSON).
  2. Paste the body for your template from the Message body examples below.

🚧

IMPORTANT

Use Raw body type. MoEngage's JSON option can't hold these bodies.

MoEngage Content step with Body type set to Raw and a sample DoubleTick message body

Step 5 — Schedule and publish

  1. Pick As soon as possible or a date and time.
  2. Click Publish.

Sending usually starts within 1–3 minutes.

MoEngage Schedule and goals step with the campaign send date and time

Step 6 — Check the results

  1. Open the campaign and click Refresh.
  2. Analytics shows Attempted, Sent and Failed.

The counts can take a few minutes to catch up.

MoEngage campaign analytics showing the Attempted, Sent and Failed To Send counts

📘

NOTE

"Sent" in MoEngage means DoubleTick accepted the message, not that WhatsApp delivered it. Delivered, read and failed statuses come to your DoubleTick status webhook (with your customData), not back to MoEngage. Set one up in Webhooks.


Message Body Examples

The body tells DoubleTick who to send to and which template to use. Anything in {{UserAttribute['…']}} is filled in by MoEngage for each user. Only include the parts your template actually has.

FieldWhat to put
toThe user's number: {{UserAttribute['Mobile Number (Standard)']}}
from (optional)Which of your WhatsApp numbers sends it, with country code. Leave out to use your main number
templateName, languageExactly as approved, e.g. order_update and en
placeholdersValues for {{1}}, {{2}} … in order
customData (optional)Your own tags, returned to you with the message status

1. Simple template, no variables

{
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": { "templateName": "welcome_message", "language": "en" }
}

2. Personalised with the user's details

Template: "Hi {{1}}, your booking {{2}} is confirmed." Use default so a blank name still reads well.

{
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": {
    "templateName": "booking_confirmed",
    "language": "en",
    "templateData": {
      "body": { "placeholders": [
        "{{UserAttribute['First Name']|default('there')}}",
        "{{UserAttribute['booking_id']}}"
      ] }
    }
  }
}

3. With an image

{
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": {
    "templateName": "winter_offer",
    "language": "en",
    "templateData": {
      "header": { "type": "IMAGE", "mediaUrl": "https://cdn.example.com/winter.jpg" },
      "body": { "placeholders": ["{{UserAttribute['First Name']|default('there')}}"] }
    }
  }
}

For a video use "type": "VIDEO". The link must be public so WhatsApp can download it.

4. With a PDF (e.g. an invoice or itinerary)

{
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": {
    "templateName": "itinerary_ready",
    "language": "en",
    "templateData": {
      "header": {
        "type": "DOCUMENT",
        "mediaUrl": "https://cdn.example.com/trips/{{UserAttribute['booking_id']}}.pdf",
        "filename": "Itinerary.pdf"
      }
    }
  }
}

5. With a personalised link button

The button URL in the template ends with {{1}}, e.g. https://example.com/pay/{{1}}.

{
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": {
    "templateName": "pay_now",
    "language": "en",
    "templateData": {
      "body": { "placeholders": ["{{UserAttribute['due_amount']}}"] },
      "buttons": [ { "type": "URL", "parameter": "{{UserAttribute['booking_id']}}" } ]
    }
  }
}

6. With a coupon code to copy

{
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": {
    "templateName": "coupon_offer",
    "language": "en",
    "templateData": {
      "body": { "placeholders": ["WINTER25"] },
      "buttons": [ { "type": "COPY_CODE", "parameter": "WINTER25" } ]
    }
  }
}

7. Carousel (swipeable cards)

One entry per card, numbered from 0 in the template's order.

{
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": {
    "templateName": "top_destinations",
    "language": "en",
    "templateData": {
      "cards": [
        { "cardIndex": 0, "components": {
            "header": { "type": "IMAGE", "mediaUrl": "https://cdn.example.com/goa.jpg" },
            "body": { "placeholders": ["Goa"] } } },
        { "cardIndex": 1, "components": {
            "header": { "type": "IMAGE", "mediaUrl": "https://cdn.example.com/kerala.jpg" },
            "body": { "placeholders": ["Kerala"] } } }
      ]
    }
  }
}

8. From a specific number, with your own tracking tags

{
  "from": "+919800000000",
  "to": "{{UserAttribute['Mobile Number (Standard)']}}",
  "content": { "templateName": "welcome_message", "language": "en" },
  "customData": { "moe_user_id": "{{UserAttribute['ID']}}", "campaign": "diwali_2026" }
}

Good to Know

  • "Sent" in MoEngage means DoubleTick accepted the message, not that WhatsApp delivered it.
  • Delivered, read and failed statuses come to your DoubleTick status webhook (with your customData), not back to MoEngage.
  • Template name and language must match exactly. en and en_US are different templates, and the template must be approved on the number you send from.
  • Variables are filled in order ({{1}}, {{2}} …), and you need one value per variable.
  • Use Raw body type. MoEngage's JSON option can't hold these bodies.
  • Blank user details: if a user attribute is empty, add |default('…') so the message still makes sense and isn't rejected by WhatsApp.

If MoEngage Shows "Failed"

Reason shownWhat to do
Template with given name and language not foundCheck the template name, language, and that it's approved on the sending number
Template body placeholders are less / more…Send exactly one value per {{n}} in the template
No Connected WhatsApp Business Account…Fix from, or leave it out to use your main number
403 ForbiddenUse an API key from a user with access to all conversations

Integration Flow Overview

Once the setup is complete:

  1. MoEngage picks the users in your segment and fills in each user's details.
  2. DoubleTick checks the request and queues it in under a second.
  3. The template is delivered from your WhatsApp number.
  4. Delivery, read and failed statuses are sent to your DoubleTick status webhook.

What’s Next

Get delivery, read and failed statuses for your MoEngage messages, and see the full template message format.

Did this page help you?