LogoLogo
Become a PartnerStatus Page
  • get started
    • Welcome to 360Dialog
    • Quickstarts
      • Getting started as a partner
      • Register as a Meta Tech Provider
      • Add a WhatsApp Number
      • Set up Integrated Onboarding
      • Create a Message Template
      • Send a Message
    • Pricing & Billing
      • Payment Methods for BR: Pix & Boleto
      • Month Closing Invoice (MCI)
    • Get API Access
    • Tech Provider Program
      • Understanding the Meta Tech Provider Program
      • Becoming a Meta Tech Provider: A Step-by-Step Guide
  • MM Lite Beta Program
    • Onboarding
    • Sending Messages
    • MM Lite versus Cloud API
    • Expected Errors & Programming Languages
  • Voice Message Alpha Program
  • Partner & Account Management
    • Solutions for Partners
      • Benefits for Partners
      • Partner Hub
      • WABA Management
    • Account Setup & Management
      • Prerequisites and best practices for account creation
      • Account Structure
      • Account Creation
  • Integrations & API Development
    • Webhook Events & Setup
      • Webhook Events (Partner & Messaging API)
      • Webhook Configuration & Management
    • Integration Best Practices
      • Architecture and Security
      • Best Practices for Designing Integrations
        • Design a Stable Webhook Receiving Endpoint
      • Sizing Your Environment Based on Expected Throughput
      • Design a Resilient Message Sending Service
      • Integrated Onboarding
        • Basic Integrated Onboarding
        • Custom Integrated Onboarding
        • Host Your Own Embedded Signup
      • API Key Authentication for the Partner API
  • API Reference
    • Messaging API
    • Messaging Health Status
    • Sandbox (Test API Key)
    • Differences Between Cloud API and On-Premise API for Partners
      • [will be deprecated] Messaging with On-Premise API
    • Partner API
  • WABA Management
    • Managing WABA Accounts
      • Using the Partner Hub to manage Clients and Channels
      • Using the Partner API to manage Clients and Channels
      • Partner Permission to Generate API Key
      • Checking Usage & Statistics
    • Phone Number & Hosting
      • Migrating a Phone Number
        • Migrate number from Meta or alternate BSP to 360Dialog
        • Migrate a phone number to a new WABA
        • Migrate a phone number to a new WABA to change messaging Currency
      • WhatsApp Coexistence
        • Coexistence Onboarding
        • Coexistence Webhooks
        • Testing different messaging scenarios
      • Hosting type Change (On-premise API to Cloud API)
    • WABA Profile & Compliance
      • Display Name Guidelines
      • WABA Profile Info
      • WABA Policy Enforcement
      • Business Account Verification
    • Partner change (between 360Dialog Partners)
    • WhatsApp Flows
    • Accelerated Onboarding
    • Business Account Verification
  • Messaging
    • Sending & Receiving Messages
      • Conversations
      • Receiving messages
      • Before sending a message
    • Message Types
      • Conversational Components
      • Checklist for Message Broadcasts and Campaigns
      • Text messages
      • Interactive messages
        • Single and Multi Product Messages
        • Location Request Messages
        • Address Messages (India and Singapore only)
      • Contacts & Location Messages
    • Template Messages
      • Template Library
      • Template Elements
      • Sending Template Messages
      • Authentication Templates
        • Zero-Tap Authentication Templates
        • One-Tap Autofill Authentication Templates
        • Copy Code Authentication Templates
      • Catalog Templates
      • Product Card Carousel Templates
      • Single-Product Message Templates
      • Coupon Code Templates
      • Limited-Time Offer Templates
      • Multi-Product Templates
    • Media Messages
      • Upload, retrieve or delete media
    • Messaging Health & Troubleshooting
      • Messaging Limits & Quality Rating
      • Errors While Messaging
      • Messages statuses
  • Commerce & Payments
    • Payments (India Only)
      • Receive WhatsApp Payments via Payments Gateway
      • Receive WhatsApp Payments via Payment Links
      • Order Details Template Message
    • Payments (Singapore Only)
      • Receive WhatsApp Payments via Stripe
    • Payments API Brazil
      • Implementation
    • Products and Catalogs
      • India Businesses: Compliance for Commerce
  • Support & Updates
    • Help & Troubleshooting
      • FAQ
      • Error Code Reference
      • User Support Documentation
        • Tutorials
          • Page How to Troubleshoot Login Issues in the 360dialog Hub
          • How to Report an Issue
          • How to Contact Support
        • How-To Guides
          • Raise a Support Request
          • Requesting a Status Update for Business Verification
        • Reference
          • Troubleshooting Embedded Signup Issues
          • Commerce Policy Checks for WhatsApp API Access
          • Support Availability & SLAs
          • Incident Issue Prioritization
          • Case Types Table
        • Explanation
          • Why Business Verification Takes Time
          • Why Some Issues Are Not Emergencies
          • Understanding the Support Process
      • Support with Meta
    • Imprint & Data Privacy
    • Product Updates & News
      • How to ensure your Template Messages will be received
      • Integrated Onboarding new look and Campaigns Best Practices
