Iklan Click-to-WhatsApp

Ketahui Iklan Mana yang Memulai Setiap Chat WhatsApp

Saat seseorang mengetuk iklan Click-to-WhatsApp atau postingan yang dipromosikan, pesan pertamanya membawa data iklan tersebut. StartMessaging menyimpannya di kontak baru, menampilkannya di CRM, dan mengirimkannya ke sistem Anda lewat webhook, sehingga lead dari iklan tidak pernah datang tanpa identitas.

✦ Uji coba gratis 14 hari · Nomor WhatsApp Business Anda sendiri · Meta menagih pesan secara langsung

Data Iklan Ikut dalam Pesan Pertama

Anda membuat dan membayar iklan di Meta Ads Manager. Saat pelanggan mengetuk iklan dan mengirim pesan pertama, WhatsApp melampirkan data rujukan: jenis sumber, ID iklan atau postingan, tautannya, judul, teks iklan, dan ID klik (ctwaClid). StartMessaging membacanya begitu pesan masuk ke kotak masuk tim Anda.

  • Berlaku untuk iklan Click-to-WhatsApp dan postingan yang dipromosikan
  • Judul, teks iklan, ID dan tautan iklan atau postingan tersimpan
  • ID klik (ctwaClid) disimpan untuk pelaporan konversi Anda
  • Label “Jendela iklan gratis berakhir…” selama jendela gratis 72 jam dari Meta terbuka
Baca panduan atribusi →
Atribusi lead iklan Click-to-WhatsApp

Setiap Lead Iklan Masuk ke CRM Beserta Iklannya

Kontak yang dibuat dari klik iklan mendapat sumber "Iklan Click-to-WhatsApp" dan data iklan sebagai kolom kustom: ctwa_source_type, ctwa_source_id, ctwa_source_url, ctwa_headline, ctwa_body, dan ctwa_clid. Buka kontaknya dan kartu "Dari iklan Click-to-WhatsApp" menampilkan iklan yang diketuk. Kolom ini diisi satu kali, oleh pesan pertama tersebut. Kontak yang sudah ada tetap memakai sumber dan kolom aslinya, dan data rujukan tetap dikirim lewat webhook message.received.

  • Sumber lead tercatat sebagai "Iklan Click-to-WhatsApp"
  • Detail iklan disimpan sebagai kolom kustom, diisi satu kali
  • Ditampilkan di halaman kontak bersama tag dan catatan
Kontak dari iklan Click-to-WhatsApp di CRM
Cara Kerja

Dari Ketukan Iklan hingga Lead Berkualitas

01

1. Jalankan iklan di Meta Ads Manager

Buat iklan Click-to-WhatsApp, atau promosikan postingan dengan tombol WhatsApp, yang membuka chat ke nomor yang Anda hubungkan ke StartMessaging.

02

2. Pelanggan mengetuk dan menulis

Pesan pertamanya masuk ke kotak masuk tim dengan data rujukan iklan terlampir.

03

3. Kontak dibuat beserta iklannya

Kontak baru mendapat sumber ctwa_ad dan kolom kustom ctwa_*. Sistem Anda menerima data rujukan di message.received dan sumbernya di contact.created.

04

4. Arahkan lead

Alur chatbot dengan pemicu pesan pertama menyapa setiap chat baru, termasuk dari klik iklan: ajukan pertanyaan kualifikasi, tambahkan tag, pindahkan kontak ke tahap pipeline, dan tugaskan agen.

05

5. Laporkan konversi sendiri

Saat lead membeli, sistem Anda sendiri mengirim ctwaClid yang tersimpan ke Conversions API Meta; StartMessaging tidak mengirim konversi ke Meta untuk Anda. Untuk mengkreditkan penjualan ke kampanye StartMessaging, laporkan dengan POST /api/v1/conversions di paket Business.

Di Mana Data Iklan Disimpan

Satu Rujukan, Tiga Tempat untuk Memakainya

Kolom rujukan mana pun bisa kosong jika Meta tidak menyertakannya.

Data iklan Di kontak (CRM) Webhook message.received REST API
Jenis sumber, ID iklan atau postingan, tautan ctwa_source_type, ctwa_source_id, ctwa_source_url referral.sourceType, sourceId, sourceUrl Atribut kontak di GET /api/v1/contacts
Judul dan teks iklan ctwa_headline, ctwa_body (dipotong pada 500 karakter) referral.headline, referral.body Atribut kontak
ID klik ctwa_clid referral.ctwaClid Atribut kontak
Sumber lead "Iklan Click-to-WhatsApp" source "ctwa_ad" di contact.created source: "ctwa_ad"
Kontak lama mengeklik iklan Sumber dan kolomnya tetap ✓ Data rujukan tetap dikirim Tidak berubah
Jendela titik masuk gratis (72 jam) Label “Jendela iklan gratis berakhir…” di obrolan freeEntryPointExpiresAt pada percakapan
Webhook

