> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zeotap.com/llms.txt
> Use this file to discover all available pages before exploring further.

# WhatsApp

## Overview

WhatsApp Business API is a leading messaging platform that enables businesses to communicate with customers at scale through the world's most popular messaging app. It allows companies to send automated notifications, provide customer support, and run marketing campaigns without coding, triggering personalized messages, interactive buttons, and rich media content in real-time based on customer behavior. Integrating seamlessly with existing business systems via robust APIs, WhatsApp Business API helps drive customer engagement, support efficiency, and conversational commerce across global markets. It provides end-to-end encryption, template messaging, and analytics to optimize communication strategies while maintaining WhatsApp's trusted user experience and achieving improved customer satisfaction and conversion rates. This integration with Zeotap enables you to send messages through WhatsApp.

## Pre requisites

1. You must have a verified **WhatsApp Business Account**.
2. You must have a verified **Facebook Business Manager Account**.
3. You'll need a **phone number** to associate with your **WhatsApp Business Account**. This number will be used for sending and receiving messages through the API.
4. You **must register your phone number** using the **WhatsApp Cloud API** to receive its unique **Phone Number ID**. This is done by making a POST request to the /\<PHONE\_NUMBER\_ID>/register endpoint.

```bash Bash (Unix Shell) theme={null}
curl --location 'https://graph.facebook.com/v23.0/{PHONE_NUMBER_ID}/register' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {ACCESS_TOKEN}' \
--data '{
    "messaging_product": "whatsapp",
    "pin": "{6_DIGIT_PIN}"
}'
```

5. **Template Creation** and Approval: All message **templates** must be created in the WhatsApp Manager and approved by Meta. It's best practice to use named variables **(like {`{customer_name}`})** instead of numbered ones for clarity and easier management.

<Frame>
  <img src="https://mintcdn.com/zeotap/kEe8zTZlpZky9cq1/articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_1.png?fit=max&auto=format&n=kEe8zTZlpZky9cq1&q=85&s=96e9eb949bb2720732c618128c38e0b3" width="1067" height="733" data-path="articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_1.png" />
</Frame>

6. You must generate a System User access token with the correct permissions (whatsapp\_business\_management, whatsapp\_business\_messaging, whatsapp\_business\_manage\_events) and configure a webhook to receive message status updates and replies.

<Note>
  **Templates with media**

  A template can carry an image or a video in its header. Add the media header when you create the template in WhatsApp Manager and get it approved before you map it in Zeotap — the header on the approved template is what decides whether you send an image or a video.
</Note>

## Creating a Destination

