skills/tddworks/asc-cli-skills/asc-subscriptions

asc-subscriptions

SKILL.md

asc Subscriptions

Manage auto-renewable subscription groups, tiers, and localizations via the asc CLI.

Subscription Groups

# List
asc subscription-groups list --app-id <APP_ID>

# Create
asc subscription-groups create \
  --app-id <APP_ID> \
  --reference-name "Premium Plans"

Subscriptions

# List
asc subscriptions list --group-id <GROUP_ID>

# Create
asc subscriptions create \
  --group-id <GROUP_ID> \
  --name "Monthly Premium" \
  --product-id "com.app.monthly" \
  --period ONE_MONTH \
  [--family-sharable] \
  [--group-level 1]

--period values: ONE_WEEK, ONE_MONTH, TWO_MONTHS, THREE_MONTHS, SIX_MONTHS, ONE_YEAR

Subscription Localizations

# List
asc subscription-localizations list --subscription-id <SUBSCRIPTION_ID>

# Create
asc subscription-localizations create \
  --subscription-id <SUBSCRIPTION_ID> \
  --locale en-US \
  --name "Monthly Premium" \
  [--description "Full access, billed monthly"]

Subscription Introductory Offers

# List
asc subscription-offers list --subscription-id <SUBSCRIPTION_ID>

# Create free trial
asc subscription-offers create \
  --subscription-id <SUBSCRIPTION_ID> \
  --duration ONE_MONTH \
  --mode FREE_TRIAL \
  --periods 1

# Create paid intro offer (price point required for PAY_AS_YOU_GO / PAY_UP_FRONT)
asc subscription-offers create \
  --subscription-id <SUBSCRIPTION_ID> \
  --duration THREE_MONTHS \
  --mode PAY_AS_YOU_GO \
  --periods 3 \
  --territory USA \
  --price-point-id <PRICE_POINT_ID>

--duration values: THREE_DAYS, ONE_WEEK, TWO_WEEKS, ONE_MONTH, TWO_MONTHS, THREE_MONTHS, SIX_MONTHS, ONE_YEAR

--mode values: FREE_TRIAL, PAY_AS_YOU_GO, PAY_UP_FRONT — paid modes require --price-point-id

Subscription Offer Codes

Manage offer codes for subscriptions. Offer codes let you distribute promotional codes with specific eligibility rules and offer terms.

List Offer Codes

asc subscription-offer-codes list --subscription-id <SUBSCRIPTION_ID> [--pretty]

Create Offer Code

asc subscription-offer-codes create \
  --subscription-id <SUBSCRIPTION_ID> \
  --name "SUMMER2026" \
  --duration ONE_MONTH \
  --mode FREE_TRIAL \
  --periods 1 \
  --eligibility NEW \
  --eligibility LAPSED \
  --offer-eligibility STACKABLE

--eligibility (repeatable): NEW, LAPSED, WIN_BACK, PAID_SUBSCRIBER --offer-eligibility: STACKABLE, INTRODUCTORY, SUBSCRIPTION_OFFER --duration: same values as introductory offers --mode: FREE_TRIAL, PAY_AS_YOU_GO, PAY_UP_FRONT

Update Offer Code (activate/deactivate)

asc subscription-offer-codes update --offer-code-id <ID> --active false

Custom Codes

Custom codes are specific redeemable strings (e.g. "SUMMER2026") tied to an offer code.

# List
asc subscription-offer-code-custom-codes list --offer-code-id <ID>

# Create
asc subscription-offer-code-custom-codes create \
  --offer-code-id <ID> \
  --custom-code "SUMMER2026" \
  --number-of-codes 1000 \
  [--expiration-date 2026-12-31]

# Deactivate
asc subscription-offer-code-custom-codes update --custom-code-id <ID> --active false

One-Time Use Codes

Generated code batches — Apple creates unique codes for distribution.

# List
asc subscription-offer-code-one-time-codes list --offer-code-id <ID>

# Create
asc subscription-offer-code-one-time-codes create \
  --offer-code-id <ID> \
  --number-of-codes 5000 \
  --expiration-date 2026-12-31

# Deactivate
asc subscription-offer-code-one-time-codes update --one-time-code-id <ID> --active false

CAEOAS Affordances

Every subscription group response embeds ready-to-run follow-up commands:

SubscriptionGroup:

