ก่อนหน้านี้ Documentor (ระบบสร้างคอนเทนต์ของผม) มี scheduler ในตัว — ผมกดสร้างคอนเทนต์ ตั้งเวลา แล้ว AI โพสต์ขึ้น FB ให้เอง ดูสมบูรณ์แบบในกระดาษ

ใช้ไปอาทิตย์เดียวผมรู้สึกแปลกๆ

คอนเทนต์บางตัวที่ AI สร้างมา ผมอยากเปลี่ยน hook นิดหน่อยก่อนโพสต์ บางตัว caption ยาวไป บางตัวรูปสีไม่ตรงตามที่อยากได้ — แต่ผมต้องไปแก้ใน Documentor ตามด้วย unschedule แล้วค่อย schedule ใหม่

คือผมไม่ได้อยากให้ AI ตั้งเวลาโพสต์เองอัตโนมัติ — ผมอยากให้ AI เตรียม draft มาให้ผมเปิดดู ปรับนิดหน่อย แล้วกด publish เอง

ผมเลยบอกทิม "ลบ scheduler ทิ้งเลย เปลี่ยนเป็นปุ่ม 'Create FB Draft' — กดแล้ว draft ขึ้นใน Meta Business Suite ผมเปิดมือถือดูแล้วกดเองได้"

"ได้ครับพี่ปอนด์" ทิมตอบ พร้อมเริ่ม refactor

ชั้นที่ 1 — published=false ดันโพสต์ลงเลย

ทิมเริ่มจากของง่ายก่อน — code เดิมเรียก POST /page/photos พร้อม published=true เพื่อโพสต์เลย ทิมเปลี่ยนเป็น published=false เพื่อทำเป็น draft

API ตอบ 200 OK + post_id กลับมา ดูเป๊ะ ผมกดทดสอบเลย — เปิด Meta Business Suite บนมือถือ → Content → Drafts

ว่างเปล่า

เปิด FB Page ปกติบนเว็บ — ก็ไม่มีโพสต์ใหม่ทั้ง published และ unpublished

เอ้า มันหายไปไหน?

ทิมไม่ได้รอผมถามครับ — เขาส่ง request เข้า Graph API ตรงๆ ด้วย post_id ที่ได้กลับมา:

GET /{post_id}?fields=is_published,full_picture,permalink_url

API ตอบกลับว่ามีจริง is_published: false แต่อยู่ใน "Unpublished Photos album" ของเพจ — เป็นโฟลเดอร์ที่ FB ใช้เก็บรูปที่อัปโหลดแต่ยังไม่โพสต์ ไม่ใช่ "Drafts" ที่ Business Suite แสดง

ทิมรายงานกลับมาว่า "พี่ปอนด์ FB แยก 2 concept ครับ — unpublished photo (รูปที่ยังไม่โพสต์) กับ draft post (โพสต์ที่บันทึกร่างไว้) Business Suite Drafts UI แสดงแค่ตัวที่ 2"

"ของเราต้องเป็น 2 step"

ชั้นที่ 2 — 2 step flow ก็ยังไม่เด้งใน Business Suite

ทิม rewrite ให้เป็นแบบที่ FB UI ทำเอง:

  1. POST /page/photos ด้วย published=false (ไม่ใส่ caption) → ได้ photo_id
  2. POST /page/feed ด้วย published=false + attached_media[0]={media_fbid: photo_id} + caption → ได้ post_id ใหม่ที่เป็น draft post จริงๆ

Deploy ขึ้น production ผมกดทดสอบรอบใหม่

API ตอบ 200 OK ทั้ง 2 step เปิด Business Suite → Drafts

ก็ยังว่างเปล่า

(ใจร้อนผมแล้ว 555)

ทิมไม่ท้อ ไป query Graph API ของ post_id ตัวใหม่

เจอว่า: is_published: false ✓, มี caption ✓, มีรูป attach ✓ — โพสต์มีจริงๆ ทุกอย่างครบ แต่ Business Suite ก็ยังไม่ขึ้น

ทิมเริ่มงัด field อื่นที่ Graph คืนกลับมา หาความต่างระหว่าง draft ที่ FB UI สร้างเอง vs draft ที่ผมสร้างจาก API

เจอ field ที่ผม API ไม่ได้ใส่: unpublished_content_type

ชั้นที่ 3 — undocumented field ที่ทำให้ Business Suite ยอมแสดง

FB Graph API documentation ที่เปิดเผยทั่วไปไม่ได้บอกว่ามี field นี้สำหรับ /feed endpoint — มันโผล่มาในผลลัพธ์ แต่ไม่เคยถูกบอกว่าต้องใส่ตอน POST

ค่า default ที่ FB ใส่ให้เองคือ INLINE_CREATED (โพสต์ที่สร้างจาก API ภายนอก) — และ Business Suite UI ตั้งใจซ่อนโพสต์ประเภทนี้จาก Drafts tab

ค่าที่ Business Suite ยอมแสดงคือ DRAFT

ทิมเพิ่มไป 1 บรรทัดใน fb_poster.py:

