
# Atribusi klik iklan untuk WhatsApp

Jika Anda menjalankan iklan Meta atau Google ke halaman di situs web Anda sendiri, dan halaman tersebut memiliki tombol WhatsApp, <span data-t="appName">DM Champ</span> dapat memberi tahu Anda dari klik iklan mana setiap percakapan WhatsApp berasal. Anda cukup menempelkan satu skrip kecil di situs web Anda. Saat pengunjung mengetuk tombol WhatsApp Anda, klik tersebut diingat dan dicocokkan dengan pesan pertama yang mereka kirimkan kepada Anda. Kontak tersebut kemudian akan menampilkan kampanye asalnya, dan data klik tersebut akan ikut serta bersama kontak ke webhook, API, dan, jika Anda mau, kembali ke Meta.

Ini berfungsi untuk halaman apa pun dengan tombol WhatsApp: halaman landas (landing page), halaman pemesanan, halaman harga, atau kuis yang diakhiri dengan "Kirim jawaban saya melalui WhatsApp".

> Halaman ini membahas tentang iklan yang mengarahkan orang ke **situs web Anda** terlebih dahulu. Jika iklan Anda membuka WhatsApp secara langsung (iklan "Klik ke WhatsApp" dari Meta), hal itu ditangani secara otomatis, tanpa skrip, dalam [Atribusi Iklan Klik-ke-WhatsApp](click-to-whatsapp-attribution.md).

---

## Menyiapkannya

1. Buka **Pengaturan → Pelacakan klik iklan** (grup Integrasi).
2. Klik **Aktifkan dan dapatkan skrip saya**. Akun Anda akan mendapatkan kunci situs dan skrip satu baris miliknya sendiri.
3. Salin skrip tersebut dan tempelkan tepat sebelum tag penutup `</body>` di setiap halaman yang memiliki tombol WhatsApp:

{% code overflow="wrap" %}
```html
<script src="https://api.dmchamp.com/v1/ad-visit/YOUR_SITE_KEY.js" async></script>
```
{% endcode %}

4. Opsional: di bawah **Nomor WhatsApp**, ketik nomor yang ditautkan oleh tombol Anda. Hanya tautan ke nomor tersebut yang kemudian akan dilacak. Biarkan kosong untuk melacak setiap tautan WhatsApp di situs.
5. Pilih kata-kata untuk nomor pertanyaan (lihat di bawah) dan klik **Simpan**. Anda tidak perlu mengubah skrip di situs web Anda setelah melakukan perubahan pengaturan.
6. Uji coba: buka halaman Anda dari tautan yang memiliki tag kampanye, misalnya `https://yoursite.com/?utm_source=test&utm_campaign=setup-check`, ketuk tombol WhatsApp Anda sendiri, dan kirim pesannya. Buka kontak tersebut di Obrolan: panel kontak akan menampilkan **Berasal dari klik iklan** beserta kampanyenya.

Kunci situs sudah ada di dalam skrip. Ini bukan kata sandi, jadi aman untuk diletakkan di halaman publik.

::: master-only
**Agensi:** setiap akun klien memiliki kunci situs dan skripnya sendiri, sehingga situs web setiap klien akan melapor ke akunnya masing-masing. Anda dapat menyembunyikan bagian ini untuk klien dengan visibilitas menu, seperti bagian pengaturan lainnya.
:::

---

## Apa yang dilakukan skrip ini

- **Saat halaman dimuat**, skrip ini menyimpan ID klik iklan dan tag kampanye (parameter `utm_`) dari alamat halaman di penyimpanan sesi tab peramban, sehingga data tersebut tetap ada jika pengunjung melihat halaman lain terlebih dahulu. Skrip ini tidak menetapkan cookie, tidak memuat apa pun, dan tidak mengirimkan apa pun.
- **Saat pengunjung mengetuk tautan WhatsApp** (`wa.me`, `api.whatsapp.com/send`, atau `whatsapp://send`), skrip ini menambahkan nomor pertanyaan ke pesan, mencatat kunjungan tersebut, dan membiarkan ketukan berlanjut ke WhatsApp seperti biasa.

