使用 asc 與 RevenueCat MCP,比對並對齊 App Store Connect 的訂閱項目與應用程式內購(IAP)至 RevenueCat 的產品(products)、權益(entitlements)、方案(offerings)及包裹(packages)。適用於跨 ASC 與 RevenueCat 設定或同步訂閱目錄時。
asc RevenueCat catalog sync
使用此 Skill 來保持 App Store Connect (ASC) 與 RevenueCat 之間的設定一致,包含建立缺失的 ASC 項目並將其映射至 RevenueCat 資源。
何時使用
- 想從現有的 ASC 目錄初始化(bootstrap)RevenueCat。
- 想建立缺失的 ASC 訂閱項目/IAP,再將其映射至 RevenueCat。
- 在發布前需要進行差異審計(drift audit)。
- 需要基於識別碼(identifier)進行確定性的產品映射。
前置條件
- 已設定
asc驗證(透過asc auth login或ASC_*環境變數)。 - 已設定並驗證 RevenueCat MCP 伺服器。
- 在 Cursor 與 VS Code 中,RevenueCat MCP 支援 OAuth 驗證,同時也支援 API key 驗證。
- 您已獲知以下資訊:
- ASC app ID (
APP_ID) - RevenueCat
project_id - 目標 RevenueCat 應用程式類型(
app_store或mac_app_store)以及用於建立流程的 bundle ID
- ASC app ID (
- 執行變更時,請使用具備寫入權限的 RevenueCat API v2 key。
安全預設機制
- 預設先以 審計模式(audit mode) 執行(唯讀)。
- 在進行任何寫入操作前,必須取得明確確認。
- 此工作流程中絕不刪除任何資源。
- 若單一項目執行失敗,繼續處理其餘項目,並於最後統一回報所有失敗項目。
標準識別碼
- 跨系統主要鍵值(Primary key):ASC 的
productId== RevenueCat 的store_identifier。 - 產品上線後,請保持
productId穩定不可變。 - 切勿使用顯示名稱(display name)作為唯一識別碼。
範疇界線
- RevenueCat MCP 用於設定 RevenueCat 資源;它不會直接建立 App Store Connect 產品。
- 在進行 RevenueCat 映射前,請使用
asc指令建立缺失的 ASC 訂閱組(subscription groups)、訂閱項目與 IAP。
執行模式
1) 審計模式(Audit mode,預設)
- 讀取 ASC 來源目錄。
- 讀取 RevenueCat 目標目錄。
- 建立包含以下動作的差異報告(diff):
- ASC 中缺失
- RevenueCat 中缺失
- 映射衝突(識別碼 / 類型 / 應用程式不符合)
- 呈現計畫並等待確認。
2) 套用模式(Apply mode,明確指定)
按以下順序執行已核可的動作:
- 確保 ASC 訂閱組 / 訂閱項目 / IAP 已存在。
- 確保 RevenueCat 應用程式 / 產品已存在。
- 確保權益(entitlements)與產品關聯設定完備。
- 確保方案(offerings)/ 包裹(packages)與包裹關聯設定完備。
- 驗證並列印最終的比對對齊摘要。
循序工作流程
步驟 A - 讀取當前 ASC 目錄
asc subscriptions groups list --app "APP_ID" --paginate --output json
asc iap list --app "APP_ID" --paginate --output json
# 針對每個訂閱組:
asc subscriptions list --group-id "GROUP_ID" --paginate --output json
步驟 B - 讀取當前 RevenueCat 目錄 (MCP)
使用以下 MCP 工具(在適用處帶入 project_id 與分頁參數):
mcp_RC_get_projectmcp_RC_list_appsmcp_RC_list_productsmcp_RC_list_entitlementsmcp_RC_list_offeringsmcp_RC_list_packages
步驟 C - 建立映射計畫
將 ASC 產品類型映射至 RevenueCat 產品類型:
- ASC 訂閱 (subscription) -> RevenueCat
subscription - ASC IAP
CONSUMABLE-> RevenueCatconsumable - ASC IAP
NON_CONSUMABLE-> RevenueCatnon_consumable - ASC IAP
NON_RENEWING_SUBSCRIPTION-> RevenueCatnon_renewing_subscription
建議的權益(entitlement)策略:
- 訂閱項目:每個訂閱組使用一個權益(或由使用者提供明確映射)
- 非消耗型 IAP:每個產品使用一個權益
- 消耗型 IAP:預設不設定權益,除非使用者主動要求
步驟 D - 確保補齊缺失的 ASC 項目(若有要求)
在執行寫入前,請先解析每個父階層與版本。比對組別時請使用精確的 referenceName,比對產品時請使用 productId;絕不可將顯示名稱視為唯一身份。當資源已存在時,請重用其標準 ID;僅在完整分頁讀取後確認缺失時,才執行建立指令。能完成 RevenueCat 產品映射,並不代表對應的 ASC 訂閱項目已具備送審資格(review-ready)。
# 透過精確匹配 referenceName 來解析 GROUP_ID。
asc subscriptions groups list --app "APP_ID" --paginate --output json
# 當且僅當完整分頁列表中完全無匹配項時:
asc subscriptions groups create --app "APP_ID" --reference-name "Premium" --output json
# 若找到一個匹配項,重用其 ID。若找到多個匹配項,請停止執行並要求明確指定 GROUP_ID。
# 透過 GROUP_ID 內精確匹配 productId 來解析 SUB_ID。僅在父階層缺失、或明確核可要對同一 productId 進行比對對齊時才執行 setup。
asc subscriptions list --group-id "GROUP_ID" --paginate --output json
# 當且僅當完整分頁列表中完全無匹配項時,執行 setup:
asc subscriptions setup \
--app "APP_ID" \
--group-id "GROUP_ID" \
--reference-name "Monthly" \
--product-id "com.example.premium.monthly" \
--subscription-period ONE_MONTH \
--review-screenshot "./review.png" \
--price "3.99" \
--price-territory "USA" \
--territories "USA" \
--no-verify \
--output json
# 若找到一個匹配項,重用其 ID。若找到多個匹配項,請停止執行並要求明確指定 SUB_ID。
# 僅在明確核可比對對齊時,才對已存在的 SUB_ID 重新執行 setup。
# 解析此審查生命週期中唯一的可變訂閱組版本。
asc subscriptions groups versions list --group-id "GROUP_ID" --state PREPARE_FOR_SUBMISSION --paginate --output json
# 當且僅當列表無任何匹配時:
asc subscriptions groups versions create --group-id "GROUP_ID" --output json
# 若找到一個匹配項,重用 .data[0].id。若找到多個匹配項,請停止執行並要求明確指定 GROUP_VERSION_ID。
# 解析 GROUP_VERSION_ID 上的 en-US 本地化設定。僅在缺失時建立;若已存在但數值不同則更新已解析的本地化 ID。
asc subscriptions groups versions localizations list --version-id "GROUP_VERSION_ID" --paginate --output json
asc subscriptions groups versions localizations create --version-id "GROUP_VERSION_ID" --locale "en-US" --name "Premium" --output json
asc subscriptions groups versions localizations update --id "GROUP_LOC_ID" --name "Premium"
# 解析此審查生命週期中唯一的可變訂閱項目版本。
asc subscriptions versions list --subscription-id "SUB_ID" --state PREPARE_FOR_SUBMISSION --paginate --output json
# 當且僅當列表無任何匹配時:
asc subscriptions versions create --subscription-id "SUB_ID" --output json
# 若找到一個匹配項,重用 .data[0].id。若找到多個匹配項,請停止執行並要求明確指定 SUBSCRIPTION_VERSION_ID。
asc subscriptions versions localizations list --version-id "SUBSCRIPTION_VERSION_ID" --paginate --output json
asc subscriptions versions localizations create --version-id "SUBSCRIPTION_VERSION_ID" --locale "en-US" --name "Premium Monthly" --description "Unlock all premium features." --output json
asc subscriptions versions localizations update --id "SUBSCRIPTION_LOC_ID" --name "Premium Monthly" --description "Unlock all premium features."
# 回讀上述選定的精確版本,隨後執行最終的嚴格驗證器。
asc subscriptions groups versions localizations list --version-id "GROUP_VERSION_ID" --paginate --output table
asc subscriptions versions localizations list --version-id "SUBSCRIPTION_VERSION_ID" --paginate --output table
asc validate subscriptions --app "APP_ID" --strict --output table
# 透過精確匹配 productId 來解析 IAP_ID。
asc iap list --app "APP_ID" --paginate --output json
# 當且僅當完整分頁列表中完全無匹配項時:
asc iap create \
--app "APP_ID" \
--type NON_CONSUMABLE \
--ref-name "Lifetime" \
--product-id "com.example.lifetime" \
--output json
# 若找到一個匹配項,重用其 ID。若找到多個匹配項,請停止執行並要求明確指定 IAP_ID。
# 解析此審查生命週期中唯一的可變 IAP 版本。
asc iap versions list --iap-id "IAP_ID" --state PREPARE_FOR_SUBMISSION --paginate --output json
# 當且僅當列表無任何匹配時:
asc iap versions create --iap-id "IAP_ID" --output json
# 若找到一個匹配項,重用 .data[0].id。若找到多個匹配項,請停止執行並要求明確指定 IAP_VERSION_ID。
asc iap versions localizations list --version-id "IAP_VERSION_ID" --paginate --output json
asc iap versions localizations create --version-id "IAP_VERSION_ID" --locale "en-US" --name "Lifetime" --description "Unlock all premium features." --output json
asc iap versions localizations update --localization-id "IAP_LOC_ID" --name "Lifetime" --description "Unlock all premium features."
asc iap versions localizations list --version-id "IAP_VERSION_ID" --paginate --output table
上述每組相鄰的建立/更新配對皆為條件觸發,而非盲目按順序執行的動作:當列表中無匹配時進行建立、當解析出匹配但數值不符合時進行更新、若已完全匹配則不執行任何動作。請從建立回應的 .data.id 或前述列表回應的 .data[].id 擷取作為後續指令使用的標準 ID。針對每個版本列表,若 PREPARE_FOR_SUBMISSION 匹配數為 0 代表需要建立;為 1 代表重用該 ID;大於 1 則必須停止並要求使用者明確選擇版本 ID。切勿為了消除歧義而逕自建立新版本:實測顯示,刪除父項目並無法可靠地級聯(cascade)刪除其下屬的 IAP 或訂閱版本。
subscriptions setup 負責完成父項目、App Review 截圖傳送、完整的 App Store 定價矩陣及銷售可用性設定。版本範疇指令則負責完成 RevenueCat 無法處理的訂閱組與訂閱項目本地化設定。請確保銷售可用性僅限於要求的地區;定價部分仍需符合 Apple 完整的等值地區矩陣。在此拆分工作流程中,使用 --no-verify 是有意的設計,因為最終驗證必須等到版本元資料(metadata)建立完備後才能進行;顯式回讀與驗證器即為最終的把關關卡。
若現有透過 API 建立的訂閱項目即使選定的基準價格未變,狀態仍維持 MISSING_METADATA,請帶入相同 setup 輸入參數並附加 --repair 重新執行。Repair 會以原子化(atomically)方式重建並重新儲存完整的等值價格矩陣,而非發送重複的單一價格 POST。
針對每個解析出的 ASC 訂閱項目,在建立或關聯其 RevenueCat 產品前,皆必須通過此最終關卡。即使該訂閱項目及其選定版本在完全未寫入 ASC 的情況下被重用,在完成最終 ASC 比對對齊後仍必須執行此檢查:
mkdir -p "./audit"
asc validate subscriptions --app "APP_ID" --strict --output json --pretty \
> "./audit/subscriptions-validation.json"
針對每個解析出的 ASC IAP,在建立或關聯其 RevenueCat 產品前,皆必須通過此 IAP 關卡。即使該 IAP 及其選定版本在完全未寫入 ASC 的情況下被重用,在完成最終 ASC 比對對齊後仍必須執行此檢查:
mkdir -p "./audit"
asc validate iap --app "APP_ID" --strict --output json --pretty \
> "./audit/iap-validation.json"
這兩條指令為嚴格的映射把關關卡(mapping gates),而非寫入後的冒煙測試(smoke tests)。當驗證報告出現警告、錯誤、MISSING_METADATA、審查截圖狀態非 COMPLETE、或定價覆蓋範圍不完整/未經驗證時,切勿映射任何解析出或重用的訂閱項目。當 IAP 驗證器回報警告或錯誤時,亦切勿映射任何解析出或重用的 IAP。無寫入動作的審核或套用執行,仍必須執行相應的關卡,並確保在建立或關聯 RevenueCat 產品前取得零錯誤回傳狀態碼(zero exit status)。直接重導向可保留每個驗證器的回傳狀態碼。請妥善保留 ./audit/subscriptions-validation.json 與 ./audit/iap-validation.json 作為最終審計依據。
步驟 E - 確保 RevenueCat 應用程式與產品完備
使用 MCP:
- 若缺失則建立應用程式:
mcp_RC_create_app - 建立產品:
mcp_RC_create_productstore_identifier= ASCproductIdapp_id= RevenueCat app IDtype來自上述映射關係
步驟 F - 確保權益與關聯設定完備
使用 MCP:
- 列出/建立權益:
mcp_RC_list_entitlements、mcp_RC_create_entitlement - 關聯產品:
mcp_RC_attach_products_to_entitlement - 驗證關聯:`mcp_RC_get_products_from_entitleme
<!-- truncated for translation batch; full body continues in source -->






