Add a $50 lifetime license paywall #50

Open
opened 2026-08-23 17:37:54 +00:00 by kayg · 0 comments
Owner

Goal

Add a native paywall for a one-time USD $50 lifetime entitlement. Do not add a subscription or a trial.

Scope

  • The direct build uses an injected Adapter for website purchase and license verification. The direct checkout provider remains a product decision and is not assumed here.
  • A future App Store build uses a separate App Store Adapter with StoreKit 2 non-consumable purchase and restore flows.
  • Inject one Licensing capability at the application composition root. Make omission and unavailable capability explicit. Do not use global licensing state or scattered licensing checks.
  • Decide which product surfaces are behind the paywall during the implementation grill. Never lock users out of existing local data, export, or settings.
  • Use a native paywall. Include accessibility support and regional price and tax text.
  • Support purchase, activation, restore, deactivation, and the device policy. Define offline grace, refund and revocation behavior, clock tampering behavior, receipt and license signature checks, Keychain storage, and secret and log redaction.
  • Keep App Store review compliance and a separate build flavor. Do not include an external checkout link in the App Store build where platform rules prohibit it.

Acceptance

  • The implementation grill records the paywalled product surfaces and confirms that local data, export, and settings remain available without an entitlement.
  • The direct build has an Adapter boundary for website purchase and license verification. The checkout provider is selected separately and is not hard-coded by this issue.
  • The future App Store build has a separate build flavor and a StoreKit 2 Adapter for non-consumable purchase and restore.
  • The composition root injects one Licensing capability. Entitled, unentitled, offline, revoked, restore, error, omitted, and unavailable states are explicit at that seam.
  • The implementation defines activation, restore, deactivation, device policy, offline grace, refund, revocation, clock tampering, receipt and license signature validation, Keychain storage, and secret and log redaction.
  • The paywall uses native controls and states the regional price and applicable tax information. It passes keyboard, VoiceOver, Dynamic Type, contrast, and reduced-motion checks.
  • Deterministic tests use a fake Adapter for entitled, unentitled, offline, revoked, restore, and error cases. Tests prove that no spinner remains visible when no work is in flight.
  • Entitlement data is cached with a bounded refresh policy. License network calls do not occur once per row or on every window focus.
  • App Store builds meet review requirements and contain no prohibited external checkout link.
## Goal Add a native paywall for a one-time USD $50 lifetime entitlement. Do not add a subscription or a trial. ## Scope - The direct build uses an injected Adapter for website purchase and license verification. The direct checkout provider remains a product decision and is not assumed here. - A future App Store build uses a separate App Store Adapter with StoreKit 2 non-consumable purchase and restore flows. - Inject one Licensing capability at the application composition root. Make omission and unavailable capability explicit. Do not use global licensing state or scattered licensing checks. - Decide which product surfaces are behind the paywall during the implementation grill. Never lock users out of existing local data, export, or settings. - Use a native paywall. Include accessibility support and regional price and tax text. - Support purchase, activation, restore, deactivation, and the device policy. Define offline grace, refund and revocation behavior, clock tampering behavior, receipt and license signature checks, Keychain storage, and secret and log redaction. - Keep App Store review compliance and a separate build flavor. Do not include an external checkout link in the App Store build where platform rules prohibit it. ## Acceptance - The implementation grill records the paywalled product surfaces and confirms that local data, export, and settings remain available without an entitlement. - The direct build has an Adapter boundary for website purchase and license verification. The checkout provider is selected separately and is not hard-coded by this issue. - The future App Store build has a separate build flavor and a StoreKit 2 Adapter for non-consumable purchase and restore. - The composition root injects one Licensing capability. Entitled, unentitled, offline, revoked, restore, error, omitted, and unavailable states are explicit at that seam. - The implementation defines activation, restore, deactivation, device policy, offline grace, refund, revocation, clock tampering, receipt and license signature validation, Keychain storage, and secret and log redaction. - The paywall uses native controls and states the regional price and applicable tax information. It passes keyboard, VoiceOver, Dynamic Type, contrast, and reduced-motion checks. - Deterministic tests use a fake Adapter for entitled, unentitled, offline, revoked, restore, and error cases. Tests prove that no spinner remains visible when no work is in flight. - Entitlement data is cached with a bounded refresh policy. License network calls do not occur once per row or on every window focus. - App Store builds meet review requirements and contain no prohibited external checkout link.
kayg changed title from Add a 0 lifetime license paywall to Add a $50 lifetime license paywall 2026-08-23 17:38:06 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/hermternal-apple#50
No description provided.