วันก่อนผมจะยิงแอด retarget คนที่ follow เพจของผมอยู่แล้ว — แทนที่จะเปิด Ads Manager คลิก Custom Audience เอง ก็บอกทิม (AI Agent ของผม) ให้เขียน script ผ่าน FB Marketing API ให้เลย เผื่อทำซ้ำได้ ทำแคมเปญต่อๆไปได้ — ปรากฏว่า FB ด่ากลับมาด้วย error 2654 "Invalid Event Name" ทื่อๆเลย 555
ทำไมต้อง custom audience ตอนนี้
เดือนพฤษภาคมผมมีงาน event ที่จะขึ้นพูดเรื่อง One Person Business 100X with AI วันที่ 23 พฤษภานี้ ผมเลยอยากยิงแอด retarget คนที่ follow เพจของผมอยู่แล้ว — กลุ่มที่ engage กับเราอยู่แล้ว conversion rate มันสูงกว่ายิงคนนอกเยอะ
ปกติคนทั่วไปก็เปิด Ads Manager → Audiences → Create Custom Audience → Page → People who like or follow your Page → Save จบครับ แค่ 5 คลิก
แต่ผมไม่อยากทำแบบนั้น เพราะ:
- ผมต้องสร้าง audience หลายตัว (followers, engaged 30d, engaged 60d, etc.)
- แคมเปญหน้าผมก็จะใช้ pattern เดียวกัน คลิกซ้ำๆ ไม่จบ
- ถ้ามี script ไว้ครั้งเดียว — แคมเปญต่อๆ ไป AI Agent ก็สั่ง create ได้เอง
- และผมตั้งใจให้ ทิมเป็นคนยิงแอดเอง อยู่แล้ว ดังนั้นทุก piece ต้องเป็น code — ไม่ใช่ UI ที่ต้องคลิก
เลยบอกทิมไป "เขียน script สร้าง custom audience ผ่าน FB Marketing API ให้หน่อย"
5 นาทีต่อมา — FB ด่ากลับด้วย error 2654
ทิมเขียนเสร็จเร็วมาก เพราะ FB doc มันก็มี example อยู่ ส่ง POST ไปที่ /act_{ad_account_id}/customaudiences รอบแรก response กลับมา:
{
"error": {
"code": 2654,
"message": "Invalid Event Name",
"type": "OAuthException"
}
}
"Invalid Event Name" — แต่ event name ที่ส่งไปคือ page_liked ซึ่งเป็น event มาตรฐานของ FB เอง ไม่ใช่ชื่อแปลกๆ ที่ผมแต่งขึ้น
ปกติเจอ error API ที่ไม่รู้ว่าผิดที่ไหน ผมคงเสียเวลาเป็นชั่วโมง — เปิด Stack Overflow, Facebook Developer Community, GitHub issues, ลอง googling error code 2654 — แล้วก็ต้องเดาเอาเอง
แต่ผมไม่ทำเอง ผมส่งให้ทิมไป handle ต่อ
AI ไล่หาเอง 30 นาที — เจอ bug 2 ที่
ทิมไม่ได้ google แค่ผิวๆ มันไป compare กับ Facebook Marketing API doc 2 versions — เวอร์ชันปัจจุบัน (v23.0) กับเวอร์ชันก่อนหน้า — แล้วเจอว่ามี field 2 ตัวที่เปลี่ยนไปแบบเงียบๆ:
- field
subtype: ENGAGEMENT— FB deprecate ตั้งแต่ v3.0 (กันยายน 2018)
ตัวอย่าง code เก่าที่เกลื่อนใน Stack Overflow / blog tutorial / GitHub repo ทั่ว internet ยังใส่ field นี้กันอยู่ — แต่ปัจจุบันถ้าใส่เข้าไป FB ตอบกลับเป็น "Invalid Event Name" ทื่อๆ ไม่บอกตรงๆ ว่า "field นี้เรา deprecate ไปแล้วนะ" - Operator ต้องเป็น
"eq"ไม่ใช่"="
คล้าย SQL ที่เราคุ้นกับfield = value— แต่ FB API filter ใช้{"operator": "eq", "value": "page_liked"}ถ้าใช้=ตอบกลับเป็น "Invalid Event Name" เหมือนกันเป๊ะ ทั้งที่จริงๆ "Invalid Operator" ก็ได้
error message เดียวกัน แต่สาเหตุคนละเรื่อง — นี่แหละครับ debug ยากมาก ถ้าไม่ได้ไล่ doc เวอร์ชันต่อเวอร์ชัน เป็นไปไม่ได้เลยที่จะรู้
บวกกับ bonus ตัวที่ 3 ที่ทิมเจอเพิ่ม:
- event
page_likedบังคับretention_seconds: 0เพราะ FB ถือว่า "people who like your page" เป็น lifetime audience ไม่มีหน้าต่างเวลา ถ้าใส่เลขอื่นเช่น 5184000 (60 วัน) FB จะส่ง error subcode 1713214: "Can't Choose Data Time Limit"
ทิม patch code ตามทั้ง 3 จุด commit push run — รอบนี้ FB ตอบกลับเป็น {"id": "120..."} สร้าง audience สำเร็จครับ ใช้เวลารวมประมาณ 30 นาทีตั้งแต่บอกทิมว่าเจอ error
ผลลัพธ์
ตอนนี้ผมมี script ที่สร้าง custom audience บน FB ผ่าน API ได้ตรงๆ — เก็บไว้ที่ /root/100x-ads/create_audiences.py รันได้ทุกแคมเปญที่ต้องการ
สร้าง audience 3 ตัวภายในนาทีเดียว:
- Page Followers — ทุกคนที่ like เพจ (lifetime) — ใช้ retarget งาน event
- Engaged 30d — engage ในรอบ 30 วัน — ใช้ retarget คอนเทนต์ใหม่
- Engaged 60d — engage ในรอบ 60 วัน — ใช้ลด CAC ของแคมเปญ awareness
แคมเปญต่อๆไปไม่ต้องเปิด Ads Manager คลิกอีก — บอกทิม ทิมรัน script ครับ
บทเรียน — error message โกหกได้ ถ้าไม่อ่าน doc version history
เรื่องนี้ทำให้ผมเห็นชัดอีกครั้งว่า — error message ของ API ใหญ่ๆ เช่น FB Graph API, Google API, Stripe — มันออกแบบไม่ดีเหมือนกัน "Invalid Event Name" สำหรับ field ที่ไม่เกี่ยวข้อง คือเรื่องปกติ
วิธี debug ที่ถูกต้องคือไป compare doc version ต่อ version ดูว่า field/operator/format ไหนเปลี่ยน — แต่งานนี้เป็นงานที่ AI ทำได้ดีกว่าเราเยอะ เพราะมัน read full doc ทั้ง 2 versions ในเวลาที่เรายังเปิดหน้าแรกของ doc ไม่ทันเลย
ถ้าเป็นเมื่อก่อน — ผมอาจจะใช้เวลาเป็นวัน วนลูปลองแก้ทีละ field แบบสุ่ม จนกว่าจะเจอ หรือไม่ก็ยอมแพ้กลับไปคลิก Ads Manager เอง
นี่ก็เป็นเหตุผลที่ผมเคยเขียนเรื่อง ทำไมเลิกจ่ายค่า SaaS แล้วให้ AI สร้าง tools ให้เอง ดีกว่า — เพราะ SaaS ส่วนใหญ่ก็ wrap FB API ไว้ข้างใน ถ้า FB เปลี่ยน schema เราต้องรอ SaaS อัปเดต แต่ AI Agent ของเรา debug + แก้ + deploy ได้เอง 30 นาทีจบ
และมันคล้ายกับเคสที่ AI ไล่หา Stripe webhook gap ใน 1 ชั่วโมง หรือ AI แก้คลิป FB ที่เบลอเป็น 360p เอง — pattern เดียวกันเลย: API ของ platform ใหญ่ มี quirk เยอะ AI Agent ที่อ่าน doc ทั้ง 2 versions + ไล่ root cause ได้ มีค่ามากกว่าที่คิด
ทำไมต้องมี AI Agent บน server ส่วนตัว
เรื่องแบบนี้ทำกับ ChatGPT/Claude บน web ไม่ได้นะครับ เพราะ:
- มันต้องเข้าถึง
act_tokenของ FB Ad Account ของเรา ซึ่งเป็น secret ไม่ใช่จะแปะให้ ChatGPT public - มันต้องรัน script ลอง POST จริง อ่าน response แล้ว iterate ต่อ ไม่ใช่แค่ "บอกเฉยๆ ว่าน่าจะแก้ยังไง"
- มันต้องเก็บ
create_audiences.pyไว้ใน repo ของผม ใช้ครั้งต่อไปได้ - มันต้อง commit + push ขึ้น git เก็บประวัติว่าแก้อะไรไปบ้าง
นั่นแหละครับ คือสิ่งที่ AI Agent บน server ส่วนตัวทำได้ — และเป็นเหตุผลที่ผมไม่ใช้แค่ ChatGPT แล้ว มาตั้ง AI Agent ส่วนตัวบน server ของตัวเองแทน (อีกเคส FB Graph API ล่าสุดที่ทิมเจอ — backfill comment ใน 58 โพสต์เก่า แบบ rate-limit + idempotent ในเย็นเดียว)
คำถามที่พบบ่อย
Facebook Marketing API error 2654 "Invalid Event Name" เกิดจากอะไร
Error 2654 มักเกิดจาก field ที่ Facebook deprecated ไปแล้วหลายปีก่อนครับ เช่น subtype: ENGAGEMENT ที่ถูก deprecate ตั้งแต่ API v3.0 ปี 2018 แต่ยังอยู่ในตัวอย่างโค้ดเก่าทั่ว Stack Overflow ปัญหาคือ error message ไม่บอกตรงๆ ว่า field ไหนมีปัญหา ต้องเทียบ doc หลายเวอร์ชันถึงจะเจอ
วิธีสร้าง Facebook Custom Audience ผ่าน Marketing API โดยไม่ใช้ Ads Manager
ส่ง POST request ไปที่ /act_{ad_account_id}/customaudiences พร้อม access token ครับ สำหรับ Page engagement audience ต้องใช้ rule type: ENGAGEMENT ไม่ใส่ subtype, operator เป็น eq ไม่ใช่ = และถ้าสร้าง page_liked audience ต้องใส่ retention_seconds: 0 เพราะ Facebook ถือว่าเป็น lifetime audience
ทำไม error message ของ Facebook API ถึงมักบอกสาเหตุผิดหรือบอกไม่ครบ
เป็นปัญหาที่รู้กันในหมู่ developer ครับ Facebook ออกแบบ error message ให้ generic เกินไป เช่น "Invalid Event Name" อาจหมายถึงได้หลายสาเหตุตั้งแต่ field deprecated, operator ผิด, ไปจนถึง parameter ขาด วิธีที่ได้ผลคือเทียบ doc เวอร์ชันปัจจุบันกับเวอร์ชันก่อนหน้าเพื่อหาสิ่งที่เปลี่ยน
ถ้าอยากให้ AI Agent สร้าง Facebook Custom Audience ให้อัตโนมัติ ต้องทำอะไรบ้าง
ต้องมี AI Agent ที่เข้าถึง FB Ad Account access token ได้โดยตรงครับ และต้องรันบน server ที่ยิง API call จริงได้ ไม่ใช่แค่แนะนำ วิธีที่ปฏิบัติได้คือเก็บ token ใน .env บน server, ให้ AI เขียน script ครั้งแรก แล้วเก็บไว้ใน repo ใช้ซ้ำในทุกแคมเปญถัดไปโดยไม่ต้องเปิด Ads Manager
เคสนี้สรุปสั้นๆ ก็คือ — มี AI Agent บน server ส่วนตัวที่ลงมือทำงาน FB Marketing API ได้เอง คือเรื่องที่ทำให้ผม run แคมเปญแอดได้แบบไม่ต้องเปิด Ads Manager เลย ถ้าคุณก็อยากมี AI Agent ที่ debug API quirk + เขียน script automation + push code ขึ้น git แทน — ลอง Newton ดูครับ เซิร์ฟเวอร์ส่วนตัวพร้อม AI Agent ของตัวเอง 10 นาทีพร้อมใช้ ไม่ต้องมีความรู้เรื่อง server มาก่อนเลย
— ปอนด์