{
  "affordances": {
    "listSubscriptions":  "asc subscriptions list --group-id <ID>",
    "createSubscription": "asc subscriptions create --group-id <ID> --name <name> --product-id <id> --period ONE_MONTH"
  }
}

Subscription:

{
  "affordances": {
    "createIntroductoryOffer": "asc subscription-offers create --subscription-id <ID> --duration ONE_MONTH --mode FREE_TRIAL --periods 1",
    "createLocalization":      "asc subscription-localizations create --subscription-id <ID> --locale en-US --name <name>",
    "listIntroductoryOffers":  "asc subscription-offers list --subscription-id <ID>",
    "listLocalizations":       "asc subscription-localizations list --subscription-id <ID>",
    "listOfferCodes":          "asc subscription-offer-codes list --subscription-id <ID>"
  }
}

SubscriptionOfferCode:

{
  "affordances": {
    "listOfferCodes":   "asc subscription-offer-codes list --subscription-id <SUBSCRIPTION_ID>",
    "listCustomCodes":  "asc subscription-offer-code-custom-codes list --offer-code-id <ID>",
    "listOneTimeCodes": "asc subscription-offer-code-one-time-codes list --offer-code-id <ID>",
    "deactivate":       "asc subscription-offer-codes update --offer-code-id <ID> --active false"
  }
}

deactivate only appears when isActive == true.

Resolve App ID

See project-context.md — check .asc/project.json before asking the user or running asc apps list.

Typical Workflow

APP_ID=$(cat .asc/project.json 2>/dev/null | jq -r '.appId // empty')
# If empty: ask user or run `asc apps list | jq -r '.data[0].id'`

# 1. Create a subscription group
GROUP_ID=$(asc subscription-groups create \
  --app-id "$APP_ID" \
  --reference-name "Premium Plans" \
  | jq -r '.data[0].id')

# 2. Create subscription tiers
MONTHLY_ID=$(asc subscriptions create \
  --group-id "$GROUP_ID" \
  --name "Monthly Premium" \
  --product-id "com.app.monthly" \
  --period ONE_MONTH \
  --group-level 1 \
  | jq -r '.data[0].id')

ANNUAL_ID=$(asc subscriptions create \
  --group-id "$GROUP_ID" \
  --name "Annual Premium" \
  --product-id "com.app.annual" \
  --period ONE_YEAR \
  --family-sharable \
  --group-level 2 \
  | jq -r '.data[0].id')

# 3. Add localizations
asc subscription-localizations create --subscription-id "$MONTHLY_ID" --locale en-US --name "Monthly Premium" --description "Full access, billed monthly"
asc subscription-localizations create --subscription-id "$ANNUAL_ID" --locale en-US --name "Annual Premium" --description "Full access, billed annually — save 30%"

# 4. Create an offer code with custom codes
OC_ID=$(asc subscription-offer-codes create \
  --subscription-id "$MONTHLY_ID" \
  --name "SUMMER2026" \
  --duration ONE_MONTH \
  --mode FREE_TRIAL \
  --periods 1 \
  --eligibility NEW \
  --eligibility LAPSED \
  --offer-eligibility STACKABLE \
  | jq -r '.data[0].id')

asc subscription-offer-code-custom-codes create \
  --offer-code-id "$OC_ID" \
  --custom-code "SUMMER2026" \
  --number-of-codes 1000 \
  --expiration-date 2026-12-31

# 5. Or generate one-time use codes
asc subscription-offer-code-one-time-codes create \
  --offer-code-id "$OC_ID" \
  --number-of-codes 5000 \
  --expiration-date 2026-12-31

State Semantics

SubscriptionState exposes semantic booleans:

Boolean True when state is
isEditable MISSING_METADATA, REJECTED, DEVELOPER_ACTION_NEEDED
isPendingReview WAITING_FOR_REVIEW, IN_REVIEW
isApproved / isLive APPROVED

SubscriptionCustomerEligibility values: NEW, LAPSED, WIN_BACK, PAID_SUBSCRIBER SubscriptionOfferEligibility values: STACKABLE, INTRODUCTORY, SUBSCRIPTION_OFFER

Nil optional fields (description, state, groupLevel, totalNumberOfCodes) are omitted from JSON output.

Weekly Installs
5
First Seen
2 days ago
Installed on
opencode5
antigravity5
claude-code5
github-copilot5
codex5
amp5