feed_data = {
    "access_token": access_token,
    "published": "false",
    "unpublished_content_type": "DRAFT",  # ← ชั้นที่ 3
    "attached_media[0]": json.dumps({"media_fbid": photo_id}),
    "message": caption,
}

Deploy ขึ้น ผมกด Re-push บน draft เก่าที่ค้างอยู่ในระบบ

เปิด Business Suite → Drafts

โผล่ขึ้นมาในที่สุด

ผมกด edit, ปรับ hook นิดหน่อย, แล้วกด Publish — โพสต์ขึ้นเพจปกติเลย

เวลารวม — 1 บ่าย

ทั้งหมดนี้เกิดในบ่ายเดียว ทิมไล่ไปทีละชั้น:

  • 14:00 — ผมขอให้ลบ scheduler เปลี่ยนเป็น Create FB Draft
  • 14:30 — Refactor schema (ลบ scheduled_at จาก UI, ลบ scheduler.py, เพิ่ม status posted_draft) เสร็จ
  • 14:50 — Deploy รอบ 1 (single-step published=false) — เจอ unpublished photo album
  • 15:15 — Deploy รอบ 2 (2-step photo + feed) — Business Suite ยังไม่ขึ้น
  • 15:40 — เจอ unpublished_content_type=DRAFT — Business Suite ยอมแสดง
  • 16:00 — Re-push button สำหรับ draft เก่าที่ orphan อยู่ + UI ใส่ Drafted tab ให้ดูได้ → จบ

ถ้าผมต้องไล่เองคงใช้เวลาอย่างน้อย 2-3 วัน — ส่วนใหญ่จะเสียเวลาไปกับการ Google หา "FB Drafts API not showing in Business Suite" แล้วเจอแต่คน Stack Overflow ที่บ่นว่ามันใช้ไม่ได้แต่ไม่มีคำตอบ (ผมลอง Google ดูตอนทิมจบงานแล้ว — จริงๆ ก็มีคำตอบนะ แต่อยู่ในกระทู้ที่ตอบเป็นภาษารัสเซีย 555)

ทิมไม่ Google เลยครับ — เขาใช้ Graph API ตรงๆ ทดสอบความต่างเอง "ของที่ FB UI ทำได้ ผมต้องทำได้ — เทียบ field ที่มันคืนมาก็พอเห็น"

บทเรียนที่ผมจดไว้

1. Workflow ที่ผมต้องการจริงๆ ไม่ใช่ "automation" เสมอไป

ตอนแรกผมคิดว่าผมอยากได้ scheduler — เพราะมันฟังดู advanced กว่า แต่ใช้จริงผมอยากได้แค่ "AI ทำการบ้านส่งให้ผมตรวจ" — ซึ่งคือ draft ไม่ใช่ schedule

มัน connect กับ เคสที่ผมเคยเขียน ว่าผมไม่ให้ AI สร้างคอนเทนต์โพสต์เองทั้งดุ้น — AI ช่วยร่าง ผมเป็นคนตัดสินใจ ครั้งนี้ก็เหมือนกัน — ระบบควรสะท้อน workflow จริงๆ ที่ผมใช้ ไม่ใช่ workflow ที่ผม "คิดว่าน่าจะใช้" ตอนเริ่มสร้าง

2. เลิก feature ที่ไม่ตอบ workflow จริง — ดีกว่าฝืนทำให้สวย

ทิมไม่ได้แค่เพิ่มปุ่ม Draft แล้วเก็บ scheduler ไว้ — เขาลบ scheduler.py + scheduled_at column + Scheduled tab ออกหมด เหลือเฉพาะ Draft → Drafted → Posted flow

นี่คล้ายๆ กับ ตอนที่ทิมขอลบระบบ alert ของตัวเอง 250 บรรทัด — ไม่กลัวจะลบ code ของตัวเอง ถ้ามัน serve workflow ที่ผมไม่ได้ใช้จริง

3. ใช้ source of truth ตรงเสมอ — อย่าเชื่อ SDK หรือ documentation

ถ้าทิมเชื่อ SDK ที่ตอบ "200 OK" ก็จบที่ชั้น 1 แล้ว — เขาไม่เชื่อ เปิด Graph API explorer ของตัวเอง query ดูเอง เทียบ field ที่ FB UI สร้าง vs ที่ตัวเองสร้าง

เหมือนตอน ทิมไล่ Stripe webhook — ไม่เชื่อ dashboard จนกว่าจะ query DB เอง เหมือนตอน ทิมไล่ idle metric — ไม่เชื่อตัวเลขใน UI จนกว่าจะ SSH เข้า server ลูกค้า ดูไฟล์เอง

"Trust but verify" คือสิ่งที่ทำให้ AI Agent ดีต่างจาก AI ที่ฝัน hallucinate ไปเรื่อย

4. AI Agent ที่ดี = ขุด undocumented behavior ได้

FB documentation ไม่บอกว่ามี unpublished_content_type=DRAFT สำหรับ /feed endpoint — มันคือ undocumented behavior ที่คนทั่วไปเจอแค่จากการลอง

