ติด Conversion Tracking ให้ฟอร์มบนเว็บ: ยิงตอนส่งสำเร็จ ไม่ใช่ตอนกดปุ่ม
Google Ads จะฉลาดได้ก็ต่อเมื่อรู้ว่าคลิกไหนกลายเป็นลูกค้า ถ้าไม่ได้บอก ระบบจะเห็นแค่คลิก แล้วพยายามหาคลิกเพิ่ม ไม่ใช่หาคนที่จะจ้างคุณ บทความนี้เล่าวิธีติด conversion ให้ฟอร์มสั่งงานบนเว็บที่ผมใช้จริง ตั้งแต่สร้าง conversion action ไปจนถึงตรวจว่าทำงานจริง
- สร้าง conversion action ใน Google Ads
- ติด Google tag ทุกหน้า
- ยิง event ตอนส่งฟอร์มสำเร็จ
- ตรวจว่าทำงานจริง
1. สร้าง conversion action
ใน Google Ads ไปที่ Goals → Conversions → สร้างใหม่ → Website แล้วเลือกตั้งค่าเอง (manual) ค่าที่ผมใช้กับฟอร์มขอใบเสนอราคา/สั่งทำระบบ
| ช่อง | ค่า | เหตุผล |
|---|---|---|
| Category | Submit lead form | ตรงกับการกรอกฟอร์ม |
| Value | ใช้ค่าต่างกันแต่ละครั้ง (ค่าตั้งต้น 0) | ถ้าฟอร์มรู้ยอด ส่งยอดจริงได้ |
| Count | One | คนเดียวกรอก 3 รอบ นับเป็น lead เดียว |
| Primary | ใช่ | ให้ระบบใช้ตัวนี้ในการเรียนรู้และ bid |
เสร็จแล้วจะได้ค่าสองตัวที่ต้องจดไว้: Conversion ID (หน้าตา AW-123456789)
และ Conversion label (ตัวอักษรสุ่มยาวๆ) ใช้คู่กันเป็น AW-123456789/AbCdEf...
ตรวจด้วยว่าเปิด Auto-tagging ในการตั้งค่าบัญชีแล้ว ตัวนี้ทำให้ URL ที่คนคลิกมามี
gclid ติดมาด้วย และ Google ใช้ค่านี้จับคู่คลิกกับ conversion
2. ติด Google tag ทุกหน้า
ใส่ใน <head> ของทุกหน้าที่คนอาจเข้ามาจากโฆษณา ไม่ใช่แค่หน้าฟอร์ม
เพราะต้องให้ tag อ่าน gclid ได้ตั้งแต่หน้าแรกที่คนเข้ามา
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-123456789"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-123456789');
</script>
ถ้าใช้ GA4 ด้วย ใส่สคริปต์ชุดเดียว แล้วเพิ่ม gtag('config', 'G-XXXXXXX') อีกบรรทัด
ทริค: อย่าฝัง ID ไว้ในโค้ด
ผมเก็บ ID ไว้ในตัวแปรสภาพแวดล้อมบนเซิร์ฟเวอร์ (เช่น GTAG_IDS) แล้วให้เซิร์ฟเวอร์แทรกสคริปต์ตอนส่งหน้าเว็บ
ข้อดีคือ เครื่องที่ใช้ทดสอบจะไม่มี tag (ไม่ทำให้ข้อมูลจริงเพี้ยน) และเปลี่ยนบัญชีได้โดยไม่ต้องแก้โค้ด
ถ้าตัวแปรว่าง หน้าเว็บก็เหมือนเดิมทุกไบต์
3. ยิง event ตอนส่งฟอร์มสำเร็จเท่านั้น
จุดที่คนพลาดบ่อยที่สุดคือยิง conversion ตอนกดปุ่ม ซึ่งนับรวมคนที่กรอกไม่ครบ หรือส่งไม่สำเร็จด้วย ให้ยิงหลังจากเซิร์ฟเวอร์ตอบว่าบันทึกสำเร็จแล้วเท่านั้น
const res = await fetch('/api/order', {method: 'POST', body: JSON.stringify(data),
headers: {'Content-Type': 'application/json'}});
const j = await res.json();
if (j.success) {
if (window.gtag) {
gtag('event', 'conversion', {
send_to: 'AW-123456789/AbCdEfGh', // ID/label จากข้อ 1
value: Number(j.amount || 0),
currency: 'THB'
});
}
showThankYou();
}
การเช็ค if (window.gtag) ไว้ก่อนทำให้ฟอร์มยังทำงานได้ปกติ แม้ผู้ใช้จะบล็อกสคริปต์โฆษณา
อีกทางที่ง่ายกว่า คือส่งคนไปหน้าขอบคุณ (เช่น /thank-you) หลังส่งฟอร์ม แล้วนับ conversion
เมื่อมีคนเปิดหน้านั้น แต่วิธีนี้นับซ้ำได้ถ้าคนรีเฟรชหน้า และมีคนเข้าตรงจากลิงก์ได้ การยิง event หลังสำเร็จแม่นกว่า
4. ตรวจว่าทำงานจริง
- ดูซอร์สหน้าเว็บจริง (ไม่ใช่เครื่องตัวเอง) ว่ามีสคริปต์
gtag/js?id=AW-…และ config ถูก ID - ใช้ Tag Assistant ของ Google เปิดเว็บแล้วลองส่งฟอร์มทดสอบ ต้องเห็น event conversion ยิงออกไปพร้อม send_to ที่ถูก
- ดูสถานะใน Google Ads ที่หน้า Conversions สถานะจะเปลี่ยนจาก Unverified หรือ Inactive เป็นกำลังบันทึก หลังมีการยิงครั้งแรก (อาจใช้เวลาหลายชั่วโมง)
คำถามที่เจอบ่อย
ต้องมีแถบขอความยินยอมคุกกี้ไหม
ถ้ามีผู้ใช้จากยุโรปหรือสหราชอาณาจักร Google กำหนดให้ใช้ระบบขอความยินยอม (consent) สำหรับข้อมูลโฆษณา สำหรับเว็บไทย ควรแจ้งการใช้คุกกี้ในนโยบายความเป็นส่วนตัวให้ครบตาม PDPA อย่างน้อยที่สุด
ถ้าลูกค้าทักแชทแทนกรอกฟอร์ม
นับคลิกปุ่ม "ทักแชท" หรือ "โทร" เป็น conversion รอง (secondary) ได้ แต่อย่าตั้งเป็น primary คู่กับฟอร์ม เพราะคลิกปุ่มทักแชทไม่ได้แปลว่าคุยจริง ระบบจะเรียนผิด
เมื่อไหร่ควรเปลี่ยนจาก Maximize clicks เป็น Maximize conversions
เมื่อมี conversion สะสมพอให้ระบบเรียน (หลายสิบครั้งในช่วง 30 วัน) ก่อนหน้านั้นใช้ Maximize clicks พร้อมเพดานราคาต่อคลิกจะคุมงบได้ดีกว่า