Skip to content

"Launch price" follows Pro's live price, so a price step hides it without an update (#908) - #910

Merged
Skeyelab merged 1 commit into
mainfrom
agent3/launch-price
Oct 21, 2026
Merged

Skeyelab merged 1 commit into
mainfrom
agent3/launch-price

Conversation

@Skeyelab

@Skeyelab Skeyelab commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

Closes #908.

What changed

The "Launch price" line under the Pro offers (Settings' Pro section and the paywall) came from a fixed PriceStage.current = .launch. After a price step in App Store Connect, every installed copy would still say "Launch price" beside $9.99 until it updated. Eric's decision: the label follows the live price.

What I chose for the comparison

StoreKit 2's Product exposes no price tier or price-point ID, only price, displayPrice and priceFormatStyle.currencyCode. So:

  • PriceStage.label(proPrice:currencyCode:) shows "Launch price" only when Pro's live price, rounded to the cent, equals Pro's launch price in the storefront's currency.
  • The launch prices come from a table I read read-only from App Store Connect on 2026-10-21: Pro's current price in 175 territories, collapsed to 43 currencies. USD and EUR each list two prices, because territories in one currency differ.
  • Anything not in the table hides the label: a price step, the moment while the price is loading, a currency not listed, or Apple re-equalizing a territory. The cost of that last case is that the label can vanish early in one territory while Pro is still at launch. It never shows beside a raised price.
  • Not taken: a separate launch Pro product as the marker. That means creating an App Store Connect product, which needs Eric's go.

The pack and upgrade offers also key the label on Pro's price, because the ladder moves all the prices together (ADR 0004).

Tests

  • Red: the new PackOfferTests failed to compile (PriceStage.label(proPrice:currencyCode:) didn't exist), then passed.
  • Second red: a Double-built Decimal(4.99) failed the match, which the Code Reviewer flagged as possible StoreKit float residue. Rounding to the cent made it pass.
  • Covered: launch prices in USD, EUR and JPY; trailing zeros (BRL 29.90) and whole numbers (CHF 4); $9.99 and $19.99 hide it; loading, a missing currency and an unknown currency hide it.
  • The full ./scripts/verify.sh passed, and VERIFY_QUICK=1 passed after the rounding fix.

Checked only by tests and the builds. Not checked on a device: what Product.price holds in a TestFlight build. The Xcode StoreKit config is USA at 4.99, so Debug and the Simulator still show the label.

Docs: ADR 0004 records the decision, and the App Store Connect steps no longer mention a one-line stage PR.

@Skeyelab
Skeyelab enabled auto-merge (squash) October 21, 2026 18:36
…hout an update (#908)

The label came from a fixed PriceStage.current = .launch, so after a price
step every installed copy would still say "Launch price" beside $9.99.
StoreKit gives no price tier, so the app now compares Pro's live price,
rounded to the cent, with Pro's launch price in that currency, read from
App Store Connect on 2026-10-21 (43 currencies). Anything else hides it.

Assisted-by: Claude Code:claude-opus-5-5
@Skeyelab
Skeyelab force-pushed the agent3/launch-price branch from 642b11b to 3d5d81b Compare October 21, 2026 18:36
@codecov

codecov Bot commented Oct 21, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@Skeyelab
Skeyelab merged commit 3b4bb86 into main Oct 21, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The paywall keeps saying "Launch price" after Pro's price goes up

1 participant