iOS 免費試用:App Store Connect 推出優惠
作者:Mehdi Azizi
發布於 ,8 分鐘
推出優惠是 iOS 訂閱開頭的免費試用或折扣價,每個 Apple 帳號在每個訂閱群組只能用一次。本文說明建立與顯示方式。
推出優惠(introductory offer)是自動續訂型訂閱的起始價格,有三種:免費試用、預先付款,或隨用隨付。每位顧客在每個訂閱群組只能享有一次,所以你的 app 在寫出「免費試用」之前,必須先確認對方的資格。你在訂閱的價格頁面建立它,而你的付費牆必須清楚顯示優惠期間,以及之後要收取的價格。
在 Solys 和 TradaZen 上,7 天免費試用是掛在年訂方案上。週訂方案沒有試用。以下是三種優惠類型、誰有資格、怎麼建立,還有我在顯示上犯過的兩個錯誤。「上市優惠」這個說法通常指的是同一件事,我那篇付費牆錯誤指南裡也是這樣用。
什麼是推出優惠(introductory offer)?
App Store Connect 說明文件把它定義為:訂閱第一個期間的限時折扣價或免費試用。它只適用於自動續訂型訂閱。優惠結束後,訂閱會以正常價格續訂,除非對方在那之前取消。
符合資格的人會在你的 App Store 頁面上看到這個優惠。購買時,只要對方有資格,Apple 會自動套用。你的工作,是不要在畫面上承諾一個 Apple 不會給的優惠。
三種推出優惠類型
StoreKit 文件描述了三種付款模式。下面每一種都附一個虛構範例:年訂 39.99 歐元、月訂 6.99 歐元,這不是我任何一個 app 的價格。
| 類型 | 虛構範例 | 一開始支付 | 之後 |
|---|---|---|---|
| 免費試用 | 免費 7 天 | 0 歐元 | 每年 39.99 歐元 |
| 預先付款 | 3 個月 9.99 歐元 | 一次付 9.99 歐元 | 每年 39.99 歐元 |
| 隨用隨付 | 每月 2.99 歐元,共 3 個月 | 每月 2.99 歐元 | 每月 6.99 歐元 |
以下是每一種在畫面上該怎麼寫,一樣用這些虛構價格:
- 免費試用:「免費 7 天,之後每年 39.99 歐元。」試用期間訂閱其實已經開始,但結束前不會扣款。
- 預先付款:「前 3 個月 9.99 歐元,之後每年 39.99 歐元。」對方為整個折扣期間只付一次。
- 隨用隨付:「每月 2.99 歐元,持續 3 個月,之後每月 6.99 歐元。」折扣價在每個期間都會收一次。
三種情況下,這句話都要包含優惠結束後會收取的價格。
誰有資格享有推出優惠?
Apple 的說明很清楚:每個訂閱可以設一個優惠,但每個人在每個訂閱群組只能享有一次推出優惠。StoreKit 文件把三種情況講得更細:
- 新訂閱者一定有資格;
- 回流的舊訂閱者,如果從沒在這個群組用過推出優惠,就有資格;
- 目前的訂閱者沒有資格,即使他在同一個群組裡換方案也一樣。
資格跟著付款的 Apple 帳號走,不是跟著 iPhone,也不是跟著你 app 裡建立的帳號。試用過、取消、再重新安裝 app 的人,就沒有資格了。可是商品還是繼續宣告它的優惠:誤導性的顯示就是這樣產生的。
直接的後果是:在週訂方案上試用,會用掉年訂方案的試用資格,因為兩者在同一個群組裡。所以我的試用只放在年訂上。
另一個限制:每個國家可以有一個進行中的推出優惠,加上一個未來的優惠。如果兩個優惠時間重疊,最後建立的那個會取代另一個。2026 年 7 月,我在 TradaZen 的年訂上同時想要折扣價和免費試用。一次只能有一個優惠:只能二選一。最後我另外建了第二個比較便宜的年訂方案,用來掛試用。
在 App Store Connect 建立優惠
你需要 Account Holder、Admin、App Manager 或 Marketing 角色。以下介面名稱取自 Apple 的說明文件:
- 在 Apps 裡打開你的 app,然後點側邊欄的 Subscriptions。
- 選擇群組,再選擇訂閱。
- 在 Subscription Prices 區塊,點 View all Subscription Pricing,再點 Set up Introductory Offer。
- 選擇國家或地區,然後設定開始和結束日期。如果從今天開始,優惠會立刻生效。
- 選擇 Free、Pay up front 或 Pay as you go,再設定期間和價格。
- App Store Connect 會為 175 個國家提供對應價格。需要的話調整一下,然後確認。
優惠建立後就不能再修改:要改期間或價格,就到 Introductory Offers 分頁刪掉再重建。修改可能要最多一小時才會反映到 sandbox。RevenueCat 文件也建議,最多等 24 小時再判斷優惠沒有被套用。
可設定的期間
免費試用可以是 3 天、1 或 2 週、1、2、3 或 6 個月,或 1 年,不論訂閱週期多長都一樣。預先付款可涵蓋 1、2、3 或 6 個月,或 1 年。隨用隨付則依訂閱週期而定:
| 訂閱週期 | 隨用隨付 |
|---|---|
| 1 週 | 1 到 12 週 |
| 1 個月 | 1 到 12 個月 |
| 2 個月 | 2 到 12 個月,以 2 為單位 |
| 3 個月 | 3、6、9 或 12 個月 |
| 6 個月 | 6 或 12 個月 |
| 1 年 | 1 年 |
在我的 app 上,我選了 7 天,放在年訂上。這不是 Apple 的規定,而是產品決策,請用你自己的數據重新評估。
只對有資格的人顯示試用
Apple 在同一頁說明裡寫得很明白:如果你在 app 裡顯示優惠,要確認對方真的能享有。讓你的程式碼回答兩個問題:這個商品有沒有免費試用?這個人還有沒有資格?
第一個問題從商品本身讀取。注意,推出優惠不一定是免費的。在 TradaZen 上,標準年訂掛的是預先付款,也就是比較便宜的第一年,而試用放在另一個年訂上。兩者回傳時都是「推出優惠」。所以我的程式碼會讀優惠的價格:零就是試用;大於零就是付費優惠。
第二個問題要問商店。在 Swift 裡,StoreKit 2 從 iOS 15 起提供 isEligibleForIntroOffer。Apple 特別說明,即使沒有設定任何優惠,這個值也可能是 true:所以才需要第一個問題。在 Expo app 裡用 RevenueCat 的話,對應的是 checkTrialOrIntroductoryPriceEligibility,會回傳有資格、沒資格、沒有優惠,或未知。以下是 TypeScript 的基本做法:
import Purchases, {
INTRO_ELIGIBILITY_STATUS as S,
type PurchasesStoreProduct,
} from "react-native-purchases";
type Essai = "oui" | "non" | "doute";
export async function essaiGratuit(p: PurchasesStoreProduct): Promise<Essai> {
if (!p.introPrice || p.introPrice.price > 0) return "non";
try {
const r = await Purchases.checkTrialOrIntroductoryPriceEligibility([
p.identifier,
]);
const statut = r[p.identifier]?.status;
if (statut === S.INTRO_ELIGIBILITY_STATUS_ELIGIBLE) return "oui";
if (statut === S.INTRO_ELIGIBILITY_STATUS_INELIGIBLE) return "non";
if (statut === S.INTRO_ELIGIBILITY_STATUS_NO_INTRO_OFFER_EXISTS)
return "non";
return "doute";
} catch {
return "doute";
}
}
「doute」(不確定)這種情況才是真正的重點。RevenueCat 把它的檢查描述為盡力而為的估計,而 Apple 的付款表單無論如何都會在確認前顯示真正的條件。對於未知狀態,RevenueCat 建議顯示正常價格,以免誤導任何人。
我在 TradaZen 上學到了問題的另一面。第一版把讀取錯誤當成拒絕:有資格試用的人看不到試用。現在,我的 app 只有在商店明確拒絕時,也就是沒資格或沒有優惠,才會拿掉試用。不確定時,保留商品原本的顯示。這是取捨,不是 RevenueCat 的建議:如果你偏好保守,就照他們的做。不管哪種做法,都絕對不要把「我不知道」當成「不行」。
如果你用 RevenueCat 的付費牆,根據他們的優惠說明頁,每段文字都可以為有優惠資格的人準備另一個版本。其他設定請看我的指南:用 RevenueCat 做 iOS 訂閱。
3.1.2 要求畫面上寫什麼
Guideline 3.1.2(a) 允許訂閱提供免費試用,前提是要提供 App Store Connect 規定的資訊。Apple 的訂閱說明頁寫得更具體:在試用的購買流程中,要清楚標示試用期間,以及結束時會收取的價格。實際收取的金額也必須是畫面上最顯眼的價格元素。
Solys 在 2026 年 10 月 10 日收到的退件就是這麼說的:免費試用、上市價格和換算後的價格,都必須從屬於實際收取的金額。可以宣傳試用,但之後收取的價格必須是畫面上最清楚易讀的價格。這兩次退件和修正方式都在我的 guideline 3.1.2 指南裡。
相反的錯誤也存在:提供了試用卻沒說。有一陣子,我付費牆上的按鈕只寫「繼續」。在 Solys 上,「免費 7 天」甚至只存在於 VoiceOver 標籤裡,畫面上根本看不到。
在 sandbox 測試優惠
用 sandbox 帳號購買訂閱:試用應該出現在 Apple 的付款表單上。要重跑新訂閱者的流程,在 iPhone 上的 sandbox 帳號設定裡選 Clear Purchase History。根據 Apple 的 sandbox 文件,這樣帳號就會重新具備推出優惠資格。
也要測試已經試用過的帳號:你的付費牆不應該再宣傳任何免費內容。如果商品完全載入不出來,請看我關於 Missing Metadata 狀態的指南。
正確串接你的免費試用
iOS & Android Kit 以我 app 的起始程式碼為基礎:onboarding、付費牆和訂閱都已經寫好,第三步「串接金流」會帶你設定商品和試用。整條流程都寫在 iOS app 內訂閱頁面上。如果你還在猶豫商業模式,先看訂閱還是一次性購買。
如果你正在準備第一次上架,做一下免費診斷:它會幫你把步驟排好順序,並寄給你我的 Apple 防退件檢查清單。想送人一個月或挽回舊訂閱者,接下來請看我的優惠代碼指南。
常見問題
App Store 的推出優惠(introductory offer)是什麼?
它是自動續訂型訂閱的起始價格:免費試用、預先付款或隨用隨付。它在 App Store Connect 建立,購買時 Apple 會自動套用給有資格的人。之後,訂閱會改為正常價格。
使用者可以免費試用兩次嗎?
在同一個訂閱群組裡不行:每個 Apple 帳號在每個群組只能享有一次推出優惠。重新安裝 app 也不會恢復資格。不過,如果他訂閱了你 app 裡另一個群組,就可以享有那個群組的優惠。
免費試用和折扣可以同時使用嗎?
同一個訂閱在同一時間不行:每個國家只能有一個進行中的推出優惠。你可以另外建立第二個訂閱來掛另一個優惠,或使用優惠代碼,依你的設定,優惠代碼可以接在推出優惠之後。
加入試用需要發布新版 app 嗎?
優惠本身不需要:它在 App Store Connect 設定,並在購買時套用。但如果你的付費牆在程式碼裡寫死「7 天」,就得更新。從商店回傳的商品讀取期間,畫面就會跟著變。
舊訂閱者可以享有免費試用嗎?
可以,只要他從沒在這個訂閱群組用過推出優惠。如果已經用過,就沒有資格了,即使過了好幾個月也一樣。想讓他回來,Apple 提供了挽回優惠和促銷優惠。

