Client Area

WhatsApp Business API Integration for Indian Businesses

ByDomain India Team·DomainIndia Engineering
6 min readPublished 24 Apr 2026Updated 23 Jun 2026272 views

In this article

  • 1Which API is right for you
  • 2WhatsApp conversation pricing (2026)
  • 3Step 1 — Meta Cloud API setup
  • 4Step 2 — Send your first message
  • 5Step 3 — Template approval

WhatsApp Business API Integration for Indian Businesses

TL;DR
WhatsApp has 500M+ Indian users. WhatsApp Business API lets your DomainIndia-hosted website send order updates, OTPs, and promotional messages programmatically. This guide covers Meta Cloud API setup (free tier), BSP alternatives (Gupshup, Wati, Interakt), webhook handling, and template approval.

Which API is right for you

ProviderSetup speedCostBest for
Meta Cloud API (direct)2-3 daysPer conversation, ~₹0.80-3.50Tech teams who can integrate
Gupshup1 day (they manage)Similar + their feeSMBs wanting managed
Wati, Interakt, AiSensy1 hour (no-code + API)Monthly subscription + per-msgNon-tech founders, marketing teams

Meta's Cloud API launched 2022 as a free-tier alternative to BSP (Business Solution Providers). For most tech-capable teams, it's the best path.

WhatsApp conversation pricing (2026)

Meta charges per 24-hour "conversation" window, varying by country + category:

CategoryIndia rate (approx)Use case
Utility₹0.80Order confirmation, appointment reminder
Authentication₹0.12OTP delivery
Marketing₹0.73Promotional campaigns
Service (inside 24h of user message)FreeReplying to customer queries

Service conversations are free if initiated by the user. Business-initiated messages cost based on category.

Step 1 — Meta Cloud API setup

  1. Go to developers.facebook.com — create account
  2. My Apps → Create App → Business type → Continue
  3. Add product: WhatsApp
  4. Get a test phone number (provided free for testing)
  5. Later: add production phone number via Meta Business Manager (requires business verification — PAN, GST, website)
  6. Generate temporary access token (24h for testing) or permanent via System User in Business Manager

Step 2 — Send your first message

bash
curl -X POST 
  'https://graph.facebook.com/v20.0/{PHONE_NUMBER_ID}/messages' 
  -H 'Authorization: Bearer {ACCESS_TOKEN}' 
  -H 'Content-Type: application/json' 
  -d '{
    "messaging_product": "whatsapp",
    "to": "919876543210",
    "type": "template",
    "template": {
      "name": "hello_world",
      "language": { "code": "en_US" }
    }
  }'

hello_world is pre-approved by Meta. For custom templates, you submit text for approval.

PHP:

php
function sendWhatsApp($to, $templateName, $params = []) {
    $url = "https://graph.facebook.com/v20.0/" . getenv('WA_PHONE_ID') . "/messages";
    $body = [
        'messaging_product' => 'whatsapp',
        'to' => $to,
        'type' => 'template',
        'template' => [
            'name' => $templateName,
            'language' => ['code' => 'en_IN'],
            'components' => $params,
        ],
    ];
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($body),
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . getenv('WA_ACCESS_TOKEN'),
            'Content-Type: application/json',
        ],
        CURLOPT_RETURNTRANSFER => true,
    ]);
    return json_decode(curl_exec($ch), true);
}

// Order confirmation
sendWhatsApp('919876543210', 'order_confirmation', [
    [
        'type' => 'body',
        'parameters' => [
            ['type' => 'text', 'text' => 'Rajesh'],       // {{1}}
            ['type' => 'text', 'text' => 'ORD-1234'],     // {{2}}
            ['type' => 'text', 'text' => '₹1,500'],        // {{3}}
        ],
    ],
]);

Node.js:

javascript
import axios from 'axios';

async function sendWhatsApp(to, template, params) {
  const resp = await axios.post(
    `https://graph.facebook.com/v20.0/${process.env.WA_PHONE_ID}/messages`,
    {
      messaging_product: 'whatsapp',
      to,
      type: 'template',
      template: {
        name: template,
        language: { code: 'en_IN' },
        components: params,
      },
    },
    { headers: { Authorization: `Bearer ${process.env.WA_ACCESS_TOKEN}` } }
  );
  return resp.data;
}

Step 3 — Template approval

