$npx -y skills add rorkai/app-store-connect-cli-skills --skill asc-revenuecat-catalog-syncReconcile App Store Connect subscriptions and in-app purchases with RevenueCat products, entitlements, offerings, and packages using asc and RevenueCat MCP. Use when setting up or syncing subscription catalogs across ASC and RevenueCat.
| 1 | # asc RevenueCat catalog sync |
| 2 | |
| 3 | Use this skill to keep App Store Connect (ASC) and RevenueCat aligned, including creating missing ASC items and mapping them to RevenueCat resources. |
| 4 | |
| 5 | ## When to use |
| 6 | - You want to bootstrap RevenueCat from an existing ASC catalog. |
| 7 | - You want to create missing ASC subscriptions/IAPs, then map them into RevenueCat. |
| 8 | - You need a drift audit before release. |
| 9 | - You want deterministic product mapping based on identifiers. |
| 10 | |
| 11 | ## Preconditions |
| 12 | - `asc` authentication is configured (`asc auth login` or `ASC_*` env vars). |
| 13 | - RevenueCat MCP server is configured and authenticated. |
| 14 | - In Cursor and VS Code, OAuth auth is available for RevenueCat MCP. API key auth is also supported. |
| 15 | - You know: |
| 16 | - ASC app ID (`APP_ID`) |
| 17 | - RevenueCat `project_id` |
| 18 | - target RevenueCat app type (`app_store` or `mac_app_store`) and bundle ID for create flows |
| 19 | - Use a write-enabled RevenueCat API v2 key when applying changes. |
| 20 | |
| 21 | ## Safety defaults |
| 22 | - Start in **audit mode** (read-only). |
| 23 | - Require explicit confirmation before writes. |
| 24 | - Never delete resources in this workflow. |
| 25 | - Continue on per-item failures and report all failures at the end. |
| 26 | |
| 27 | ## Canonical identifiers |
| 28 | - Primary cross-system key: ASC `productId` == RevenueCat `store_identifier`. |
| 29 | - Keep `productId` stable once products are live. |
| 30 | - Do not use display names as unique identifiers. |
| 31 | |
| 32 | ## Scope boundary |
| 33 | - RevenueCat MCP configures RevenueCat resources; it does not create App Store Connect products directly. |
| 34 | - Use `asc` commands to create missing ASC subscription groups, subscriptions, and IAPs before RevenueCat mapping. |
| 35 | |
| 36 | ## Modes |
| 37 | |
| 38 | ### 1) Audit mode (default) |
| 39 | 1. Read ASC source catalog. |
| 40 | 2. Read RevenueCat target catalog. |
| 41 | 3. Build a diff with actions: |
| 42 | - missing in ASC |
| 43 | - missing in RevenueCat |
| 44 | - mapping conflicts (identifier/type/app mismatch) |
| 45 | 4. Present a plan and wait for confirmation. |
| 46 | |
| 47 | ### 2) Apply mode (explicit) |
| 48 | Execute approved actions in this order: |
| 49 | 1. Ensure ASC groups/subscriptions/IAP exist. |
| 50 | 2. Ensure RevenueCat app/products exist. |
| 51 | 3. Ensure entitlements and product attachments. |
| 52 | 4. Ensure offerings/packages and package attachments. |
| 53 | 5. Verify and print a final reconciliation summary. |
| 54 | |
| 55 | ## Step-by-step workflow |
| 56 | |
| 57 | ### Step A - Read current ASC catalog |
| 58 | |
| 59 | ```bash |
| 60 | asc subscriptions groups list --app "APP_ID" --paginate --output json |
| 61 | asc iap list --app "APP_ID" --paginate --output json |
| 62 | # for each subscription group: |
| 63 | asc subscriptions list --group-id "GROUP_ID" --paginate --output json |
| 64 | ``` |
| 65 | |
| 66 | ### Step B - Read current RevenueCat catalog (MCP) |
| 67 | |
| 68 | Use these MCP tools (with `project_id` and pagination where applicable): |
| 69 | - `mcp_RC_get_project` |
| 70 | - `mcp_RC_list_apps` |
| 71 | - `mcp_RC_list_products` |
| 72 | - `mcp_RC_list_entitlements` |
| 73 | - `mcp_RC_list_offerings` |
| 74 | - `mcp_RC_list_packages` |
| 75 | |
| 76 | ### Step C - Build mapping plan |
| 77 | |
| 78 | Map ASC product types to RevenueCat product types: |
| 79 | - ASC subscription -> RevenueCat `subscription` |
| 80 | - ASC IAP `CONSUMABLE` -> RevenueCat `consumable` |
| 81 | - ASC IAP `NON_CONSUMABLE` -> RevenueCat `non_consumable` |
| 82 | - ASC IAP `NON_RENEWING_SUBSCRIPTION` -> RevenueCat `non_renewing_subscription` |
| 83 | |
| 84 | Suggested entitlement policy: |
| 85 | - subscriptions: one entitlement per subscription group (or explicit map provided by user) |
| 86 | - non-consumable IAP: one entitlement per product |
| 87 | - consumable IAP: no entitlement by default unless user asks |
| 88 | |
| 89 | ### Step D - Ensure missing ASC items (if requested) |
| 90 | |
| 91 | Resolve every parent and version before writing. Match groups by exact reference |
| 92 | name and products by `productId`; never treat a display name as identity. Reuse |
| 93 | the canonical ID when the resource already exists, and run a create command |
| 94 | only when the fully paginated read proves it is missing. A RevenueCat product |
| 95 | mapping is not proof that the corresponding ASC subscription is review-ready. |
| 96 | |
| 97 | ```bash |
| 98 | # Resolve GROUP_ID by exact referenceName. |
| 99 | asc subscriptions groups list --app "APP_ID" --paginate --output json |
| 100 | # If and only if the fully paginated list has zero exact matches: |
| 101 | asc subscriptions groups create --app "APP_ID" --reference-name "Premium" --output json |
| 102 | # For one match, reuse its ID. For more than one, stop and require an explicit GROUP_ID. |
| 103 | |
| 104 | # Resolve SUB_ID by exact productId within GROUP_ID. Run setup only for a missing |
| 105 | # parent or an explicitly approved reconciliation of that same product ID. |
| 106 | asc subscriptions list --group-id "GROUP_ID" --paginate --output json |
| 107 | # If and only if the fully paginated list has zero exact matches, run setup: |
| 108 | asc subscriptions setup \ |
| 109 | --app "APP_ID" \ |
| 110 | --group-id "GROUP_ID" \ |
| 111 | --reference-name "Monthly" \ |
| 112 | --product-id "com.example.premium.monthly" \ |
| 113 | --subscription-period ONE_MONTH \ |
| 114 | --review-screenshot "./review.png" \ |
| 115 | --price "3.99" \ |
| 116 | --price-territory "USA" \ |
| 117 | --te |