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
    • Alphas and Betas
      • MM Lite Beta Program
        • Onboarding
        • MM Lite versus Cloud API
        • Sending Messages
        • 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. get started
  2. Alphas and Betas
  3. 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

PreviousOnboardingNextSending Messages

Last updated 6 days 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

Identical

Endpoint to be used

/messages

/marketing_messages

Authentication

Same API Key

Same API Key

Payload Format

Identical

Identical

Webhook Behavior

Same structure

Same structure1

  1. Additional details related to the cost of MM Lite are included as an informative property.


🧪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.


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

It will show you a click_id and a tracking_token.

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

{
"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:

📑
☝️
⚡
⚠️
ℹ️