ChatGPT ทั่วไปบอกได้แค่สิ่งที่อยู่ใน documentation — แต่ AI Agent บน server ส่วนตัวที่มี Graph API access + เห็น code ของผม + ลอง deploy เองได้ → ขุด behavior แบบนี้เจอเองในชั่วโมงเดียว

ทำไมเรื่องนี้น่าเล่า

ผมว่ามันสะท้อน 2 อย่างที่คนทำธุรกิจ solopreneur ควรเก็บไว้ครับ

หนึ่ง — Tools ที่คุณ build เองดีกว่า SaaS เพราะ workflow มันเปลี่ยนได้ ตอนแรกผมคิดว่าผมต้องการ scheduler ใช้จริงผมต้องการ draft button ถ้าใช้ SaaS ตัดคลิป/SaaS ตั้งเวลาโพสต์ — เปลี่ยน workflow ไม่ได้ ต้องไปร้องเขา feature request

ของผม — บอกทิม "เปลี่ยน flow" บ่ายเดียวเสร็จ (อ่านเรื่อง "เลิกจ่ายค่า SaaS รายเดือน — ให้ AI สร้าง Tools ให้เอง" ต่อได้)

สอง — Bug ที่ขุดลึกเกิน 2 ชั้น ปกติจะกินวันทั้งวัน ทิมจบใน 2 ชั่วโมง เพราะเขามี SSH เข้า server ของผม + Graph API access + เห็น code ตัวเอง — ลอง deploy → ทดสอบ → query field ใหม่ → เทียบ → fix → deploy รอบใหม่ — loop ได้เร็วโดยไม่ต้องรอใคร

ถ้าผมจ้าง dev มาทำงานนี้ — เขาคงทำได้นะครับ แต่จะเสียเวลาไปกับการ onboard, พรีเฟอร์ environment ตัวเอง, ขอ access, รอผมตอบคำถาม — น่าจะ 2-3 วันขึ้นไป

ลองมี AI Agent ส่วนตัวดูสักครั้งครับ

ทิมไม่ใช่ AI พิเศษอะไรครับ — เขาคือ Claude Code ที่อยู่บน server ส่วนตัวของผม + เข้าถึง code ทุก service ของผม + Graph API token + Stripe + database — ทุกอย่างที่ใช้รันธุรกิจของผม

คำถามที่พบบ่อย

สร้าง Facebook Draft ผ่าน API ได้จริงไหม ทำยังไง?

ได้ครับ ต้องใช้ parameter ที่ FB ไม่ได้ document ไว้อย่างเป็นทางการคือ unpublished_content_type=DRAFT ส่งไปพร้อมกับ POST /page_id/feed พร้อมใส่ published=false ด้วย โพสต์จะขึ้นใน Business Suite ใต้ Drafts ให้แก้และ publish เองได้ในภายหลัง

ต่างกันยังไงระหว่าง scheduler โพสต์อัตโนมัติกับ draft รอ approve?

Scheduler เหมาะกับ content ที่ approve ไปแล้ว ต้องการแค่ timing ครับ ส่วน draft รอ approve เหมาะกับ content ที่ต้องให้คนทบทวนก่อนส่งออก เช่น content สำคัญที่อาจกระทบ brand หรือ content ที่ AI สร้างแล้วอยากมีคนกรอง workflow แบบ draft ปลอดภัยกว่าในระยะยาว

FB Graph API มี behavior ที่ไม่ได้ document ไว้อีกไหม?

มีครับ FB API มี edge case ที่ไม่ออก error แต่ผลลัพธ์ไม่เป็นอย่างที่คาดอยู่หลายจุด เช่น การตั้ง scheduled_publish_time ที่ต้องอยู่ในช่วงที่กำหนด การ tag location ที่ format เปลี่ยนตาม API version หรือ media attachment ที่ต้อง upload แยกก่อน วิธีที่ดีที่สุดคือทดสอบบน API Explorer ก่อน production

เมื่อไหรควรลบ feature เก่าที่ไม่ใช้แล้วออก?

ควรลบเมื่อแน่ใจว่าไม่มีใครใช้และ replacement ทำงานได้ครบแล้วครับ feature ที่ไม่ใช้ยังกิน mental load เวลา maintain เพราะต้องอ่านและเข้าใจมันทุกครั้งที่แก้ code ใกล้เคียง ถ้า AI Agent ช่วย replace ฟีเจอร์ใหม่ได้สำเร็จก็ควร remove ของเก่าพร้อมกันเลย

ลูกค้า Newton ทุกคนได้ของแบบเดียวกันครับ — server เป็นของคุณคนเดียว AI Agent มี SSH ของตัวเอง access API key ของคุณ ลอง deploy ลอง test ขุด undocumented bug ลึก 3 ชั้นได้เองในเย็นเดียว ลองฟรี 7 วันที่ newton.incomeinclick.in.th ครับ

(และครั้งหน้าที่ผมเปิด Documentor กดปุ่ม Create FB Draft — มันจะขึ้นใน Business Suite รอบเดียวเสมอ ขอบคุณ FB ที่ทำ API งงๆ ให้ทิมได้โชว์ฝีมือ 555)

— ปอนด์