Repository navigation
BaaS direct checkout: monthly only; gate views only on real paywalls - #839
Merged
Merged
Conversation
Paywall checkouts open on the monthly plan with no yearly option, and Plan Usage defaults back to Monthly (yearly stays one toggle away there). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Always-on buttons (Overview plan badge and card, MongoDB 8, web hosting, HTTPS, compliance) count only the click. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Backend checkout only logged opened and closed, so a drop in payments could not tell "never saw the form" from "saw it and left" from "tried to pay and was declined". What Paddle shows the buyer happens inside its iframe, which no replay records. Both places that open the Paddle checkout, the paywall modal and the Plan Usage page, now log: baas_checkout_loaded, baas_payment_initiated, baas_payment_failed (with the error type, code and Paddle's message), and baas_checkout_event for everything else Paddle reports, under Paddle's own name (checkout.error, checkout.warning, checkout.failed, checkout.payment.selected, ...). Each carries the checkout's funnel context (app, plan, cycle, source, gate) and the che_ checkout id that Paddle support asks for. Each name and error code goes once per checkout; frame plumbing (ping.size, removespinner, frame.revealed) stays out. No card or email data is read. The decision is paddleEventToTrack in lib/upgradeEvents, tested on its own; trackPaddleEvent logs it only for a checkout the page opened. Same instrumentation as Containers (back4app2#1298) and the Agent (back4app-frontend#225). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep this branch's monthly-only direct checkout, opt-in gate views and Paddle event tracking on top of production2's per-plan offers. The new contextual paywalls (DB profiler, usage banner, backup before delete, logs retention) log their view with logView. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
charles-ramos
approved these changes
Oct 19, 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.
What
baas_upgrade_gate_viewedfires only on paywalls the user reaches by trying the feature (logView). Always-on Overview buttons (plan badge/card, MongoDB 8, web hosting, HTTPS, compliance) log only the click.Why
Since the paywalls went direct-to-checkout, MVP yearly ($180 today) converted 0/61 openings (Oct 6–12, Paddle export), and the Overview buttons inflated gate views on every visit.
Note
This branch is based on #835 and conflicts with production2 (#836/#837 touched
UpgradeCheckout.react.js,DomainSettings.react.jsand the checkout tests). The conflicts are not resolved yet; the gates added after #835 (usage limit, backup, region, etc.) still need alogViewdecision during the resolution.🤖 Generated with Claude Code
Also in this PR: what Paddle reports from inside the checkout (
f411bff9)The Backend checkout only logged opened and closed, so a drop in payments couldn't tell "never saw the form" from "saw it and left" from "tried to pay and was declined". Both places that open the Paddle checkout (the paywall modal and the Plan Usage page) now log:
baas_checkout_loadedcheckout.loadedbaas_payment_initiatedcheckout.payment.initiated, when the card is sentbaas_payment_failedcheckout.payment.failed, witherror_type,error_codeanderror_detailbaas_checkout_eventnameset to Paddle's name (checkout.error,checkout.warning,checkout.failed,checkout.payment.selected, …)app_id,plan,cycle,source,gate) andcheckout_id, theche_that Paddle support asks for.ping.size,removespinner,frame.revealed) is left out.paddleEventToTrackinlib/upgradeEvents, tested on its own.trackPaddleEventonly logs for a checkout the page opened.Checks
upgradeEvents.test.jsandUpgradeCheckout.test.jspass (21 tests, 5 of them new).AppPlan.react.js. Its 8 errors (b4aSettingsno-undef and a missing newline at the end of the file) are already on the base branch.