所有文章
實戰指南閱讀時間 8 分鐘

訂閱取消原因通常比退款要求更早抵達,而 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,它描述的是訂閱如何結束,而不是客戶的想法。

expirationIntentApple 的定義對應的 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 PlayApple App Store
是否詢問使用者原因是,有取消問卷沒有開發者可見的問卷
原因存放位置purchases.subscriptionsv2 中的 canceledStateContext續訂資訊中的 expirationIntent
自由填寫文字reasonUserInput,僅限「其他」無
由誰取消使用者、系統、開發者或替換操作從代碼和子類型推斷
通知SUBSCRIPTION_CANCELED,接著呼叫 getDID_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 決定存取權何時結束。

資料來源與延伸閱讀

RefundHalt

App Store 與 Google Play 的退款自動駕駛

繼續閱讀

下一筆退款申請已經在路上。

讀完另一封關於未能抗辯退款的客服郵件所需的時間,就足夠您設定好 RefundHalt。