Repository navigation
BaaS free→paid: funnel tracking, direct checkout from paywalls, yearly default - #835
Merged
Merged
Conversation
Adds baas_upgrade_gate_viewed / baas_upgrade_gate_clicked on every paywall (web hosting, custom domain, email templates, parse options, jobs, collaborators, compliance, MongoDB 8.0, DB profiler, overview plan card) and baas_checkout_opened / baas_checkout_closed around the Paddle checkout. Paywall links pass ?gate= to plan-usage so the checkout events and "At Checkout - Subscription Successful" carry source and gate. Events are prefixed baas_ so the Agent's upgrade_* charts are unaffected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The site pricing page defaults to yearly (MVP $15) while the in-app page defaulted to monthly ($25). Also pass plan.name to Paddle; plan.planName does not exist, so the checkout had no title. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Free apps use a tiny fraction of their 25K requests, so "20x more requests" does not land. Lead the MVP card and the upgrade box with custom domain, backups, MongoDB 8.0, email templates and collaborators. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clicking "Upgrade" on a paywall used to land on the three-plan comparison page (87% leave it without choosing a plan). Now it opens a checkout for the plan that unlocks that feature, with a headline about what the user asked for, the price, a monthly/yearly switch and a "Compare all plans" escape hatch. Covers web hosting, custom domain, email templates, Parse options, collaborators and MongoDB 8.0 (MVP), SOC 2 / ISO 27001 (Pay As You Go) and HIPAA (Dedicated). Collaborators, compliance and MongoDB 8.0 used to send users to the public pricing page, losing the app they were on. Jobs, the overview plan card and paid-plan upsells keep going to the plan page. The DB profiler already had its own checkout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The summary panel was dark navy next to a white Paddle frame. The modal is now a single surface in the OS/browser color scheme, and Paddle opens with the matching theme. Billing cycles render as selectable cards. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Real-time Updates "Web hosting" meant two different things: the Server URL subdomain used by LiveQuery (every plan, Free with card validation) and the b4a.app Web URL + custom domains for the public folder (MVP+). Name them after what they do. Routes stay the same. serverInfo keeps the old names next to the new ones, because menu access is matched by name. Plan cards: MVP lists "Web URL & custom domain", Pay As You Go lists "HTTPS on your custom domain". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The "Web Hosting" fact becomes "Web URL" and shows the custom domain when there is one. Its call to action follows the user's state: - plan cannot get a Web URL -> "Get a Web URL" opens the MVP checkout - MVP with a custom domain -> "Enable HTTPS" opens the Pay As You Go checkout; after paying, the modal tells them to open a support ticket, since support turns HTTPS on - no Web URL yet -> "Get a Web URL"; b4a.app only -> "Use your domain"; otherwise "Manage" (all go to Domains) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each paywall headline now states the outcome (e.g. "Bring your team into this app", "Pass your customer's security review"), with an optional supporting line. MongoDB is sold as "Get the latest MongoDB" with no version number, since versions date the copy; the Overview button reads "Upgrade database". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…to MVP
- A badge beside the app name shows the plan. "Free · Upgrade" opens the
MVP checkout; paid plans and paused apps link to Plan Usage.
- The plan card's "Upgrade Plan" also opens the MVP checkout on Free;
paid plans still go to Plan Usage to compare the next tier.
- Both generic entry points sell MVP as a whole ("Take this app to
production") and are tracked as overview_plan_badge / overview_plan_card.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Server URL & Live Query menu and page: "Real-time (Live Query)". - "Web URL" goes back to "Web Hosting" for now (Overview column, Domains page copy, plan cards, checkout headline). The Overview CTA reads "Enable web hosting". The Domains menu name stays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… button - The direct checkout preselects yearly (MVP $15/month, billed $180), matching the pricing page; monthly stays one click away. - Collaborators' "Upgrade Plan" was a plain text link; it is now the same green button as the other paywalls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
charles-ramos
approved these changes
Oct 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Last 90 days (Amplitude, excluding @back4app.com):
What changed (one commit per item)
0. Measure the funnel (
4e2967cd)New Amplitude events, prefixed
baas_so the Agent'supgrade_*charts are unaffected:baas_upgrade_gate_viewedgate,app_idbaas_upgrade_gate_clickedgate,app_idbaas_checkout_openedplan,cycle,source(gate / plan_page),gate,app_idbaas_checkout_cycle_changedbaas_checkout_closedAt Checkout - Subscription Successful(existing)source,gateGates: web_hosting, custom_domain, email_templates, parse_options, jobs, collaborators, mongodb_8, db_profiler, overview_plan_card, compliance_hipaa / soc2 / iso27001. Links into plan-usage carry
?gate=.4. Yearly first + checkout title (
4837beab)billingCycledefaults to yearly on Plan Usage; Paddletitleusedplan.planName(undefined) →plan.name.3. Sell what free apps lack (
7d0f85cc)MVP card and the upgrade box lead with custom domain, backups, MongoDB 8.0, email templates and collaborators instead of "20x more requests".
1 + 2. Direct checkout from paywalls (
5b9af1f6)New
UpgradeGateButton/UpgradeCheckoutModal: the paywall opens the Paddle checkout for the plan that unlocks that feature (headline about the feature, price, monthly/yearly switch viaCheckout.updateCheckout, "Compare all plans" link). Collaborators, compliance and MongoDB 8.0 no longer send users to the public pricing page.Unchanged: Jobs limit, overview plan card and paid-plan "Add More Spots" still go to the plan page; DB profiler already had its own checkout. The direct checkout preselects yearly (like the pricing page), monthly one click away.
Naming (
c88b2ee2)"Web hosting" meant two things. Now:
publicfolder + custom domains. MVP+. HTTPS on a custom domain: Pay As You Go+, enabled by support.Routes unchanged;
serverInfokeeps old and new names because menu access matches by name.Overview Web URL (
d27ee713)"Web Hosting" fact → Web URL, showing the custom domain when there is one. CTA by state: Get a Web URL (MVP checkout when the plan can't), Use your domain, Enable HTTPS (MVP + custom domain → Pay As You Go checkout, then "open a support ticket"), Manage.
Direct checkout theme (
4009e0a7): single surface following the OS light/dark preference; Paddle opens with the matching theme.Not in this PR
alt="not included".parseapi.back4app.com; showing the b4a.io server URL needs the Real-time settings call on the Overview.Shared Paddle bits (
lib/paddleCheckout.js) keep the same side effects as plan-usage:save-subscription, GTMpaddle_purchase, Amplitude purchase event.Please verify before merging
save-subscription) and the page reloads unlocked. Also switch to Yearly before paying.customDatakeeps the existing{ appId, planId }shape; the completion handler readsapp_id || appIdto be safe.Tests run locally
jest: new suitesupgradeEvents.test.jsandUpgradeCheckout.test.js, 14 tests passing. The full suite shows the same 8 failing suites as untouchedproduction2(B4AAlert, CloudCodeView, CodeEditor, CodeTree, CodeView, ColumnPreferences, PermissionsCollaboratorDialog, e2e).eslint: no new errors in changed files (baseline errors are pre-existing); new files clean.npm run build(production): passes. Needed localajv@8/uuid@3.4.0because there is no lockfile; the same failure happens on untouchedproduction2.madge --circular: only the pre-existingdashboard/Settings/Utilcycle.Known, not touched here
AppPlanPaddle callback is a plainfunctionthat readsthis.contextoncheckout.closed, so that redirect never runs.Button.propTypes.trackClickis declared asobjectbut defaults totrue, which warns in dev.🤖 Generated with Claude Code