<Steps>
  <Step>
    Log into the Zeotap CDP App and go to the DESTINATIONS application.
  </Step>

  <Step>
    Click + Create Destination.
  </Step>

  <Step>
    Under All Destinations, search for **WhatsApp**.
  </Step>

  <Step>
    Click on WhatsApp. A screen appears displaying details about the particular destination towards the left. On the right-hand side of the screen find a list of fields that are required for the integration to be established. Enter the required details as mentioned in the following steps:

    a. Enter a name for the Destination. <br />
    b. Enter the **Access** **Token**. <br />
    c. Enter the **Phone Number ID**. <br />

    <Note>
      **Template Name** and **Language** are no longer entered here. They now sit under **Additional Settings** on the Mapping screen, so a single destination can serve as many templates as you need — one mapping per template.
    </Note>

    <Frame>
      <img src="https://mintcdn.com/zeotap/dz2IJRwTpXeq8k2P/articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_2.png?fit=max&auto=format&n=dz2IJRwTpXeq8k2P&q=85&s=2898da3c6c6cca468e31f463eae0f293" width="1600" height="923" data-path="articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_2.png" />
    </Frame>
  </Step>

  <Step>
    In the new screen that appears, choose the Action and complete the mapping.

    a. Under **Choose your Action**, select **Send data to message template**. <br />
    b. Under **Map the Fields**, map the recipient's phone number to **to** in the **Contact Attribute** section. This field is mandatory. <br />
    c. In the **Message Template** section, click +**Add Mapping Field** and add one row for each variable in your approved template, **entering your exact template variable name** in the field on the right — for example `first_name` and `order_id`. <br />

    <Frame>
      <img src="https://mintcdn.com/zeotap/dz2IJRwTpXeq8k2P/articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_3.png?fit=max&auto=format&n=dz2IJRwTpXeq8k2P&q=85&s=edd82ce49c0dd7d510bcdbdd85ef819f" width="1600" height="923" data-path="articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_3.png" />
    </Frame>

    d. *(Optional)* To send media with the message, map it in the **Image** or **Video** section — either the **Image ID** / **Video ID**, or the **Image Link** / **Video Link**. <br />
    e. Under **Additional Settings**, enter the **Template Name** — the name of the approved WhatsApp message template, such as `order_confirmed` — and select the **Language**. Both are required. Refer to the [WhatsApp Supported Languages](https://developers.facebook.com/documentation/business-messaging/whatsapp/templates/supported-languages) documentation to identify the correct language code corresponding to the language selected when creating your template. <br />
    f. Click **Save Mapping**.

    <Warning>
      **One medium per message, one source per medium.**

      A message can carry either an image or a video — not both. For whichever you use, map either the ID or the link, never both on the same medium.
    </Warning>

    <Frame>
      <img src="https://mintcdn.com/zeotap/dz2IJRwTpXeq8k2P/articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_7.png?fit=max&auto=format&n=dz2IJRwTpXeq8k2P&q=85&s=8ccddf5a8f9d461e3e90e6ac60658852" width="1600" height="923" data-path="articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_7.png" />
    </Frame>
  </Step>
</Steps>

### Using hosted image or video links

A **Media ID** points at a file you have already uploaded to Meta. A **link** points at a file hosted on your own infrastructure, which Meta fetches at send time. Both work, but they fail in different ways.

**Your message will not send unless the link meets all of these:**

* **Reachable** — the URL is publicly accessible over HTTPS, with no authentication, login wall, redirect or bot protection. Meta's media fetcher has to reach the file directly.
* **Supported file** — a supported format (JPEG or PNG for images), 8-bit RGB or RGBA, and within Meta's size limits (5 MB or less for images).
* **Correct headers** — the server returns the right `Content-Type` for the file.

**Before you rely on links in production, also weigh:**

* **Reliability** — Meta re-fetches the media on *every* send. If your host is slow, unavailable or rate-limiting, the message fails to deliver. This is the main reason Meta recommends Media IDs.
* **URL stability** — moving, renaming or deleting the file breaks every send after that point.
* **Security** — do not put any PII in the URL. It travels in plaintext and can end up in logs.
* **Debuggability** — a failed link usually surfaces as a generic fetch error, whereas Media ID failures come back with a clear reason.

<Tip>
  **Meta recommends Media IDs for production.** Upload the media to Meta once and every later send simply references the stored asset — no dependency on your own hosting at delivery time, no repeated fetches, and clearer error reporting when something does go wrong. Hosted links are well suited to quick testing, but not to production traffic.
</Tip>

## Activate the Destination on Journeys

After creating a destination, next, you need to link it in the Send to Destination node within the workflow, as explained below.

<Steps>
  <Step>
    In the workflow, click + and choose Send to Destinations.

    <Frame>
      <img src="https://mintcdn.com/zeotap/kEe8zTZlpZky9cq1/articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_4.png?fit=max&auto=format&n=kEe8zTZlpZky9cq1&q=85&s=d45f30cc8c76e4838a69be4637253795" width="1032" height="542" data-path="articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_4.png" />
    </Frame>
  </Step>

  <Step>
    Choose the destination from the list of available destinations by using the search feature.

    <Frame>
      <img src="https://mintcdn.com/zeotap/kEe8zTZlpZky9cq1/articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_5.png?fit=max&auto=format&n=kEe8zTZlpZky9cq1&q=85&s=58493a0c91e2a6d0205c2e4f16fba62e" width="1600" height="891" data-path="articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_5.png" />
    </Frame>
  </Step>

  <Step>
    Under the Destination Details tab, the Access Token and Phone Number ID fields are automatically populated based on the value that you have entered while creating the destination.
  </Step>

  <Step>
    Under the Destination Settings tab, choose the Action and mapping as per your requirement.
  </Step>

  <Step>
    Upon clicking Save Destination. The destination is attached as shown in the image below.

    <Frame>
      <img src="https://mintcdn.com/zeotap/kEe8zTZlpZky9cq1/articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_6.png?fit=max&auto=format&n=kEe8zTZlpZky9cq1&q=85&s=078e666c39c56eac81d3b35cb326979e" width="1056" height="992" data-path="articles/integrate-customer/Storage/integrate-customer/whatsapp/whatsapp_6.png" />
    </Frame>
  </Step>
</Steps>