Powered by GitBook
On this page
  • Main Difference: Just the Endpoint!
  • 🧪Try It Yourself
  • Sending a marketing message using the Cloud API:
  • Sending a marketing message using the MM Lite API:

Was this helpful?

  1. MM Lite Beta Program

MM Lite versus Cloud API

Let’s see how sending a marketing message works with the Cloud API — and how easy it is to do the same with MM Lite

PreviousSending MessagesNextExpected Errors & Programming Languages

Last updated 1 day ago

Was this helpful?

Main Difference: Just the Endpoint!

“You only need to update your endpoint to start using MM Lite.”

Feature
Cloud API
MM Lite

Base URL

https://waba-v2.360dialog.io/messages

https://waba-v2.360dialog.io/marketing_messages

Authentication

Same API Key

Same API Key

Payload Format

Identical

Identical

Webhook Behavior

Same structure

Same structure


🧪Try It Yourself

We recommend running your own tests by switching your endpoint and observing the results.

✅ No need to change payloads

✅ No need to change webhook logic

✅ Keep your existing token

MM Lite is designed to make your life easier. Start small: test one flow, and evaluate performance gains.

Currently, it is not possible to identify which end-user number clicked on the marketing message link.


Sending a marketing message using the Cloud API:

curl --location 'https://waba-v2.360dialog.io/messages' \
--header 'D360-API-KEY: <api_key>' \
--header 'Content-Type: application/json' \
--data '{
  "to": "<end_client_number>",
  "type": "template",
  "template": {
    "name": "<template_name>",
    "language": {
      "code": "<template_language_code>"
    },
    "components": []
  },
  "messaging_product": "whatsapp"
}'
import requests
import json

url = "https://waba-v2.360dialog.io/messages"
headers = {
    "D360-API-KEY": "<api_key>",
    "Content-Type": "application/json"
}

payload = {
    "to": "<end_client_number>",
    "type": "template",
    "template": {
        "name": "<template_name>",
        "language": {
            "code": "<template_language_code>"
        },
        "components": []
    },
    "messaging_product": "whatsapp"
}

response = requests.post(url, headers=headers, data=json.dumps(payload))

print(response.status_code)
print(response.json())
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("https://waba-v2.360dialog.io/messages")

headers = {
  "D360-API-KEY" => "<api_key>",
  "Content-Type" => "application/json"
}

payload = {
  to: "<end_client_number>",
  type: "template",
  template: {
    name: "<template_name>",
    language: {
      code: "<template_language_code>"
    },
    components: []
  },
  messaging_product: "whatsapp"
}

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri, headers)
request.body = payload.to_json

response = http.request(request)

puts response.code
puts response.body
const axios = require('axios');

const url = 'https://waba-v2.360dialog.io/messages';
const headers = {
  'D360-API-KEY': '<api_key>',
  'Content-Type': 'application/json'
};

const payload = {
  to: '<end_client_number>',
  type: 'template',
  template: {
    name: '<template_name>',
    language: {
      code: '<template_language_code>'
    },
    components: []
  },
  messaging_product: 'whatsapp'
};

axios.post(url, payload, { headers })
  .then(response => {
    console.log(response.status);
    console.log(response.data);
  })
  .catch(error => {
    console.error(error.response ? error.response.data : error.message);
  });
Webhook events received: sent
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "BUSINESS_DISPLAY_PHONE_NUMBER",
              "phone_number_id": "BUSINESS_PHONE_NUMBER_ID"
            },
            "statuses": [
              {
                "id": "<WHATSAPP_MESSAGE_ID>",
                "status": "sent",
                "timestamp": "TIMESTAMP",
                "recipient_id": "<CUSTOMER_PHONE_NUMBER>",
                "conversation": {
                  "id": "<conversation_id>",
                  "expiration_timestamp": "TIMESTAMP",
                  "origin": {
                    "type": "marketing"
                  }
                },
                "pricing": {
                  "billable": true,
                  "pricing_model": "CBP",
                  "category": "marketing"
                }
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}
Webhook events received: delivered
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "<WHATSAPP_BUSINESS_ACCOUNT_ID>",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "BUSINESS_DISPLAY_PHONE_NUMBER",
              "phone_number_id": "BUSINESS_PHONE_NUMBER_ID"
            },
            "statuses": [
              {
                "id": "<WHATSAPP_MESSAGE_ID>",
                "status": "delivered",
                "timestamp": "TIMESTAMP",
                "recipient_id": "<CUSTOMER_PHONE_NUMBER>",
                "conversation": {
                  "id": "<conversation_id>",
                  "origin": {
                    "type": "marketing"
                  }
                },
                "pricing": {
                  "billable": true,
                  "pricing_model": "CBP",
                  "category": "marketing"
                }
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}
Webhook events received: read
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "BUSINESS_DISPLAY_PHONE_NUMBER",
              "phone_number_id": "BUSINESS_PHONE_NUMBER_ID"
            },
            "statuses": [
              {
                "id": "WHATSAPP_MESSAGE_ID",
                "status": "read",
                "timestamp": "TIMESTAMP",
                "recipient_id": "CUSTOMER_PHONE_NUMBER"
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}

Sending a marketing message using the MM Lite API:

curl --location 'https://waba-v2.360dialog.io/marketing_messages' \
--header 'D360-API-KEY: <API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "<end_client_number>",
    "type": "template",
    "template": {
        "name": "<template_name>",
        "language": {
            "policy": "deterministic",
            "code": "<template_language_code>"
        }
    },
    "message_activity_sharing":true 
}'
import requests
import json

