Install
$ agentstack add skill-vicoa-ai-app-business-skills-app-pricing-localize ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo 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.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
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 →About
app-pricing-localize
Compute an iOS subscription's per-country App Store prices. Computes PPP as the default baseline, optionally adds a competitor-benchmark and/or App Masters column, shown side by side (local + USD), snapped to real Apple price points. Produces three artifacts: a compare view, a single-product report, and — for multiple products — a wide matrix (one column per tier, current→new cells) that is the human-editable source of truth.
This skill is read-only against the stores. To push the resulting matrix/report live to the App Store or Google Play, hand it to the sibling app-pricing-apply skill. Works for any App Store app — configure via env vars (ASC_KEY_ID, ASC_ISSUER_ID, ASC_KEY_PATH, ASC_BUNDLE_ID) plus the product identifier(s) you want to price.
Question flow (ask these, in order)
- Baseline currency and anchor price? Default USD, anchor = the product's current US price (pulled from ASC). Override with
--anchor-currency/--anchor-price N. A non-USD baseline is converted to USD internally for the PPP math. - Competitor benchmark? Yes / no.
- Yes: name a competitor (or pass an existing benchmark file). The skill will orchestrate research → tier listing → user pick (see the four-step flow below).
- Skip: PPP-only (plus optional App Masters).
- Use the App Masters approach? Optional yes/no. App Masters = its revenue-tested charm ladder + same-number anchor for near-parity currencies (A$/€/C$ = the anchor number).
Four-step flow (when benchmark is on)
- Generate the benchmark file — invoke
app-pricing-researchfor the competitor + the user's country scope. Save to/tmp/.md(or reuse an existing file). Its per-tier tables (Local price + ≈USD, one section per tier) ARE the tier menu; there is no separate "list-tiers" command — read the raw file directly.
- Ask the user how to use those tiers. Two options:
- (1) Pick a specific tier by name — e.g.
"ChatGPT Plus (1)"(monthly),"ChatGPT Go", etc. The BENCHMARK column will scale by that tier's per-country ratios (price_country / price_US), with USA anchored at your anchor. Use when the user has a clear positioning call ("we're competing with X monthly"). - (2) Use
lowest— for each country, take the lowest ratio across ALL tiers (the biggest regional discount the competitor gives in that country, from whichever tier). Most aggressive benchmark; useful for "match the deepest discount competitors are willing to give per market" strategy.
compare --benchmark-file --benchmark-tier '' --approaches ppp,benchmark,appmasters— side-by-side comparison. Under option (2) the BENCHMARK column can mix tiers per country (India might follow Go's ratio, Germany might follow Plus's).
- Ask which approach (
ppp/benchmark/appmasters), thenreport --approach X— writes one markdown file with## Comparison,## Final pricing — X, and## Apply (asc commands). Shareable artifact; nothing is written to App Store Connect.
Skip to step 3 (no benchmark)
If the user skips benchmark, go straight to compare --approaches ppp[,appmasters] → pick approach → report. --benchmark-tier is only required when --benchmark-file is passed AND benchmark is in --approaches.
Quick start
# One-time: point at your ASC key (any App Store app you have Admin/App-Manager access to).
export ASC_KEY_ID=XXXXXXXXXX
export ASC_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
export ASC_KEY_PATH=~/.appstoreconnect/private_keys/AuthKey_XXXXXXXXXX.p8
export ASC_BUNDLE_ID=com.example.yourapp
PRODUCT=com.example.yourapp.monthly # the subscription's productId
COUNTRIES=USA,IND,IDN,BRA,JPN,KOR,MEX,PHL,DEU,GBR,CAN,AUS,TWN
cd skills/app-pricing-localize/scripts
# 1. (Skip if you have a file) Generate a competitor benchmark via the sibling skill.
python3 ../../app-pricing-research/scripts/benchmark.py --app-id 6448311069 \
--countries us,in,id,br,jp,kr,mx,ph,de,gb,ca,au,tw --out /tmp/chatgpt.md
# 2. Read /tmp/chatgpt.md to see the tier names.
# Ask the user: pick a tier by name OR use 'lowest' (per-country lowest ratio).
# 3. Comparison (all three approaches). Named tier:
python3 localize.py compare --product $PRODUCT \
--approaches ppp,benchmark,appmasters \
--benchmark-file /tmp/chatgpt.md --benchmark-tier 'ChatGPT Plus (1)' \
--countries $COUNTRIES
# 3b. Same but with 'lowest' — per-country deepest discount across every tier in the file.
python3 localize.py compare --product $PRODUCT \
--approaches ppp,benchmark,appmasters \
--benchmark-file /tmp/chatgpt.md --benchmark-tier lowest \
--countries $COUNTRIES
# 4. After the user picks an approach — bundle comparison + final table + asc commands into ONE md.
python3 localize.py report --product $PRODUCT \
--approach ppp --approaches ppp,benchmark,appmasters \
--benchmark-file /tmp/chatgpt.md --benchmark-tier 'ChatGPT Plus (1)' \
--countries $COUNTRIES --out /tmp/pricing-plan.md
Knobs
--anchor-currency USD(default) ·--anchor-price N(default = current US price of--product).--k 0.6— share of the PPP gap to take (0 = no discount, 1 = full PPP).--floor 0.40— never below 40% of the anchor. Both are tunable defaults, not constants — calibrate against your own elasticity data.--approaches ppp[,benchmark,appmasters]— columns to render in the comparison ·--approach ppp|benchmark|appmasters— the user's chosen one (required forreport; auto-folded into--approachesif missing) ·--countriesiso3 list ·--out file.matrixknobs:--products P1,P2,…(one column each) ·--labels 'Weekly,Monthly,…'(friendly column headers, parallel to--products; these are the tier namesapp-pricing-applymatches with--tier) ·--usd-ref N(which product feeds the≈$PPP-depth column; default 0) · plus--k --floor --countries --out.
Matrix (multiple products → one table)
For a whole subscription lineup, matrix computes PPP for several products and merges them into one wide table — one column per tier, current→new cells, USA/anchor row first, poorest→richest. This .md is the editable source of truth: tweak any price by hand, then apply it.
python3 localize.py matrix \
--products com.example.weekly,com.example.monthly,com.example.yearly \
--labels 'Weekly,Monthly,Yearly' --usd-ref 1 --out matrix.md
Applying (App Store / Google Play)
This skill never writes to a store. Hand the matrix .md (or a report) to the sibling app-pricing-apply skill, which applies one tier at a time to the App Store (scheduled price changes via the ASC API) and/or Google Play (regional configs via the Android Publisher API) — dry-run by default, only ever lowering. After you produce a matrix, offer it: "matrix ready — want me to apply it to the App Store / Google Play? (app-pricing-apply)". That skill documents the store realities (Apple can't preserve existing subscribers on a decrease; Google reprices new-only; the ~2-day startDate lead; per-region currency handling).
How each column is computed
- PPP:
target_usd = anchor × clamp(1 − k·(1 − price_level), floor, 1), then × FX, charm-snap, capped at current. Price levels = World BankPA.NUS.PPP ÷ PA.NUS.FCRF(Taiwan/HK use a flagged estimate). FX = open.er-api.com. - benchmark: the picked tier's per-country ratios, applied to your anchor.
lowest= per-country min across all tiers. - appmasters: the App Masters ladder interpolated at the anchor tier; for near-parity currencies not in the sheet, the same-number anchor. Sheet data in
data/appmasters_ladder.csv(only 7 countries captured — extend if you get the full sheet).
Charm-snapping rule
The proposed price preserves the current price's last-two-digits tail where possible:
- Current ends in
99(₹1299) or.99($12.99) → proposal ends in99/.99. - Current ends in
.90(R$79.90) or90(NT$390) → proposal ends in.90/90. - Current is round (¥2000, ₩19000, Rp229000) → magnitude-snap (¥1700, ₩15000, Rp130000).
- No current price known → magnitude-snap (safe default).
Notes / limits
- Coverage: every territory with World Bank data (≈ all). The report header prints "N of M priced territories".
- Staleness: World Bank PPP lags ~1–2 yr; FX is live. The header stamps both — re-check if old.
- Tax: EU/UK list VAT-inclusive prices, so a PPP target there is pre-tax-equivalent.
- The strategy (which approach,
k, which benchmark) is a human call; this skill automates the mechanics + safe orchestration.
Prereqs
- ASC API key (same
.p8used for IPA uploads);chmod 600.python3+PyJWT(pip install pyjwt cryptography). - Benchmark column is optional. If you already have a benchmark markdown file (any source — a saved
app-pricing-researchreport, an export, or hand-rolled), just pass--benchmark-file. Only invoke theapp-pricing-researchskill when you actually need to generate one. - Setting prices needs an ASC-writing CLI (e.g.
asc) — this skill only prints the commands.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: vicoa-ai
- Source: vicoa-ai/app-business-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.