Area: Monetization (audit p10) · Surface: /gate/paywall, /admin/gate (tiers) · Dimension: competitor-gap · Severity: major
Skool, Circle and Mighty Networks all present monthly-vs-annual toggles with an explicit "save 2 months" / "-20%" savings badge to push members onto annual plans, which raises LTV and cuts churn. mobieusGate forces a tenant to create three separate, unrelated tiers (a Monthly tier and an Annual tier with no relationship), so the paywall cannot show a side-by-side monthly/annual toggle for the *same* plan, cannot compute or display the savings, and members cannot self-switch cadence. The result is weaker upsell to annual and a more confusing tier list.
Evidence
templates/gate/paywall.php:62-65 renders price as `$<?= price ?> <span>/ <?= billing_interval ?></span>` with no compare-at, no "save X%" badge. AdminGateController::createTier (AdminGateController.php:123-128) maps interval to a Stripe price but stores only one price per tier; there is no second annual price tied to a monthly tier and no discount math. GateTier has billing_interval but no `annual_price`/`compare_at`/`savings` concept (grep for coupon/discount/annual in src/Models/GateTier.php returns nothing).
Suggested fix. Let a single gate tier carry both a monthly and an annual Stripe price; add a monthly/annual toggle on the paywall that recomputes effective monthly cost and renders a "save N%" badge; pass the chosen price to /gate/checkout.
Filed by the automated tenant-app audit and adversarially evidence-verified. Status: verified. Open — not yet actioned.
Patrick Bass
@mobieus