Baca data iklan dari pesan pertama

Verifikasi header X-SM-Signature, lalu simpan referral.ctwaClid bersama lead.

{
  "id": "evt_01JCA4M8ZP",
  "type": "message.received",
  "createdAt": "2026-10-07T09:15:04.000Z",
  "workspaceId": "ws_9f2c",
  "data": {
    "message": {
      "id": "msg_51c0",
      "conversationId": "conv_8e21",
      "contactId": "ct_4a7d",
      "from": "+919812345678",
      "type": "text",
      "text": "Hi, is the festive offer still on?",
      "media": null,
      "reply": null,
      "context": null,
      "form": null,
      "referral": {
        "sourceType": "ad",
        "sourceId": "120210000000000000",
        "sourceUrl": "https://fb.me/abc123",
        "headline": "Festive sale on silk sarees",
        "body": "Tap to chat with us on WhatsApp",
        "ctwaClid": "ARAkLkA8rmlFeiCktEJQ-QTwRiyYHAFDLMNDBH0CD3qpjd0HR4irJ6LEkR7JwFF4XvnO2E4Nx0-eM-GABDLOPaOdRMv-_zfUQ2a"
      },
      "timestamp": "2026-10-07T09:15:02.000Z"
    },
    "contact": {
      "id": "ct_4a7d",
      "phone": "+919812345678",
      "name": "Asha"
    }
  }
}
import express from 'express';
import { createHmac, timingSafeEqual } from 'node:crypto';

const app = express();
const SECRET = process.env.SM_WEBHOOK_SECRET; // the whole whsec_… string

function verify(rawBody, headers) {
  const ts = headers['x-sm-timestamp'];
  const sigs = headers['x-sm-signature'];
  if (!/^\d+$/.test(ts ?? '') || typeof sigs !== 'string') return false;
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const expected = createHmac('sha256', SECRET).update(`${ts}.`).update(rawBody).digest();
  return sigs.split(',').some((part) => {
    const m = /^v1=([0-9a-f]{64})$/.exec(part.trim());
    return m !== null && timingSafeEqual(Buffer.from(m[1], 'hex'), expected);
  });
}

app.post('/webhooks/startmessaging', express.raw({ type: 'application/json' }), async (req, res) => {
  if (!verify(req.body, req.headers)) return res.sendStatus(401);
  res.sendStatus(200); // answer within 5 seconds, then do the work

  const event = JSON.parse(req.body);
  if (event.type !== 'message.received') return;

  const { referral, from } = event.data.message;
  if (!referral) return; // not the first message from an ad

  // Any referral field can be null when Meta leaves it out.
  await saveAdLead({
    eventId: event.id, // delivered at least once: deduplicate on this
    phone: from,
    adId: referral.sourceId,
    headline: referral.headline,
    ctwaClid: referral.ctwaClid, // keep it for Meta's Conversions API
  });
  // When this lead converts, your own server sends ctwaClid to Meta's
  // Conversions API. StartMessaging does not send conversions to Meta.
});
import hmac, hashlib, json, os, time
from flask import Flask, request

app = Flask(__name__)
SECRET = os.environ['SM_WEBHOOK_SECRET'].encode()  # the whole whsec_… string

def verify(raw_body, ts, sigs):
    if not ts or not ts.isdigit() or not sigs:
        return False
    if abs(time.time() - int(ts)) > 300:
        return False
    expected = hmac.new(SECRET, f'{ts}.'.encode() + raw_body, hashlib.sha256).hexdigest()
    return any(
        hmac.compare_digest(part.strip()[3:], expected)
        for part in sigs.split(',') if part.strip().startswith('v1=')
    )

@app.post('/webhooks/startmessaging')
def startmessaging_webhook():
    raw = request.get_data()
    if not verify(raw, request.headers.get('X-SM-Timestamp'), request.headers.get('X-SM-Signature')):
        return '', 401
    event = json.loads(raw)
    if event['type'] == 'message.received':
        message = event['data']['message']
        referral = message.get('referral')
        if referral:  # first message from a Click-to-WhatsApp ad
            save_ad_lead(
                event_id=event['id'],  # deduplicate on this
                phone=message['from'],
                ad_id=referral.get('sourceId'),
                headline=referral.get('headline'),
                ctwa_clid=referral.get('ctwaClid'),  # for Meta's Conversions API
            )
    return '', 200
