IOSOR 知識庫

預付費下 DLR 失敗重試:何時再試,何時停止燒錢包

失敗、拒絕、過期不是同一個詞。預付費裡每次重試都是借記。先共用狀態詞典,再寫重試上限,避免把錢包燒在死胡同裡。

支援票寫「失敗了」,工程就按重試鍵,直到預付費錢包空了。失敗不是一種狀態。undelivered、rejected、expired 要求不同動作。預付費下每次自動重試都是一行借記,不是免費禮貌。先共用詞典,再寫迴圈,否則產品在修轉化,財務在付死號碼的第二、第三次嘗試。

IOSOR 是 white-label prepaid:儀表板、webhook 與匯出共用同一套 DLR 詞。目錄 live 才允許受控重試;in setup 走廊不是「再試一次就會通」。參見 未送達、拒收與過期狀態 與 回執、時延與故障轉移。月用量接近 USD 1,000+ 時,按狀態分桶的重試借記會進入更密的商務覆盤。

重試邏輯之前的狀態詞典

在寫重試程式之前,把終端狀態印成一張表,產品、營運、財務都能指著同一行說話。沒有詞典的重試是燒錢迴圈。低送達處置見 簡訊低送達率處置手冊。

狀態 可否自動重試 誰簽字
Delivered 否 無人
Undelivered / failed 有上限 營運
Rejected 否(先改載荷) 產品
Expired 否(先改 TTL) 產品

失敗、拒絕與過期

Failed / undelivered 表示平台已交出,終端未確認。走廊健康時,有上限的重試可能挽回一次轉化。Rejected 表示網路或策略在途中拒絕:同樣的號碼、同樣的正文再發,幾乎會再拒一次,並再借記一次。Expired 是時間問題:TTL 短於走廊延遲,或佇列在發送前堆住。把過期當失敗去打重試,只會製造更多過期行。OTP 視窗過了再送達,使用者已經走了,錢包卻還在付。

重試上限與錢包衝擊

給每則訊息設自動嘗試上限,並把使用者點擊的重發與系統 failover 分開記帳。每次嘗試在 ledger 裡都要能對上 correlation ID。沒有上限的「直到送達」在死走廊上會抽乾 prepaid。財務應能匯出:目的地、狀態、嘗試序號、借記額。接近 USD 1,000+ 時,無主的重試迴圈會變成商務問題,而不只是工單。策略說停時錢包必須停,即使產品還想再試一次。

產品與財務的所有權

產品擁有重試策略:哪些狀態允許、TTL、使用者重發冷卻。財務擁有可見性:每次嘗試是否借記、匯出能否對上 webhook。營運擁有走廊切片,避免全球平均數掩蓋一條壞路由。三方共用同一張表,才能在預付費下決定「再試」還是「停止花費」。不要讓支援口頭承諾退款,而 ledger 仍按每次嘗試扣款。

危險信號

  • 只有 sent 與 failed 兩個詞,卻寫了自動重試
  • 對 rejected 載荷原樣連打三次
  • 把 expired 當網路故障去打
  • 系統 failover 與使用者重發混在同一行借記
  • 無嘗試上限的「直到送達」
  • 目錄仍 in setup 卻承諾重試會修好
  • 財務匯出看不到嘗試序號

開始使用 IOSOR

先把詞典補齊:failed、rejected、expired。自動重試要有天花板,讓每則失敗 DLR 不再開一筆新的 prepaid 扣款。使用者重送鍵與系統嘗試分開。用兩條 live 走廊、低量證明這個天花板。

IOSOR 要點

失敗 DLR 的重試是支出天花板,不是無限迴圈。

要做:分清終態、限制次數、把使用者重送與系統嘗試分開匯出。不要:把 rejected 或 expired 當成短暫 failed 再轉。

這篇指南有幫助嗎?

相關指南