Summary
In-app plan prices are always rendered with a hardcoded $ (USD), and the billing API provides no currency information, so the app cannot display a user's actual billing currency. For any user billed in a non-USD currency, the in-app price would show USD while the Stripe billing portal shows the real local currency - a mismatch.
Evidence
app/src/main/kotlin/org/astermail/android/ui/auth/register_plan_step.kt:400
"$%.2f".format(amount) + " / " + (plan.billing_period ?: billing_interval)
The currency symbol is hardcoded.
core-api/src/main/kotlin/org/astermail/android/api/billing/BillingApi.kt - the AvailablePlan model has price_cents but no currency field, so the client has nothing to localize with.
- The in-app billing screen (
app/src/main/kotlin/org/astermail/android/ui/settings/detail/billing_screen.kt) only opens the Stripe portal in a browser, which localizes correctly; the discrepancy is purely on the in-app price text.
Status / latency
This is currently latent: where Aster bills in USD (confirmed for a Ukraine-based account, where the Stripe portal also showed USD), the hardcoded USD display happens to match the real charge currency, so there is no visible discrepancy. It becomes a visible bug as soon as any user is billed in a non-USD currency.
Fix direction
Backend-gated: the billing API needs to return a currency (and ideally a preformatted localized price) per plan; the client then formats accordingly instead of hardcoding $.
Summary
In-app plan prices are always rendered with a hardcoded
$(USD), and the billing API provides no currency information, so the app cannot display a user's actual billing currency. For any user billed in a non-USD currency, the in-app price would show USD while the Stripe billing portal shows the real local currency - a mismatch.Evidence
app/src/main/kotlin/org/astermail/android/ui/auth/register_plan_step.kt:400core-api/src/main/kotlin/org/astermail/android/api/billing/BillingApi.kt- theAvailablePlanmodel hasprice_centsbut no currency field, so the client has nothing to localize with.app/src/main/kotlin/org/astermail/android/ui/settings/detail/billing_screen.kt) only opens the Stripe portal in a browser, which localizes correctly; the discrepancy is purely on the in-app price text.Status / latency
This is currently latent: where Aster bills in USD (confirmed for a Ukraine-based account, where the Stripe portal also showed USD), the hardcoded USD display happens to match the real charge currency, so there is no visible discrepancy. It becomes a visible bug as soon as any user is billed in a non-USD currency.
Fix direction
Backend-gated: the billing API needs to return a currency (and ideally a preformatted localized price) per plan; the client then formats accordingly instead of hardcoding
$.