FAQ

Iklan Click-to-WhatsApp — FAQ

Apakah saya membuat iklan di StartMessaging?

Tidak. Anda membuat, menargetkan, dan membayar iklan Click-to-WhatsApp di Meta Ads Manager, atau mempromosikan postingan dari Halaman Facebook atau akun Instagram Anda. Arahkan iklan ke nomor WhatsApp yang terhubung ke StartMessaging, dan StartMessaging membaca data iklan dari setiap chat baru yang dimulainya.

Apa yang diambil StartMessaging dari iklan?

Apa pun yang dikirim Meta dalam data rujukan pada pesan pertama: jenis sumber, ID iklan atau postingan, tautannya, judul, teks iklan, dan ID klik (ctwaClid). Masing-masing bisa kosong jika Meta tidak menyertakannya. Kontak baru menyimpannya sebagai kolom kustom ctwa_source_type, ctwa_source_id, ctwa_source_url, ctwa_headline, ctwa_body (dipotong pada 500 karakter), dan ctwa_clid.

Apa yang terjadi jika kontak lama mengeklik iklan?

Kontak tetap memakai sumber dan kolom kustom aslinya; keduanya hanya diisi sekali, oleh pesan yang membuat kontak tersebut. Data rujukan tetap dikirim lewat webhook message.received, sehingga sistem Anda bisa mencatat klik iklan yang baru.

Apakah StartMessaging mengirim konversi ke Conversions API Meta?

Tidak. StartMessaging menyimpan ID klik (ctwaClid) di kontak dan di webhook. Saat lead berkonversi, server Anda sendiri, atau alat otomasi yang Anda kelola, mengirim ctwaClid ke Conversions API Meta. Untuk mengkreditkan penjualan ke kampanye StartMessaging, paket Business menyediakan POST /api/v1/conversions: laporkan penjualan dengan nomor telepon pelanggan, dan kampanye terakhir yang terkirim kepadanya dalam jendela konversi Anda mendapat kreditnya.

Apakah Meta menagih pesan di obrolan dari iklan?

Tidak, selama jendela titik masuk gratis. Saat pelanggan menulis dari iklan Click-to-WhatsApp dan Anda membalas tepat waktu, Meta membuka jendela titik masuk gratis 72 jam yang selama itu Meta tidak menagih pesan di obrolan tersebut, termasuk template. Kotak masuk menampilkan label “Jendela iklan gratis berakhir…” hingga saat itu, dan API mengembalikan waktu berakhirnya sebagai freeEntryPointExpiresAt pada percakapan. Jendela ini tidak menggantikan aturan 24 jam: setelah 24 jam pelanggan lewat, Anda tetap memerlukan template yang disetujui. Setelah jendela berakhir, tarif normal Meta berlaku.

Bisakah saya membalas lead iklan secara otomatis?

Ya. Alur chatbot dengan pemicu pesan pertama berjalan pada pesan pertama kontak di chat tersebut, sehingga menyapa setiap chat baru, termasuk dari klik iklan. Alur ini bisa mengajukan pertanyaan, menambahkan tag, memindahkan kontak ke tahap pipeline, dan menyerahkan chat ke agen. Balasan otomatis berdasarkan kata kunci juga bisa dipakai. Karena pelanggan menulis lebih dulu, jendela 24 jam terbuka dan Anda bisa membalas dengan pesan bebas. Alur chatbot tersedia di paket Business dan uji coba gratis 14 hari; balasan otomatis kata kunci tersedia di Team dan Business.

Bisakah saya mengirim lead iklan ke CRM atau spreadsheet saya sendiri?

Ya. Berlangganan message.received (membawa data rujukan) dan contact.created (membawa source "ctwa_ad"), atau sinkronkan dengan GET /api/v1/contacts dan updatedSince, yang mengembalikan sumber dan atribut ctwa_* tiap kontak. Zapier, Make, dan Pabbly Connect bisa dipakai lewat modul webhook dan HTTP generik mereka; belum ada aplikasi resmi StartMessaging di marketplace tersebut.

WhatsApp API

Ubah Klik Iklan Menjadi Lead yang Terlacak

Uji coba gratis 14 hari. Hubungkan nomor WhatsApp Business Anda sendiri dan lihat iklan di balik setiap chat baru.