# App Pricing Localize

> Compute localized App Store subscription prices across countries and render a comparison, a single-product report, or a multi-product price matrix. Uses PPP (purchasing-power, World Bank price levels), an optional competitor benchmark (any app you have research data on), and the optional App Masters charm ladder — each in local currency and USD, snapped to real Apple price points. Read-only; to p…

- **Type:** Skill
- **Install:** `agentstack add skill-vicoa-ai-app-business-skills-app-pricing-localize`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [vicoa-ai](https://agentstack.voostack.com/s/vicoa-ai)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [vicoa-ai](https://github.com/vicoa-ai)
- **Source:** https://github.com/vicoa-ai/app-business-skills/tree/main/skills/app-pricing-localize

## Install

```sh
agentstack add skill-vicoa-ai-app-business-skills-app-pricing-localize
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## 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)
1. **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.
2. **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).
3. **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)

1. **Generate the benchmark file** — invoke `app-pricing-research` for 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.

2. **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.

3. **`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).

4. **Ask which approach** (`ppp` / `benchmark` / `appmasters`), then **`report --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
```bash
# 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 for `report`; auto-folded into `--approaches` if missing) · `--countries` iso3 list · `--out file`.
- **`matrix` knobs:** `--products P1,P2,…` (one column each) · `--labels 'Weekly,Monthly,…'` (friendly column headers, parallel to `--products`; these are the tier names `app-pricing-apply` matches 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.
```bash
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 Bank `PA.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 in `99` / `.99`.
- Current ends in `.90` (R$79.90) or `90` (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 `.p8` used 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-research` report, an export, or hand-rolled), just pass `--benchmark-file`. Only invoke the `app-pricing-research` skill 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](https://github.com/vicoa-ai)
- **Source:** [vicoa-ai/app-business-skills](https://github.com/vicoa-ai/app-business-skills)
- **License:** MIT

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

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-vicoa-ai-app-business-skills-app-pricing-localize
- Seller: https://agentstack.voostack.com/s/vicoa-ai
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