Meta approves every message template before you can send. Process:

  1. Business Manager → WhatsApp → Message templates → Create
  2. Name: order_confirmation (lowercase, underscore)
  3. Category: Utility / Authentication / Marketing
  4. Language: English, Hindi, Tamil, etc.
  5. Body (with variables):

```

Hi {{1}}, your order {{2}} for {{3}} has been confirmed. Track at https://yourcompany.com/orders/{{2}}

```

  1. Submit for approval — usually 15 min to 24 hours

Approval tips:

  • Clear purpose — transactional, not promotional "check out our deals"
  • No excessive emojis (max 2)
  • No spammy URLs (shortened links often rejected)
  • Variable placement at start/end is safer than middle
  • Reject reason? — fix and resubmit with new name

Step 4 — Handle incoming messages (webhook)

Users replying to your messages = incoming events.

Expose webhook endpoint at https://yourcompany.com/webhook/whatsapp:

javascript
// Verification (GET) — Meta verifies endpoint
app.get('/webhook/whatsapp', (req, res) => {
  const mode = req.query['hub.mode'];
  const token = req.query['hub.verify_token'];
  const challenge = req.query['hub.challenge'];
  if (mode === 'subscribe' && token === process.env.WA_VERIFY_TOKEN) {
    return res.send(challenge);
  }
  res.sendStatus(403);
});

// Event receiver (POST)
app.post('/webhook/whatsapp', express.json(), async (req, res) => {
  const entry = req.body.entry?.[0];
  const changes = entry?.changes?.[0];
  const value = changes?.value;

  // Incoming message
  if (value?.messages) {
    for (const msg of value.messages) {
      const from = msg.from;
      const text = msg.text?.body;
      console.log(`${from}: ${text}`);
      // Process — maybe auto-reply, create ticket, etc.
      await handleIncomingMessage(from, text);
    }
  }

  // Delivery/read receipts
  if (value?.statuses) {
    for (const s of value.statuses) {
      await updateDeliveryStatus(s.id, s.status);
    }
  }

  res.sendStatus(200);
});

Register webhook URL in Meta dashboard.

Step 5 — Send interactive messages (buttons, lists)

Beyond plain text:

Quick reply buttons:

json
{
  "type": "interactive",
  "interactive": {
    "type": "button",
    "body": { "text": "Did your package arrive?" },
    "action": {
      "buttons": [
        { "type": "reply", "reply": { "id": "yes", "title": "Yes" } },
        { "type": "reply", "reply": { "id": "no", "title": "No, issues" } }
      ]
    }
  }
}

Product catalog (e-commerce):

json
{
  "type": "interactive",
  "interactive": {
    "type": "product_list",
    "header": { "type": "text", "text": "Today's Deals" },
    "action": {
      "catalog_id": "YOUR_CATALOG_ID",
      "sections": [...]
    }
  }
}

Customers browse, tap, add to cart — all inside WhatsApp.

Step 6 — OTP via WhatsApp

For authentication — far better than SMS deliverability in India.

Create template category: Authentication:

Your verification code is {{1}}. It expires in 10 minutes. Do not share this code.
javascript
const otp = generate6DigitOTP();
await redis.setex(`otp:${phone}`, 600, otp);

await sendWhatsApp(phone, 'otp_login', [
  { type: 'body', parameters: [{ type: 'text', text: otp }] },
]);

Cost: ~₹0.12 per OTP (Authentication category) vs ~₹0.20 for SMS.

Common pitfalls

FAQ

Q Can I use a normal WhatsApp number (not Business API)?

No — normal WhatsApp's automation is against ToS. Risk of ban. Business API is the only supported way for automation.

Q Which BSP is best?

Gupshup (biggest in India, good support), Wati (no-code friendly), Interakt (Shopify integration), AiSensy (affordable monthly). Meta Cloud API direct if you have tech team.

Q How long does business verification take?

1-7 business days. Need: company PAN, GST, bank statement, company website (must be live), CIN (for Pvt Ltd).

Q Can I send marketing to anyone?

Only users who opt-in. Meta strictly enforces. Required: explicit consent checkbox on your website or other channels before first WhatsApp message.

Q Group messaging?

Business API doesn't support group messaging. Broadcast lists only via native WhatsApp Business app (limited to 256 contacts per list).

Send WhatsApp updates from your DomainIndia-hosted site. Get hosting

Was this article helpful?

Your feedback helps us improve our documentation

Still need help? Submit a support ticket