教育品牌詢問「預約系統費用」時,最容易得到的答案是依頁數、會員功能或是否串金流估一個總價。但課程報名真正花工的地方,往往不是報名表有幾個欄位,而是同一個名額在付款、取消、候補、補課與人工調整之間如何維持一致。若這些規則沒有先寫清楚,便宜的第一版也可能在營運後不斷追加。

比較報價前,建議先把一堂課當成一筆有生命週期的資料:尚未開放、開放報名、暫時保留、已付款、額滿、候補、取消、改期及結束。每個狀態由誰觸發、保留多久、是否占名額、能否回復,都要成為規格與測試案例。這比單問「有沒有課程報名功能」更能反映實際開發範圍。

第一個成本來源:名額不是一個數字,而是一套鎖定規則

先回答「何時才算占到名額」。使用者送出表單就保留,還是付款成功才成立?若付款尚未完成,系統要保留位置或立即釋出?兩位學員同時搶最後一席時,資料庫如何避免超收?客服從後台加人、換班或取消時,又是否沿用相同檢查?

以「森嶼環境學苑」(案例 id:forestisle-environment)為例,六門課程各有梯次與名額狀態,學員報名後還能在「我的報名」自行查詢。這個案例具體呈現了三個必要邊界:課程與梯次要分開管理、公開名額必須與後台一致、學員查到的狀態要能追溯。案例展示的是功能與資訊架構,不能據此推論其他機構會節省多少人力或提升多少招生。

驗收時至少要測:最後一席同時送出兩次、付款失敗後再次付款、客服手動取消後名額回補,以及已額滿課程是否停止一般報名。只做正常流程示範,無法證明系統能在熱門梯次中維持正確資料。

第二個成本來源:候補、轉班與補課都是例外流程

候補不能只是蒐集另一張表單。需要定義排序依據、一次通知幾人、回覆期限、逾期是否自動跳下一位,以及學員已報其他梯次時怎麼處理。轉班則要確認原班名額何時釋出、新班額滿時能否排候補、價差或資格不同時是否允許操作。補課也要區分教師停課、學員請假與機構改期,避免所有情況共用一個模糊按鈕。

若課程對外公開,獨立梯次頁也有搜尋層面的價值。Google Search Central 的 Event 結構化資料官方文件要求每個活動有獨立 URL,並正確提供名稱、開始時間與地點;若活動取消或改期,文件也提供對應的狀態表達方式。這不代表加上標記就保證出現在搜尋結果,但它提醒規格必須保留可公開、可更新的梯次資料,而不是把所有場次只放在一張圖片或同一個表格裡。

第三個成本來源:通知必須有事件、對象與失敗紀錄

「串 LINE 通知」不是一個完整需求。應列出報名成立、付款失敗、候補遞補、上課前提醒、改期及取消等事件,並為每個事件指定收件人、內容來源、發送時機及重送方式。使用者封鎖帳號、識別連結失效或第三方服務暫時異常時,後台也要看得出哪些通知沒有送達。

LINE Developers 的 Messaging API 發送訊息文件區分 reply、push、multicast、narrowcast 與 broadcast 等發送方式,且訊息計數看的是接收對象,而不是同一請求中放了幾個訊息物件。因此報價不能只寫「LINE API 串接一式」;應說明用哪種發送情境、如何取得並管理收件對象,以及官方帳號方案、訊息用量與系統開發費由誰承擔。實際方案與限制仍應在上線前依官方資料重新確認。

用四張表把預約系統費用變成可比較範圍

第一張是角色表:學員、講師、客服、財務與管理者各能看或改哪些資料。第二張是狀態表:每個狀態的進入條件、離開條件與占名額方式。第三張是例外表:取消、候補、轉班、補課、停課及退款由誰處理。第四張是通知表:每個事件的對象、管道、模板、失敗與重送規則。

要求現成平台供應商與客製團隊都依同一份表回覆:哪些是標準功能、哪些要設定、哪些需另行開發、哪些完全不支援。最後再加上資料移轉、權限、操作紀錄、教育訓練、維運與第三方服務成本,才會得到可比較的總範圍。

課程預約系統的費用,不應由「有幾堂課」單獨決定,而是由名額一致性、例外處理與通知責任共同形成。先把營運規則寫成可以重現的驗收情境,再選現成或客製方案,才能避免上線後才發現真正需要的流程不在原報價內。