แพ็กเกจของ juudd ไม่นับ request ทั้งแพ็กเกจฟรีและแพ็กเกจ $12 ต่อเดือน และทั้งสองแพ็กเกจก็ไม่นับแบนด์วิดท์ด้วย
เรื่องราคาในส่วนที่แตะกับทราฟฟิกมีอยู่เท่านี้ ที่เหลือในหน้านี้คือเหตุผลที่บังคับให้ตัดสินใจแบบนั้น สิ่งที่เราเจอตอนไปตรวจว่าเรารับไหวจริงไหม และส่วนเดียวที่เรายังอนุมานอยู่ ไม่ได้วัดมา
มิเตอร์ที่คุณคุมไม่ได้ คือบิลที่คุณอธิบายไม่ได้
request เป็นมิเตอร์ตัวแรกที่เราคิดถึง และการปฏิเสธมันเป็นการตัดสินใจเรื่องผลิตภัณฑ์ ไม่ใช่เรื่องเลขคณิต บอตหรือ curl ที่ถล่มเข้ามาทำให้จำนวน request พุ่ง แล้วลูกค้าก็โดนเรียกเก็บเงินค่าทราฟฟิกที่ตัวเองไม่ได้อยากได้และห้ามไม่ได้ บิลที่อธิบายไม่ได้คือสิ่งที่มิเตอร์นับ request สร้างขึ้นในวันที่ลูกค้าทำอะไรกับมันได้น้อยที่สุดพอดี
คุณห้ามมันไม่ได้เพราะทราฟฟิกไม่ได้วิ่งผ่านคุณเข้ามา มันมาถึงที่ edge ที่ hostname จากเลขที่อยู่ที่ไม่มีใครในสองฝ่ายนี้เลือก มิเตอร์ที่เก็บเงินคุณตามพฤติกรรมของคนแปลกหน้า คือมิเตอร์ที่เปลี่ยนเช้าวันที่แย่ให้กลายเป็นใบแจ้งหนี้
แบนด์วิดท์คือมิเตอร์ที่คนนึกถึงต่อ และเราไม่ได้ซื้อมันเลย
แบนด์วิดท์คือมิเตอร์ตัวถัดไปที่คนคาดว่าจะเจอ มันฟังดูเข้าท่าและมันผิด: แพลตฟอร์มนี้ไม่ได้จ่ายค่าแบนด์วิดท์ ประโยคนั้นจะจริงได้ต้องมีสามอย่างเป็นจริงพร้อมกัน และทั้งสามอย่างเป็นจริง
| สิ่งที่เราซื้อ | คิดเงินจากอะไร |
|---|---|
| edge | request ไม่ใช่ปริมาณข้อมูลที่ส่ง |
| สายการเสิร์ฟทั้งสาย | dispatch → เว็บลูกค้า → ขาออก คิดรวมเป็น request เดียว |
| ฐานข้อมูล | รวม egress 500 GB ต่อโปรเจกต์ เทียบกับ 0.047 MB ที่วัดได้ |
การคิดค่าแบนด์วิดท์คือการคิดเงินจากของที่เราไม่ได้ซื้อ นั่นไม่ใช่ความใจดี มันแค่การไม่ประดิษฐ์ต้นทุนขึ้นมาแล้วส่งต่อให้คุณ
จากการปฏิเสธสองครั้งนั้น มีกฎข้อหนึ่งหลุดออกมา และเราอยากประกาศมันเป็นส่วนหนึ่งของราคามากกว่าจะเก็บไว้เป็นนโยบายของฝ่ายช่วยเหลือ: ทราฟฟิกที่ลูกค้าไม่ได้ก่อ เป็นของเราที่ต้องรับไว้เอง นโยบายคือสิ่งที่คุณต้องเอ่ยปากขอให้เขาใช้กับคุณ ราคาคือสิ่งที่คุณอ่านได้ตั้งแต่ก่อนสมัคร
คำถามเดียวที่ฆ่าโควตาของแพ็กเกจฟรี
แพ็กเกจฟรีเกือบได้ออกไปพร้อมโควตา 100,000 request ต่อเดือน มันถูกฆ่าด้วยคำถามเดียวจากเจ้าของ:
ถ้าเว็บของลูกค้าที่ใช้ฟรีโดนบอตถล่ม เราจะนับเป็นความผิดเขาไหม
คำตอบต้องเป็นไม่ และเมื่อคำตอบเป็นไม่ โควตาก็ไม่เหลืออะไรให้ทำ เพราะการนับคือสิ่งเดียวที่มันมีไว้ทำ ยังมีเหตุผลอีกสองข้อที่ควรพูดออกมาดัง ๆ
ข้อแรก แพ็กเกจฟรีที่นับทราฟฟิกจากบอตด้วย จะเข้มงวดกับคนที่ไม่ได้จ่ายอะไรเลย มากกว่าที่เข้มงวดกับคนที่จ่าย เราเพิ่งสัญญาไปว่าจะรับทราฟฟิกที่ลูกค้าไม่ได้ก่อไว้เองในแพ็กเกจที่จ่ายเงิน การเอามิเตอร์ไปจับมันในแพ็กเกจฟรีจะทำให้คำสัญญานั้นมีเงื่อนไขว่าต้องมีใบแจ้งหนี้ก่อน
ข้อสอง ตัวเลขไม่คุ้มให้ทำ ที่ราคา $0.30 ต่อ request 1 ล้านครั้ง เว็บฟรีที่วิ่งเกินโควตาแบบนั้นไป 10 เท่า มีต้นทุนกับเรา $0.30 การส่ง 402 ให้เว็บที่ไม่ได้ทำอะไรผิด เพื่อประหยัดเงิน 30 เซนต์ เป็นการแลกที่ผิด และคนที่เห็นหน้านั้นไม่ใช่เจ้าของเว็บ แต่เป็นใครก็ตามที่บังเอิญแวะเข้ามา
แพ็กเกจทั้งสองจึงถูกจำกัดด้วยสิ่งที่มีต้นทุนจริงเท่านั้น คือโปรเจกต์ฐานข้อมูลหนึ่งโปรเจกต์ กับ hostname หนึ่งชื่อที่ edge และไม่มีอย่างอื่นอีก
| แพ็กเกจ | เว็บ | ฐานข้อมูลและโดเมนของตัวเอง | นับ request |
|---|---|---|---|
| ฟรี | 2 | ไม่ | ไม่ |
| $12 ต่อเดือน | 10 | ได้ | ไม่ |
ข้อโต้แย้งนี้เราไม่ได้คิดขึ้นมาเอง
วันที่ 8 กันยายน 2026 Vercel ประกาศราคา CDN แบบเหมาจ่าย และอธิบายปัญหานี้ด้วยคำของตัวเอง ว่าการเปิดตัวที่ดังขึ้นมา ทราฟฟิกที่พุ่งเป็นช่วง หรือ route ที่ตั้งค่าผิด บางครั้งเปลี่ยนเดือนที่ปกติดีให้กลายเป็นบิลที่ไม่มีใครคาดไว้:
viral launches, traffic bursts, or misconfigured routes sometimes turned an otherwise normal month into an unexpected bill.
ภายใต้ข้อตกลงใหม่นั้น request และปริมาณข้อมูลที่ส่งผ่าน CDN "no longer billed directly, so spikes don't result in surprise bills." คือไม่ถูกคิดเงินโดยตรงอีกต่อไป ทราฟฟิกที่พุ่งขึ้นจึงไม่กลายเป็นบิลที่น่าตกใจ ส่วน Cloudflare ซึ่งเป็นแพลตฟอร์มที่เราวิ่งอยู่บนนั้น ประกาศไว้เองว่า "There are no additional charges for data transfer (egress) or throughput (bandwidth)." คือไม่มีค่าใช้จ่ายเพิ่มสำหรับข้อมูลขาออกหรือแบนด์วิดท์
ข้อโต้แย้งนี้จึงไม่ใช่ของเรา และเราไม่ควรทำเป็นว่ามันเป็นของเรา มันเป็นเรื่องที่คนขายโครงสร้างพื้นฐานที่อยู่ใต้เราเอง ยอมรับไว้เป็นลายลักษณ์อักษรแล้ว
สิ่งที่เราพูดแคบกว่านั้น และควรพูดให้ตรง เจ้าที่ใหญ่ที่สุดในหมวดนี้หันมาใช้ราคาเหมาจ่ายกับทรัพยากรตัวหนึ่ง หลังจากที่เคยเอามิเตอร์ไปจับมันมาก่อน เราเลือกที่จะไม่ติดมิเตอร์ตั้งแต่แรก นั่นคือความต่างเรื่องลำดับเวลา ไม่ใช่การอ้างว่าเราดีกว่า และเหตุผลที่มันควรถูกเขียนไว้ก็คือ มิเตอร์ที่ถอดออกกับมิเตอร์ที่ไม่เคยติด ให้ความรู้สึกเหมือนกันในเดือนที่เงียบ และต่างกันในเดือนที่เสียงดัง
เราเดาว่าการเสิร์ฟไฟล์ static ไม่มีต้นทุน แล้วเราก็ไปตรวจ
ข้อสมมติที่รองรับทั้งหมดนี้คือเว็บที่เป็นไฟล์ล้วนเสิร์ฟฟรี เพราะ Cloudflare ประกาศว่า request ที่วิ่งไปหา static asset นั้นฟรีและไม่จำกัด เราพิงประโยคนั้นมาโดยไม่เคยทดสอบว่ามันอธิบายกรณีของเราจริงไหม วันที่ 1 กันยายน 2026 เราทดสอบมัน
เรา deploy เว็บที่มีแต่ไฟล์ขึ้นไปหนึ่งเว็บ แล้วยิง request ใส่มัน 60 ครั้ง ไปที่ / 30 ครั้ง และไปที่ไฟล์อีกตัวหนึ่ง 30 ครั้ง แต่ละครั้งพ่วง query string ที่ไม่ซ้ำกัน และ cache-control: no-cache เพื่อไม่ให้ edge ตอบจากแคชได้ จากนั้นเราอ่านข้อมูลวิเคราะห์ GraphQL ของ Cloudflare ในช่วงวินาทีก่อนและหลังการยิงชุดนั้น
dispatch Worker ของเราเองบันทึกไว้ 60 request ส่วน script ของตัวเว็บลูกค้าเองไม่บันทึกอะไรเลย เข้าไป 60 request ออกมาเป็นการเรียก dispatch 60 ครั้ง ตรงกันพอดี
การที่ไม่มีอะไรเลยนั้นต้องมีตัวเทียบ เพราะชุดข้อมูลที่รายงานว่าไม่มีอะไร หน้าตาเหมือนกันกับ script ที่ไม่เคยทำงาน การอ่านชุดข้อมูลเดียวกันนี้ครั้งก่อนหน้า เคยแสดง script อีกตัวในอีก namespace พร้อมจำนวน 3 request ชุดข้อมูลนี้รายงาน script ชนิดนั้นจริง ตัวนี้จึงไม่เคยทำงานจริง ๆ
ประโยคที่ Cloudflare ประกาศไว้ อธิบายถึง Worker ที่ผู้เข้าชมวิ่งไปถึงโดยตรง และบนแพลตฟอร์มนี้ไม่มีผู้เข้าชมคนไหนวิ่งไปถึง Worker ตัวไหนโดยตรงเลย request ที่ขอ asset ทุกครั้งวิ่งผ่าน dispatch Worker ของเรา เพราะ dispatch Worker เป็นเจ้าของ route ข้อสมมตินั้นผิด และมันผิดไปในทางที่ทำให้เราเสียเงิน
สิ่งที่เราวัดได้ กับสิ่งที่เรายังอนุมานอยู่
สิ่งที่วัดได้คือ dispatch Worker ทำงาน 60 ครั้ง ส่วนที่ว่า 60 ครั้งนั้น ถูกคิดเงิน ตั้งอยู่บนประโยคที่ Cloudflare ประกาศไว้ ไม่ได้ตั้งอยู่บนตัวเลขที่อ่านมาจากใบแจ้งหนี้ ยังไม่มีใครเอายอดใช้งาน request ของบัญชีนี้ไปอ่านเทียบกับบิล
เราปล่อยประโยคนั้นไว้เปล่า ๆ ไม่ตกแต่งอะไรเลย เพราะมันเป็นสิ่งที่น่าเชื่อถือที่สุดในหน้านี้
การรับทราฟฟิกที่ถล่มเข้ามาไว้เอง มีต้นทุน $3 ต่อ request 10 ล้านครั้ง
แพ็กเกจของเรารวม request 20 ล้านครั้งไว้ในค่าบริการ $25 ต่อเดือน แล้วคิดเพิ่ม $0.30 ต่อ request ทุก 1 ล้านครั้งที่เกินจากนั้น นั่นเปลี่ยนคำสัญญาว่าจะรับทราฟฟิกที่ลูกค้าไม่ได้ก่อไว้เอง ให้กลายเป็นตัวเลข แทนที่จะเป็นความหวัง
| เว็บ static ฟรีที่มี | request ต่อเดือน | จำนวนเว็บที่อยู่ในโควตารวมได้ | ต้นทุนต่อเว็บเมื่อเกิน |
|---|---|---|---|
| เพจวิว 5,000 ครั้ง หน้าละ 4 ไฟล์ | 20,000 | ประมาณ 1,000 | $0.01 |
| บอตถล่ม 10,000,000 request | 10,000,000 | ประมาณ 2 | $3.00 |
แถวของบอตคือแถวที่ต้องจ้องไว้ เราให้สัญญานั้นไปตอนที่เชื่อว่าการรับไว้เองไม่มีต้นทุน จริง ๆ แล้วมันคือ $3 ต่อ request 10 ล้านครั้ง ซึ่งยังรับไหว และตอนนี้เป็นตัวเลขแล้ว ไม่ใช่ข้อสมมติ
เลขคณิตชุดนี้มีข้อจำกัดที่ต้องพูดตรง ๆ สองข้อ โควตารวมนั้นใช้ร่วมกันทั้งแพลตฟอร์ม ทั้งเว็บฟรีและเว็บที่จ่ายเงิน มันจึงเป็นตัวเลขระดับแพลตฟอร์ม ไม่ใช่ตัวเลขต่อลูกค้าหนึ่งราย และตอนนี้ยังไม่มีอะไรคอยเฝ้ามันอยู่เลย
การไม่นับ request ไม่ใช่คำสัญญาว่าอะไรก็ไม่จำกัด
ที่นี่มีขอบอยู่ แต่ขอบพวกนั้นอยู่ที่เครื่องมือ ไม่ได้อยู่ที่ทราฟฟิก คือจำนวนครั้งต่อนาทีของแต่ละอย่างที่ผู้ช่วย AI ของคุณทำได้ และตัวเลขปัจจุบันเขียนไว้ในเอกสารประกอบ ซึ่งเป็นภาษาอังกฤษ ขอบแบบนั้นให้ผลออกมาเป็นการปฏิเสธที่มีประโยคอธิบายอยู่ในนั้น ไม่ใช่บรรทัดหนึ่งบนบิล
นี่คือความต่างที่เราซื้อมา ขอบที่คุณชน คือประโยคที่คุณอ่านได้ ในวินาทีที่คุณชนมัน และมันพูดกับคนที่เป็นคนทำให้มันเกิด ส่วนมิเตอร์ที่คุณใช้เกิน คือตัวเลขที่คุณไปเจอทีหลัง และมันพูดกับคุณ ไม่ว่าคุณจะมีส่วนเกี่ยวข้องกับมันหรือไม่
กฎข้อนั้น พูดครั้งเดียว
ทราฟฟิกที่เว็บของคุณไม่ได้ก่อ เป็นของเราที่ต้องรับไว้เอง ทั้งสองแพ็กเกจไม่นับ request ทั้งสองไม่นับแบนด์วิดท์ และสิ่งที่จำกัดแต่ละแพ็กเกจคือชุดเล็ก ๆ ของสิ่งที่เราจ่ายเงินค่ามันจริง ๆ
เขียนจาก docs/adr/0012-how-the-platform-charges.md ในบันทึกของโปรเจกต์นี้