AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

App Pricing Apply

skill-vicoa-ai-app-business-skills-app-pricing-apply · by vicoa-ai

Apply a localized subscription pricing matrix (produced by app-pricing-localize) to the Apple App Store and/or Google Play. Reads the matrix .md and, per subscription tier, sets each market's price via the App Store Connect API (scheduled price changes) or the Android Publisher API (regional configs). Dry-run by default; only ever lowers. Use when rolling out per-country/per-region subscription p…

— No reviews yet
0 installs
3 views
0.0% view→install

Install

$ agentstack add skill-vicoa-ai-app-business-skills-app-pricing-apply

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • ✓ Prompt-injection patterns
  • ✓ Secret / credential exfiltration
  • ✓ Dangerous shell & filesystem operations
  • ✓ Untrusted network calls
  • ✓ Known-malicious package signatures

What it can access

  • ✓ Network access No
  • ✓ Filesystem access No
  • ✓ Shell / process execution No
  • ✓ Environment & secrets No
  • ✓ Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-vicoa-ai-app-business-skills-app-pricing-apply)

Reliability & compatibility

✓ Security review passed
0 installs to date
— no reviews yet
● 2mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of App Pricing Apply? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

app-pricing-apply

Apply a localized pricing matrix to the stores. The input is the matrix .md produced by the sibling app-pricing-localize skill — the human-editable source of truth (edit prices there first). You apply one subscription tier per run (one column of the matrix → one store product).

Nothing here computes prices; it only writes them. Both appliers dry-run by default and only ever lower a market (a target at/above that store's current price is skipped).

Question flow (ask these, in order)

  1. Which store? App Store, Google Play, or both.
  2. If both — are the prices the same on both stores? The matrix is one set of local targets.

If yes, it drives both stores directly. If no, keep a separate matrix per store (or edit the matrix between runs). Currencies that differ per store are handled automatically (see below).

  1. Tier → product mapping. Each matrix column header (e.g. Monthly) is a tier name; tell

the applier which store product it maps to (App Store productId, or Google productId + basePlanId). One tier per invocation — loop over the tiers you want.

Two realities to know before applying

  • App Store — a price DECREASE always reaches existing subscribers. Apple does not let you

preserve the higher price for them on a cut, so preserveCurrentPrice is a no-op for a decrease (the record reads back preserved: false). It only matters for increases, which this never does. So: existing + new subscribers in each lowered market renew at the new price.

  • Google Play reprices NEW subscribers only, natively. Existing subscribers keep their price.

(This is the one place the two stores genuinely differ.)

App Store — scripts/app_store_apply.py

export ASC_KEY_ID=XXXXXXXXXX
export ASC_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
export ASC_KEY_PATH=~/.appstoreconnect/private_keys/AuthKey_XXXXXXXXXX.p8   # the .p8, chmod 600
export ASC_BUNDLE_ID=com.example.app

# dry run (default) — shows current → target → resolved price point, per territory:
python3 app_store_apply.py --matrix matrix.md --tier "Monthly" --product com.example.app.monthly

# write it (schedules the changes):
python3 app_store_apply.py --matrix matrix.md --tier "Monthly" --product com.example.app.monthly --apply

Encoded gotchas (all learned the hard way):

  • Scheduled change, ~2-day lead. On an approved subscription you can't re-set the "initial"

price — every reprice is a scheduled change needing a future startDate. Apple enforces a ~2-day lead that advances daily; the script defaults to today+2 and, on a 409 "must be on or after DATE", retries with the date Apple demands. Override with --start-date.

  • Delete-then-create. A second scheduled record on the same start date 409s, so the script

deletes any existing scheduled record for a territory then creates — idempotent, dup-free, re-runnable.

  • Real price points. It resolves the nearest Apple price point ≤ target itself (the asc CLI's

--price fails on non-exact values). Transient 5xx are retried; a paginated read finds the live price (there can be 300+ price records per sub).

  • Multiple ASC credentials? These are direct API calls keyed by ASC_KEY_ID/ASC_ISSUER_ID,

so there is no asc --profile ambiguity — just point the env at the right key.

Google Play — scripts/play_store_apply.py

pip install google-api-python-client google-auth        # one-time
export GOOGLE_PLAY_KEY=~/play-service-account.json       # SA JSON with Play + financial perms

python3 play_store_apply.py --matrix matrix.md --tier "Monthly" \
    --package com.example.app --product monthly --base-plan base --key "$GOOGLE_PLAY_KEY"     # dry run
python3 play_store_apply.py --matrix matrix.md --tier "Monthly" \
    --package com.example.app --product monthly --base-plan base --key "$GOOGLE_PLAY_KEY" --apply
  • Currency is fixed per region by Google. The matrix target is in Apple's currency for a

market; where Google bills that market in a different currency (common: Apple USD vs Google local, e.g. CI(USD≠XOF)), the raw number is meaningless, so those markets are skipped and listed — handle them separately. Currency-matched markets apply directly.

  • regionsVersion is auto-detected (the docs' 2022/01 is stale and rejects euro-adopted

regions like BG/HR). subscriptions.patch rewrites basePlans wholesale, changing only the prices being lowered.

  • Market keys are mapped iso3 (matrix) → iso2 (Google region) via data/territories.csv.

How the matrix maps to a store

  • The matrix is keyed by iso3 in each Country cell, e.g. 🇺🇸 United States (USA).
  • App Store territories are iso3 — used directly.
  • Google Play regions are iso2 — mapped from iso3 via data/territories.csv.
  • Each tier column header is the --tier value; you supply the store --product it maps to.

Safety

  • Dry-run by default — nothing is written without --apply.
  • Only ever lowers — a market already at/below its target is skipped (both stores).
  • Idempotent — safe to re-run; the App Store path replaces its own scheduled record rather

than duplicating, and the Google path skips regions already at target.

  • Verify — both print a read-back count after applying.

Prereqs

  • Apple: the App Store Connect .p8 API key (chmod 600) with App Manager/Admin role; python3 + PyJWT.
  • Google: a service-account JSON with Play Console + financial permissions (the RevenueCat SA

is typically read-only → 403 on patch); pip install google-api-python-client google-auth.

  • The matrix .md from app-pricing-localize (run its matrix command first).

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.