訂閱取消原因通常比退款要求更早抵達,而 Google Play 提供的資訊遠多於 Apple
Google Play 會透過取消問卷記錄訂閱取消原因,Apple 只傳送一個到期代碼。本文說明兩家商店各自告訴你什麼,哪些訊號預示即將到來的退款或退單,以及每一種情況會讓你付出多少成本。

重點摘要
- Google Play 會在訂閱者取消時詢問離開原因,答案透過 purchases.subscriptionsv2 中的 canceledStateContext.userInitiatedCancellation.cancelSurveyResult 傳給開發者。
- Google Play 的取消問卷有五個開發者可讀取的答案:使用次數不多、技術問題、費用相關、找到更好的應用程式,以及其他。只有使用者選擇「其他」時,reasonUserInput 才會有自由填寫的文字。
- Google Play 的 SUBSCRIPTION_CANCELED 通知只帶有購買權杖。取消原因必須透過 purchases.subscriptionsv2.get 取得,而且如果使用者恢復訂閱,Google 會清除所有取消相關欄位。
- Apple 的 App Store Server API 沒有取消問卷。它的 expirationIntent 欄位會提供五個代碼之一:客戶取消、帳單錯誤、未同意漲價或優惠轉換、產品無法提供,或其他。
- Apple 的 DID_CHANGE_RENEWAL_STATUS 通知若帶有 AUTO_RENEW_DISABLED 子類型,可能代表客戶申請退款後 App Store 關閉了自動續訂,而不只是客戶自己關掉。
- 取消原因從來不會讓開發者對退款有發言權。只有 Apple 的 CONSUMPTION_REQUEST(須在 12 小時內回覆)和 Google Play 透過 orders.reviewrefund 進行的退單審查(須在 24 小時內回覆)會要求你提供證據。
- 因技術問題而取消的 Google Play 訂閱者最可能想要退款。對於 2026 年 8 月 3 日之後成立的訂單,若對方退單成功,開發者會損失購買金額扣除 Play 服務費後的部分,再加上銀行收取的費用。
大多數最後拿到退款的訂閱者都會先取消訂閱。取消會附帶一個原因,而兩家商店給你的資訊量差異很大。Google Play 會進行簡短的問卷,並把答案(包含自由填寫的文字)傳到你的伺服器。Apple 只傳送一個數字代碼,說明訂閱是怎麼結束的,而不是客戶為什麼想離開。把兩者都讀懂,你就能在還來得及採取行動時,提早看見退款要求。
Google Play 告訴你哪些訂閱取消原因
使用者在 Play 訂閱中心取消時,Google 會詢問原因。答案會出現在你透過 purchases.subscriptionsv2.get 取得的訂閱資源中,位於 canceledStateContext 之下。這個物件只在訂閱處於已取消或已過期狀態時存在,並會說明是誰結束了訂閱:使用者、Google 的系統、你,或是替換操作(例如變更方案)。
如果是使用者取消的,userInitiatedCancellation 物件會包含兩個欄位。cancelTime 表示取消時間,cancelSurveyResult 則保存問卷答案。
| 問卷原因 | Google 的說明 | 通常代表什麼 |
|---|---|---|
| CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | 訂閱的使用次數不多 | 使用量低,帳戶上投入的成本很少 |
| CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | 使用應用程式時遇到技術問題 | 最強烈的退款與退單訊號 |
| CANCEL_SURVEY_REASON_COST_RELATED | 費用相關問題 | 對價格敏感,有時是出乎意料的續訂 |
| CANCEL_SURVEY_REASON_FOUND_BETTER_APP | 使用者找到更好的應用程式 | 競爭對手勝出,很少引發爭議 |
| CANCEL_SURVEY_REASON_OTHERS | 其他原因 | 查看 reasonUserInput,也就是使用者自己的說法 |
| CANCEL_SURVEY_REASON_UNSPECIFIED | 未指定的取消問卷原因 | 沒有可用的答案 |
最右邊一欄是我們的解讀,不是 Google 的說法。前兩欄直接取自 API 參考文件。
通知本身不包含原因
訂閱被取消時會觸發 SUBSCRIPTION_CANCELED 即時開發者通知,類型為 type 3。Google 明確表示,這類通知只會告訴你購買狀態有所變更。酬載中只有一個購買權杖,沒有其他有用資訊,所以你的處理程式必須呼叫 purchases.subscriptionsv2.get 才能讀取問卷答案。
Play Console 中的檢視畫面
查看總計數據不需要寫程式。Play Console 的訂閱報表中有一張「取消」資訊卡,把流失分為自願、非自願和其他三類,另有一張「取消問卷回覆」資訊卡,呈現選擇作答的使用者。選擇「其他」的使用者所填寫的文字,可以從「其他回覆」資訊卡下載成 CSV。下載需要 View financial data 權限,也就是你授予讀取訂單的工具的同一項權限。
Apple 告訴你什麼,又省略了什麼
Apple 沒有任何會回報給開發者的取消問卷。最接近的欄位是已簽署續訂資訊中的 expirationIntent,它描述的是訂閱如何結束,而不是客戶的想法。
| expirationIntent | Apple 的定義 | 對應的 EXPIRED 子類型 |
|---|---|---|
| 1 | 客戶取消了訂閱 | VOLUNTARY |
| 2 | 帳單錯誤,例如付款資訊無效 | BILLING_RETRY |
| 3 | 未同意需要確認的漲價或優惠轉換 | PRICE_INCREASE |
| 4 | 續訂時該產品無法購買 | PRODUCT_NOT_FOR_SALE |
| 5 | 其他原因 | 無子類型 |
代碼 1 是唯一描述客戶主動選擇的代碼,但完全沒有說明動機。因為應用程式一直當機而離開的客戶,和只是剛好完成一個專案的客戶,看起來完全相同。
藏在 AUTO_RENEW_DISABLED 裡的訊號
有一則 Apple 通知值得仔細看。帶有 AUTO_RENEW_DISABLED 子類型的 DID_CHANGE_RENEWAL_STATUS 通常表示客戶關閉了自動續訂。Apple 的說明文件還補充了第二種情況:客戶申請退款後,App Store 也會關閉自動續訂。
因此在 iOS 上,關閉續訂的事件可能是退款要求的第一個跡象。如果購買的是消耗性項目或自動續訂型訂閱,接著可能會收到 CONSUMPTION_REQUEST,從那一刻起你有 12 小時可以傳送使用量資料。如果關閉續訂事件抵達時,你的應用程式中看不到任何對應操作,就值得把它當成提醒,先備妥該帳戶的使用資料。
Apple 與 Google 並列比較
| Google Play | Apple App Store | |
|---|---|---|
| 是否詢問使用者原因 | 是,有取消問卷 | 沒有開發者可見的問卷 |
| 原因存放位置 | purchases.subscriptionsv2 中的 canceledStateContext | 續訂資訊中的 expirationIntent |
| 自由填寫文字 | reasonUserInput,僅限「其他」 | 無 |
| 由誰取消 | 使用者、系統、開發者或替換操作 | 從代碼和子類型推斷 |
| 通知 | SUBSCRIPTION_CANCELED,接著呼叫 get | DID_CHANGE_RENEWAL_STATUS、EXPIRED |
| 使用者重新訂閱後是否遺失 | 是,恢復時會被清除 | 續訂資訊反映目前狀態 |
| 主控台 | 「取消問卷回覆」資訊卡 | 沒有原因相關畫面 |