url = "https://waba-v2.360dialog.io/marketing_messages"
headers = {
    "D360-API-KEY": "<API_KEY>",
    "Content-Type": "application/json"
}

payload = {
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "<end_client_number>",
    "type": "template",
    "template": {
        "name": "<template_name>",
        "language": {
            "policy": "deterministic",
            "code": "<template_language_code>"
        }
    },
    "message_activity_sharing": True
}

response = requests.post(url, headers=headers, data=json.dumps(payload))

print(response.status_code)
print(response.json())
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("https://waba-v2.360dialog.io/marketing_messages")

headers = {
  "D360-API-KEY" => "<API_KEY>",
  "Content-Type" => "application/json"
}

payload = {
  messaging_product: "whatsapp",
  recipient_type: "individual",
  to: "<end_client_number>",
  type: "template",
  template: {
    name: "<template_name>",
    language: {
      policy: "deterministic",
      code: "<template_language_code>"
    }
  },
  message_activity_sharing: true
}

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri, headers)
request.body = payload.to_json

response = http.request(request)

puts response.code
puts response.body
const axios = require('axios');

const url = 'https://waba-v2.360dialog.io/marketing_messages';
const headers = {
  'D360-API-KEY': '<API_KEY>',
  'Content-Type': 'application/json'
};

const payload = {
  messaging_product: 'whatsapp',
  recipient_type: 'individual',
  to: '<end_client_number>',
  type: 'template',
  template: {
    name: '<template_name>',
    language: {
      policy: 'deterministic',
      code: '<template_language_code>'
    }
  },
  message_activity_sharing: true
};

axios.post(url, payload, { headers })
  .then(response => {
    console.log(response.status);
    console.log(response.data);
  })
  .catch(error => {
    console.error(error.response ? error.response.data : error.message);
  });
Webhook events received: sent
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "BUSINESS_DISPLAY_PHONE_NUMBER",
"phone_number_id": "BUSINESS_PHONE_NUMBER_ID"
},
"statuses": [
{
"id": "<WHATSAPP_MESSAGE_ID>",
"status": "sent",
"timestamp": "TIMESTAMP",
"recipient_id": "<CUSTOMER_PHONE_NUMBER>",
"conversation": {
"id": "<conversation_id>",
"expiration_timestamp": "TIMESTAMP",
"origin": {
"type": "marketing_lite"
}
},
"pricing": {
"billable": true,
"pricing_model": "CBP",
"category": "marketing_lite"
}}]},
"field": "messages"
}]}]}
Webhook events received: delivered
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "BUSINESS_DISPLAY_PHONE_NUMBER",
              "phone_number_id": "BUSINESS_PHONE_NUMBER_ID"
            },
            "statuses": [
              {
                "id": "<WHATSAPP_MESSAGE_ID>",
                "status": "delivered",
                "timestamp": "TIMESTAMP",
                "recipient_id": "TIMESTAMP",
                "conversation": {
                  "id": "<conversation_id>",
                  "origin": {
                    "type": "marketing_lite"
                  }
                },
                "pricing": {
                  "billable": true,
                  "pricing_model": "CBP",
                  "category": "marketing_lite"
                }
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}
Webhook events received: read
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "BUSINESS_DISPLAY_PHONE_NUMBER",
              "phone_number_id": "BUSINESS_PHONE_NUMBER_ID"
            },
            "statuses": [
              {
                "id": "<WHATSAPP_MESSAGE_ID>",
                "status": "read",
                "timestamp": "TIMESTAMP",
                "recipient_id": "<CUSTOMER_PHONE_NUMBER>"
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}
Webhook events received: click event
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "BUSINESS_DISPLAY_PHONE_NUMBER",
"phone_number_id": "BUSINESS_PHONE_NUMBER_ID"
},
"user_actions": [
{
"timestamp": "TIMESTAMP",
"action_type": "marketing_messages_link_click",
"marketing_messages_link_click_data": {
"tracking_token": "<TRACKING_TOKEN>",
"click_id": "<CLICK_ID>",
"click_component": "CTA"
}}]},
"field": "messages"
}]}]}

As you may know, we typically expect to receive three webhooks: sent, delivered, and read. However, when a user clicks the link inside a marketing template message sent via the Cloud API, no webhooks are triggered at all.

Now let´s see how it works when we send the same marketing template message using the MM Lite API:

If you see, we only need to use a different endpoint; nothing else is required. The same webhooks are returned, but with a big change: we collect the click event.

It includes the value "marketing_lite" to indicate that it was sent using the MM Lite API:

It will show you a click_id and a tracking_token.

📑
☝️
⚡
⚠️
ℹ️
ℹ️