Tidak ada yang dikirim ke <span data-t="appName">DM Champ</span> sebelum ketukan terjadi.

---

## Nomor pertanyaan

Nomor singkat, seperti referensi yang diberikan toko atau klinik kepada Anda, ditambahkan ke pesan WhatsApp pengunjung. Dengan cara inilah <span data-t="appName">DM Champ</span> mengetahui dengan tepat klik iklan mana yang menjadi milik percakapan yang mana. Pesan akan terlihat seperti ini:

```
Hi, I would like to know more.
Enquiry no. 4827
```

- **Kata-kata:** "No. pertanyaan" adalah defaultnya. Anda dapat menggunakan satu baris teks apa pun yang terdengar alami untuk bisnis Anda, seperti "Ref pemesanan" atau "Ref". Tanpa angka.
- **Di mana:** **Di baris terakhirnya sendiri** (default) atau **Di akhir teks**. Halaman pengaturan menampilkan pratinjau langsung.
- **Panjang:** 4 digit, atau 5 jika situs Anda sangat sibuk.
- **Agen AI Anda tidak akan pernah melihatnya** dan tidak akan pernah mengulanginya. Kotak masuk menampilkan pesan lengkap, termasuk nomornya.

Anda dapat mematikan nomor pertanyaan. Pencocokan kemudian hanya berfungsi pada teks pesan, sehingga dua pengunjung yang mengirim teks yang persis sama (misalnya jawaban kuis yang sama) tidak dapat dibedakan, dan beberapa klik tidak akan dicocokkan.

---

## Kode kuis atau tombol Anda sendiri

Jika halaman Anda membuat pesan WhatsApp sendiri (kuis yang memasukkan jawaban ke dalam teks, atau kode tombol Anda sendiri), tambahkan `data-manual` ke tag skrip:

{% code overflow="wrap" %}
```html
<script src="https://api.dmchamp.com/v1/ad-visit/YOUR_SITE_KEY.js" data-manual async></script>
```
{% endcode %}

Dengan `data-manual`, skrip tidak lagi mengubah tautan WhatsApp dengan sendirinya. Kode Anda sendiri memanggilnya tepat sebelum membuka WhatsApp, sehingga setiap kunjungan dicatat satu kali:

- `window.ChatAttribution.text(finalText, number)` mengembalikan teks Anda dengan nomor pertanyaan yang ditambahkan, dan mencatat kunjungan tersebut. Gunakan teks yang dikembalikan dalam tautan WhatsApp Anda.
- `window.ChatAttribution.link(finalText, number)` melakukan hal yang sama dan mengembalikan tautan `wa.me` yang siap digunakan dengan teks tersebut. Kosongkan nomor untuk menggunakan nomor yang ada di bawah **Nomor WhatsApp** di pengaturan.

{% code overflow="wrap" %}
```html
<script>
  function sendAnswers(answers) {
    var text = "Hi, my answers: " + answers.join(", ");
    if (window.ChatAttribution) {
      window.location.href = window.ChatAttribution.link(text, "+15551234567");
    } else {
      window.location.href = "https://wa.me/15551234567?text=" + encodeURIComponent(text);
    }
  }
</script>
```
{% endcode %}

Cabang `else` menjaga tombol tetap berfungsi jika skrip belum dimuat, misalnya saat ekstensi peramban memblokirnya. Teks yang sudah membawa nomor yang dikeluarkan skrip tidak akan pernah diubah untuk kedua kalinya.

---

## Apa yang dicatat

Saat diketuk, catatan kunjungan menyimpan:

- id klik iklan di alamat halaman, seperti `fbclid` (Meta) dan `gclid` (Google)
- cookie `_fbc` dan `_fbp`, jika piksel Meta Anda sendiri mengaturnya di situs Anda (skrip membacanya, skrip tidak pernah mengaturnya)
- tag kampanye (`utm_source`, `utm_medium`, `utm_campaign`, `utm_content`, `utm_term`)
- halaman landas, halaman asal pengunjung, peramban, dan teks pesan
- alamat IP dan waktu, ditambahkan oleh <span data-t="appName">DM Champ</span> saat kunjungan tiba