取消在什麼時候變成退款
取消會停止下一次扣款,但不會退還上一次的款項。錢能否退回,取決於客戶接下來進入哪一個退款流程,而這些流程大多不需要你參與。
- 在 Google Play 上,買家可在購買後 48 小時內自行取得退款,由 Google 決定。
- 透過 Google 或 Apple 客服申請的退款,由商店決定。
- Apple 的 CONSUMPTION_REQUEST 會向你索取使用量資料,回覆期限為 12 小時。
- Google Play 的退單審查會透過 orders.reviewrefund 向你索取證據,回覆期限為 24 小時。銀行對退單的裁決為最終結果。
取消原因不會改變上述任何規則。它改變的是你能多早知道哪位客戶不滿意,以及當兩個需要證據的流程之一到來時,你的證據是否已經準備好。
每一種原因會讓你付出多少
問卷答案也能大致反映一個帳戶已經花掉多少服務成本,而這正是退款後由你承擔的那筆錢。
技術問題
這是代價最高的一種。客戶用得夠多才會遇到問題,所以你已經為他們的工作階段支付運算資源、為他們的請求支付模型 API 呼叫、為他們建立的內容支付儲存空間,可能還要向他們使用過其內容的創作者支付分潤。如果他們接著取得退款,款項會退回,而這些成本仍由你承擔。如果他們在 Google Play 上找銀行退單,2026 年 8 月 3 日之後成立的訂單會讓你損失購買金額扣除 Play 服務費後的部分,再加上銀行收取的費用。
費用相關
價格抱怨的實際成本比看起來低,除非背後藏著一次出乎意料的續訂。那正是典型的退單情節,所以要檢查取消是否緊接在一次續訂扣款之後,以及你的續訂提醒是否已經寄出。
使用次數不多
使用量低代表服務成本低,所以這類退款退回的大多是你沒花多少成本就賺到的錢。如果 Apple 要求提供使用量資料,誠實的資料也能清楚呈現客戶用了什麼、沒用什麼。
找到更好的應用程式
這些客戶很少提出爭議,他們只是轉向競爭對手。這個原因對產品決策有幫助,但幾乎無助於退款防禦。
讀取取消原因的例行流程
- 每次收到 Google Play 的 SUBSCRIPTION_CANCELED,都呼叫 purchases.subscriptionsv2.get,並將 canceledStateContext 連同購買權杖和 cancelTime 一併儲存。
- 原因為「其他」時,原封不動地儲存 reasonUserInput。這是兩家商店中唯一會提供給你的自由填寫文字。
- 每次收到 Apple 帶有 AUTO_RENEW_DISABLED 的 DID_CHANGE_RENEWAL_STATUS,都記錄該事件並調出該帳戶的使用資料,以防接著收到 CONSUMPTION_REQUEST。
- 每次收到 Apple 的 EXPIRED 通知,都記錄子類型和 expirationIntent,避免把自願流失和帳單失敗混為一談。
- 對於以技術問題為由取消的 Google Play 訂閱,檢查該帳戶的錯誤記錄,並在客戶找上銀行之前主動聯繫。
- 保留每個帳戶的使用記錄,讓 CONSUMPTION_REQUEST 能在 12 小時內得到回覆,退單審查能在 24 小時內得到回覆。
常見問題解答
- 如何查看 Google Play 訂閱者取消的原因?
- 呼叫 purchases.subscriptionsv2.get,讀取 canceledStateContext.userInitiatedCancellation.cancelSurveyResult。其中的原因欄位保存問卷答案,使用者選擇「其他」時,reasonUserInput 保存自由填寫的文字。Play Console 也會在「取消問卷回覆」資訊卡中顯示總計數據。
- Apple 會告訴開發者客戶為什麼取消訂閱嗎?
- 不會。Apple 沒有開發者可見的取消問卷。expirationIntent 欄位說明訂閱如何結束,代碼分別對應客戶取消、帳單錯誤、未同意漲價、產品無法提供或其他,但不包含客戶的動機。
- SUBSCRIPTION_CANCELED 通知包含取消原因嗎?
- 不包含。Google Play 的即時開發者通知只會告訴你購買狀態有所變更。你需要用 purchases.subscriptionsv2.get 取得訂閱才能讀取原因,並立刻儲存,因為如果使用者恢復訂閱,Google 會清除取消相關欄位。
- Apple 的 AUTO_RENEW_DISABLED 通知可能代表退款要求嗎?
- 可能。Apple 的說明文件指出,AUTO_RENEW_DISABLED 子類型同時涵蓋客戶自行關閉自動續訂,以及客戶申請退款後 App Store 關閉自動續訂這兩種情況。
- 訂閱者取消後,我可以移除他的存取權嗎?
- 在 Google Play 上,只要使用者仍有權使用就不行。Google 表示,已取消的訂閱者在當期帳單週期結束前保有存取權,提早移除存取權違反 Google Play 的訂閱政策。請依據 expiryTime 決定存取權何時結束。
資料來源與延伸閱讀
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
App Store 與 Google Play 的退款自動駕駛
繼續閱讀
過多的退款申請,代價可能遠超退款本身,因為兩大 App 商店都把它視為品質訊號
Apple 審查準則 5.6.4 把過多的退款申請列為 App 未達品質標準的跡象,Google 的開發人員發布協議也允許它依退款率下架新開發人員的 App。本文整理兩家商店的原文、下架的實際成本,以及如何避開風險。
在處理退款之前先驗證 App Store 伺服器通知,因為任何人都能向你的 webhook URL 發送請求
在檢查簽章之前,一則退款通知只不過是一個 HTTPS 請求。本文說明如何驗證 App Store 伺服器通知和 Google Play RTDN 訊息、各商店簽署的內容,以及偽造的退款或遭錯誤拒絕的退款會讓你付出什麼代價。