$npx -y skills add rorkai/app-store-connect-cli-skills --skill asc-ppp-pricingSet territory-specific pricing for subscriptions and in-app purchases using current asc setup, pricing summary, price import, and price schedule commands. Use when adjusting prices by country or implementing localized PPP strategies.
| 1 | # PPP pricing (per-territory pricing) |
| 2 | |
| 3 | Use this skill to create or update localized pricing across territories based on purchasing power parity (PPP) or your own regional pricing strategy. |
| 4 | |
| 5 | Prefer the current high-level flows: |
| 6 | - `asc subscriptions setup` and `asc iap setup` for parent creation and pricing, |
| 7 | followed by version-scoped metadata commands |
| 8 | - `asc subscriptions pricing ...` for subscription pricing changes |
| 9 | - `asc iap pricing summary` and `asc iap pricing schedules ...` for IAP pricing changes |
| 10 | |
| 11 | ## Preconditions |
| 12 | - Ensure credentials are set (`asc auth login` or `ASC_*` env vars). |
| 13 | - Prefer `ASC_APP_ID` or pass `--app` explicitly. |
| 14 | - Decide your base territory (usually `USA`) and baseline price. |
| 15 | - Use `asc pricing territories list --paginate` if you need supported territory IDs. |
| 16 | |
| 17 | ## Subscription PPP workflow |
| 18 | |
| 19 | ### New subscription: bootstrap the parent and price with `setup` |
| 20 | Use `setup` to create the group and subscription, upload the App Review |
| 21 | screenshot, materialize the complete equalized price matrix, and set sale |
| 22 | availability. Create the API 4.4.1 group and subscription versions afterward; |
| 23 | the localization flags on `setup` use deprecated v1 resources and must not be |
| 24 | used for new workflows. |
| 25 | |
| 26 | ```bash |
| 27 | asc subscriptions setup \ |
| 28 | --app "APP_ID" \ |
| 29 | --group-reference-name "Pro" \ |
| 30 | --reference-name "Pro Monthly" \ |
| 31 | --product-id "com.example.pro.monthly" \ |
| 32 | --subscription-period ONE_MONTH \ |
| 33 | --review-screenshot "./review.png" \ |
| 34 | --price "9.99" \ |
| 35 | --price-territory "USA" \ |
| 36 | --territories "USA,CAN,GBR" \ |
| 37 | --no-verify \ |
| 38 | --output json |
| 39 | ``` |
| 40 | |
| 41 | Capture `.groupId` and `.subscriptionId` from the setup JSON, then add |
| 42 | version-scoped metadata. `--no-verify` is intentional here: without deprecated |
| 43 | v1 localizations, the parent can remain `MISSING_METADATA` until the v2 steps |
| 44 | finish. |
| 45 | |
| 46 | ```bash |
| 47 | asc subscriptions groups versions list --group-id "GROUP_ID" --state PREPARE_FOR_SUBMISSION --paginate --output json |
| 48 | # If and only if the list has zero matches: |
| 49 | asc subscriptions groups versions create --group-id "GROUP_ID" --output json |
| 50 | # For one match, reuse .data[0].id. For more than one, stop and require an explicit GROUP_VERSION_ID. |
| 51 | asc subscriptions groups versions localizations list --version-id "GROUP_VERSION_ID" --paginate --output json |
| 52 | # If and only if en-US is missing: |
| 53 | asc subscriptions groups versions localizations create --version-id "GROUP_VERSION_ID" --locale "en-US" --name "Pro" |
| 54 | # Otherwise, if and only if the resolved en-US name differs: |
| 55 | asc subscriptions groups versions localizations update --id "GROUP_LOC_ID" --name "Pro" |
| 56 | # Otherwise, do nothing. |
| 57 | |
| 58 | asc subscriptions versions list --subscription-id "SUB_ID" --state PREPARE_FOR_SUBMISSION --paginate --output json |
| 59 | # If and only if the list has zero matches: |
| 60 | asc subscriptions versions create --subscription-id "SUB_ID" --output json |
| 61 | # For one match, reuse .data[0].id. For more than one, stop and require an explicit SUBSCRIPTION_VERSION_ID. |
| 62 | asc subscriptions versions localizations list --version-id "SUBSCRIPTION_VERSION_ID" --paginate --output json |
| 63 | # If and only if en-US is missing: |
| 64 | asc subscriptions versions localizations create --version-id "SUBSCRIPTION_VERSION_ID" --locale "en-US" --name "Pro Monthly" --description "Unlock everything" |
| 65 | # Otherwise, if and only if the resolved en-US values differ: |
| 66 | asc subscriptions versions localizations update --id "SUBSCRIPTION_LOC_ID" --name "Pro Monthly" --description "Unlock everything" |
| 67 | # Otherwise, do nothing. |
| 68 | asc subscriptions groups versions localizations list --version-id "GROUP_VERSION_ID" --paginate --output table |
| 69 | asc subscriptions versions localizations list --version-id "SUBSCRIPTION_VERSION_ID" --paginate --output table |
| 70 | asc validate subscriptions --app "APP_ID" --output table |
| 71 | ``` |
| 72 | |
| 73 | For each version list, reuse its single `PREPARE_FOR_SUBMISSION` result. Create |
| 74 | only when the result is empty; if more than one result is returned, stop and |
| 75 | require an explicit version ID instead of creating another non-deletable |
| 76 | version. Each localization create/update pair is also conditional: create for |
| 77 | a missing locale, update the resolved localization only when values differ, |
| 78 | and do nothing when it already matches. |
| 79 | |
| 80 | Notes: |
| 81 | - `setup` materializes Apple's complete equalized price matrix from the selected |
| 82 | base price. This split workflow defers final verification until the v2 |
| 83 | localizations exist. |
| 84 | - Outside this split v2 bootstrap, omit `--no-verify` so setup performs its |
| 85 | normal readback verification. |
| 86 | - Use `--tier` or `--price-point-id` instead of `--price` when your workflow is tier-driven. |
| 87 | - If an existing subscription remains `MISSING_METADATA` with the same selected base price, re-run the setup inputs with `--repair` to atomically rebuild and re-save |