Catatan kunjungan disimpan selama **90 hari**. Saat kunjungan dicocokkan, salinan data kliknya disimpan pada kontak dan tetap ada pada kontak tersebut hingga Anda menghapusnya.

**Pemberitahuan privasi Anda:** skrip berjalan di situs web Anda, jadi pemberitahuan privasi situs web Anda harus menyebutkannya: apa yang dicatatnya (daftar di atas) dan bahwa skrip tersebut mencatatnya saat pengunjung mengetuk tombol WhatsApp.

---

## Cara kerja pencocokan

Saat pesan pertama kontak tiba, <span data-t="appName">DM Champ</span> mencari kunjungan dari **15 menit** sebelumnya:

1. **Berdasarkan nomor pertanyaan terlebih dahulu.** Pesan yang membawa nomor yang dikeluarkan skrip dicocokkan dengan kunjungan tersebut.
2. **Jika tidak, berdasarkan teks yang identik.** Pesan dengan teks yang persis sama dengan satu kunjungan dicocokkan dengannya. Jika dua pengunjung berbeda mengirim teks yang sama dalam jendela waktu tersebut, keduanya tidak dicocokkan, dengan sengaja, agar kontak tidak pernah dikaitkan dengan iklan yang salah.

Pesan selanjutnya yang membawa nomor pertanyaan juga dicocokkan, selama kontak tersebut belum memiliki kecocokan.

Ketika kontak yang sudah memiliki kecocokan kembali melalui iklan lain dan mengirimkan pesan yang memuat nomor pertanyaan yang lebih baru, klik tersebut disimpan sebagai **klik terbaru** kontak tersebut. Kecocokan pertama tetap sebagaimana adanya.

- **Klik pertama, untuk pelaporan Anda:** kontak akan terus menunjukkan dari mana prospek pertama kali berasal. Hal itu tidak pernah berubah.
- **Klik terbaru, untuk Meta:** peristiwa yang dikirim ke Meta menggunakan klik terbaru, karena Meta memberikan kredit pada iklan yang membawa orang tersebut kembali dan hanya dalam jendela atribusinya. Melaporkan klik lama akan memberikan kredit pada iklan yang salah, atau tidak sama sekali.
- Klik terbaru hanya diambil dari nomor pertanyaan, tidak pernah hanya dari teks yang cocok, dan kunjungan yang lebih lama tidak akan pernah menggantikan kunjungan yang lebih baru.

Batasan:

- **Kecocokan pertama tidak pernah ditimpa.** Klik yang lebih baru masuk ke klik terbaru.
- **Khusus WhatsApp:** saluran WhatsApp Business API dan WhatsApp Web.
- **15 menit:** pengunjung yang mengetuk tombol tetapi mengirim pesan jauh setelahnya tidak akan dicocokkan.
- **Hanya berlaku ke depan:** kontak dari sebelum Anda menginstal skrip tidak memiliki kecocokan.

---

## Di mana Anda melihatnya

- **Panel kontak:** **Berasal dari klik iklan** dengan kampanye atau sumber dan tanggal klik pertama. Arahkan kursor untuk melihat detailnya, termasuk klik terbaru jika ada.
- **Webhook:** `contact.ad_attribution` di [webhook tag agen](webhooks.md#contact-tags-updated-webhook) dan di setiap peristiwa langganan webhook yang membawa kontak.
- **API:** `ad_attribution` pada daftar kontak dan `adAttribution` pada satu kontak, di bagian Kontak pada referensi API.
- **Alat MCP:** objek yang sama pada setiap kontak yang dikembalikannya.

Nilainya adalah `null` ketika kontak tidak memiliki kecocokan. Bidang di bawah ini menjelaskan klik pertama. Ketika klik yang lebih baru dicocokkan, `latest` menampungnya dengan bidang yang sama; bidang ini tidak ada sampai saat itu.

| Bidang | Penjelasan |
|---|---|
| `visit_at` | Kapan pengunjung mengetuk tombol WhatsApp. |
| `matched_at` | Kapan kunjungan dicocokkan dengan kontak. |
| `match_method` | `reference` (dicocokkan berdasarkan nomor pertanyaan) atau `text` (dicocokkan berdasarkan teks pesan yang identik). |
| `reference` | Nomor pertanyaan, atau `null` saat fitur tersebut nonaktif. |
| `fbc` / `fbp` | Klik Meta dan cookie browser dari piksel Meta Anda sendiri, jika ada. |
| `fbclid` | ID klik iklan Meta dari alamat halaman. |
| `gclid` / `gbraid` / `wbraid` | ID klik iklan Google dari alamat halaman. |
| `utm_source` / `utm_medium` / `utm_campaign` / `utm_content` / `utm_term` | Tag kampanye dari alamat halaman. |
| `landing_url` | Halaman yang dikunjungi pengunjung. |
| `referrer` | Halaman asal pengunjung. |
| `client_ip` | Alamat IP pengunjung. |
| `user_agent` | Browser pengunjung. |
| `site_key` | Kunci situs dari skrip yang mencatat kunjungan. |
| `visit_id` | ID catatan kunjungan. |
| `latest` | Klik terbaru yang dicocokkan setelah yang pertama, dengan bidang yang sama. Digunakan untuk peristiwa yang dikirim ke Meta. Tidak ada jika tidak ditemukan. |

---

## Kirim hasil ke Meta (opsional)

Anda dapat membiarkan <span data-t="appName">DM Champ</span> melaporkan hasil kembali ke akun iklan Meta Anda, sehingga Meta mempelajari iklan mana yang menghasilkan prospek dan penjualan nyata serta mengoptimalkannya. Ini menggunakan detail Meta Conversions API Anda sendiri.

1. Di Meta Events Manager, temukan ID piksel (juga disebut dataset) Anda di bawah Data sources, dan buat token akses di bawah Settings, Conversions API, **Generate access token**.
2. Di **Settings → Ad click tracking**, di bawah **Send results to Meta (optional)**, masukkan **Pixel / dataset ID** dan **Access token**. Klik **Save Meta details**.
3. Opsional: periksa koneksi. Di Meta Events Manager, buka piksel Anda dan buka tab **Test events**, salin kode pengujian yang ditampilkan di sana, tempelkan di bawah **Send a test event** dan klik **Send test event**. Baris di bawah tombol tersebut bertuliskan "Meta received 1 test event" (cari di bawah Test events di Meta), atau menampilkan alasan Meta jika ditolak, misalnya token yang salah. Kode tersebut hanya digunakan untuk pengujian itu saja dan tidak pernah disimpan.
4. Buka editor agen, buka tab **Tags** dan buka sebuah tag. Di bawah **Send to Meta**, pilih peristiwa: **Lead**, **Contact**, **Schedule**, **Purchase**, atau nama kustom. Secara opsional, tambahkan nilai dan mata uang.

Sejak saat itu, setiap kali tag tersebut diterapkan ke kontak (oleh AI, secara manual, melalui API, atau melalui otomatisasi), <span data-t="appName">DM Champ</span> mengirimkan peristiwa tersebut ke Meta dengan data klik terbaru kontak (`fbc`, `fbp`, alamat IP, browser, halaman landas, dari klik terbaru jika ada, jika tidak maka klik pertama) ditambah nomor telepon, email, dan nama mereka, yang di-hash, sehingga Meta dapat menautkannya ke iklan. Kontak tanpa kecocokan tetap mengirimkan peristiwa tersebut, hanya dengan nomor telepon, email, dan nama yang di-hash.

- **Peristiwa langsung selalu dihitung:** kode peristiwa pengujian tidak pernah disimpan bersama detail Meta Anda, sehingga peristiwa yang dikirim oleh tag dan otomatisasi Anda selalu masuk ke data asli Anda di Meta, tidak pernah ke tab Test events.
- **Tidak ada penghitungan ganda:** setiap peristiwa memiliki ID tetap yang terdiri dari ID kontak dan nama tag. Jika CRM Anda mengirim peristiwa yang sama ke Meta dengan ID yang sama, Meta hanya akan menyimpan satu.
- **Jendela atribusi Meta:** Meta hanya mengkreditkan peristiwa ke iklan dalam jendela atribusinya, yang secara default adalah 7 hari setelah klik. Kesepakatan yang ditutup beberapa minggu kemudian tidak akan dihitung dengan sendirinya, jadi kirimkan juga peristiwa sebelumnya, misalnya tag untuk konsultasi yang dipesan atau dibayar.

---

## Mengirim konversi dari otomatisasi

Sebuah tag mengirimkan peristiwanya saat tag tersebut diterapkan. Jika hasilnya terjadi di tempat lain, seperti kesepakatan yang ditutup di CRM Anda atau konsultasi yang dijadwalkan, gunakan tindakan **Kirim konversi ke Meta** dalam otomatisasi. Tindakan ini melaporkan satu peristiwa ke dataset Meta Anda melalui Conversions API, sehingga Meta mengoptimalkan iklan Anda berdasarkan hasil nyata, bukan hanya berdasarkan pesan.

Tindakan ini menggunakan detail Meta yang sama dengan tag: **ID Piksel / dataset** dan **Token akses** di bawah **Pengaturan → Pelacakan klik iklan**. Tanpa detail tersebut, langkah ini akan gagal dengan pesan "Meta tidak terhubung".

**Kolom-kolom**

| Bidang | Kegunaan |
|---|---|
| **Nama peristiwa** | Wajib. **Purchase**, **Schedule**, **Lead**, atau nama Anda sendiri. Nama Anda sendiri menggunakan huruf, angka, spasi, dan garis bawah, dimulai dengan huruf, dan maksimal 40 karakter. |
| **Nilai** dan **Mata uang** | Jumlah konversi, seperti jumlah kesepakatan. Mata uang adalah kode 3 huruf dan defaultnya adalah EUR. Nilai hanya dikirim jika Anda mengisinya. |
| **Kontak** | Opsional. Kontak pemilik konversi tersebut. |
| **Email**, **Telepon**, **Nama depan**, **Nama belakang** | Detail orang tersebut. Isi kolom ini jika orang tersebut bukan kontak, atau untuk menambah informasi yang sudah dimiliki kontak. |
| **ID Anda sendiri untuk orang tersebut** | ID untuk orang tersebut dari sistem Anda sendiri, seperti ID CRM. |
| **ID peristiwa** | ID yang digunakan Meta untuk menghitung peristiwa satu kali. Lihat di bawah. |
| **Waktu peristiwa** | Kapan konversi terjadi, dalam detik unix atau tanggal. Maksimal 7 hari yang lalu. Biarkan kosong untuk menggunakan waktu saat langkah dijalankan. |
| **URL halaman** | Halaman yang ditautkan ke konversi, jika ada. |
| **Kode peristiwa pengujian** | Hanya untuk uji coba: kode dari tab Test events di Meta. Peristiwa yang dikirim dengan kode ini akan muncul di bawah Test events dan tidak dihitung untuk iklan Anda. Biarkan kosong untuk peristiwa langsung. |

Isi setidaknya satu dari **Kontak**, **Email**, atau **Telepon**. Orang tersebut tidak harus berupa kontak: kesepakatan HubSpot yang mencapai Closed Won dapat mengirimkan Purchase dengan jumlah kesepakatan dan email pembeli.

Saat Anda memilih **Kontak**, telepon, email, dan nama mereka akan digunakan. Jika mereka berasal dari klik iklan yang dicocokkan oleh skrip, detail klik juga akan disertakan, yang membantu Meta mencocokkan peristiwa dengan iklan. Email, telepon, dan nama akan di-hash sebelum dikirim. ID klik, alamat IP, dan browser dikirim sesuai persyaratan Meta.

**ID Peristiwa dan penghitungan ganda**

Meta menghitung peristiwa dengan nama peristiwa yang sama dan ID Peristiwa yang sama hanya satu kali. Gunakan ID tetap, seperti ID kesepakatan, jika alat lain juga melaporkan konversi yang sama, atau jika otomatisasi mungkin berjalan dua kali untuk itu. Biarkan kosong agar ID baru dibuat setiap kali dijalankan, sehingga setiap kali dijalankan akan dihitung.

**Perbedaannya dengan peristiwa tag**

Peristiwa **Kirim ke Meta** dari tag dikirim satu kali per kontak untuk tag tersebut (maksimal sekali dalam 30 hari). Tindakan ini mengirim setiap kali dijalankan. ID Peristiwa adalah hal yang mencegah konversi dihitung dua kali.

**Contoh: kesepakatan yang ditutup dan konsultasi yang dijadwalkan**

1. Mulai otomatisasi dengan pemicu **Peristiwa aplikasi**, pilih **HubSpot** dan **Tahap kesepakatan diperbarui**, lalu tambahkan **Kondisi** agar hanya Closed Won yang diproses.
2. Tambahkan **Kirim konversi ke Meta**. Atur **Nama peristiwa** ke **Purchase**, **Nilai** ke jumlah kesepakatan (masukkan dengan tombol **+**), dan **Mata uang** ke mata uang Anda. Masukkan email pembeli di **Email** dan ID kesepakatan di **ID Peristiwa**, agar kesepakatan yang sama tidak pernah dihitung dua kali.
3. Untuk konsultasi yang dijadwalkan, mulai otomatisasi kedua dengan pemicu **Janji temu dijadwalkan** dan tambahkan **Kirim konversi ke Meta** dengan **Nama peristiwa** diatur ke **Schedule** dan kontak dari pemicu di **Kontak**. Jika mau, tambahkan langkah **Kirim konversi ke Meta** kedua yang mengirimkan **Purchase** dengan nilai tetap, seperti harga konsultasi.

Anda juga dapat mengirim konversi melalui API dengan `POST https://api.dmchamp.com/v1/ad-attribution/meta-event`. API ini menggunakan kolom yang sama dalam format snake case: `event_name`, `value`, `currency`, `contact_id`, `email`, `phone`, `first_name`, `last_name`, `external_id`, `event_id`, `event_time`, `event_source_url` dan `test_event_code`.

---

## FAQ

**Apakah ini berfungsi jika iklan saya membuka WhatsApp secara langsung?**
Iklan tersebut tidak melalui situs web Anda, sehingga skrip tidak pernah berjalan. Meta mengirimkan detail iklan dengan pesan pertama sebagai gantinya, lihat [Atribusi Iklan Klik-ke-WhatsApp](click-to-whatsapp-attribution.md).

**Apakah skrip memperlambat situs web saya atau menyetel cookie?**
Skrip dimuat di latar belakang (`async`), tidak menyetel cookie, dan tidak memuat apa pun lagi. Skrip hanya mengirim sesuatu ketika pengunjung mengetuk tombol WhatsApp.

**Bisakah saya melacak Google Ads dan juga Meta ads?**
Ya. ID klik Google (`gclid`, `gbraid`, `wbraid`) dan tag kampanye apa pun direkam dan ditampilkan pada kontak. Mengirim hasil kembali hanya tersedia untuk Meta.

**Mengapa kontak tidak mendapatkan kecocokan?**
Alasan paling umum: pesan tiba lebih dari 15 menit setelah ketukan, nomor pertanyaan dihapus dari pesan, nomor pertanyaan dinonaktifkan dan pengunjung lain mengirim teks yang sama, atau halaman tidak memiliki skrip.

**Situs web saya menautkan ke dua nomor WhatsApp. Bisakah saya melacak hanya satu?**
Ya. Ketik nomor tersebut di bawah **Nomor WhatsApp** di pengaturan. Biarkan kosong untuk melacak setiap tautan WhatsApp.

**Bisakah saya mengubah kata-katanya nanti?**
Ya. Perubahan akan langsung diterapkan ke situs web Anda; Anda tidak perlu menempelkan skripnya lagi.
