Repository navigation
Free to Paid new triggerrs - #836
Merged
Merged
Conversation
Free apps have no backups, so deleting a class or rows is permanent. The
"Delete this class?" and "Delete rows" confirmations now say so on Free
and link to the MVP checkout ("Keep daily backups of your data"). Delete
still works as before; paid plans see nothing new; relation detach is
skipped since no data is removed.
New gates: backup_delete_class, backup_delete_rows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Apps over a limit without payment are blocked (402), but the Overview only showed a yellow or red bar. A banner above the app summary now says what is close to the limit and what happens at 100%, without suggesting the user wait for the next month: - above 70% (yellow) and above 90% (red): "You've used 84% of this month's API requests (21 K of 25 K). At 100%, your app stops responding and your users start getting errors.", plus how many other limits are close - blocked (100% or a 402 from the server): "Your app stopped responding: it reached its ... limit. Your app's users are getting errors right now." Free opens the MVP checkout (new gate usage_limit, "Keep your app running"); paid plans link to Plan Usage. Thresholds match the existing usage bars. getUsagePercent is extracted from getUsageClassName. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Job limit reached" sent everyone to the plan comparison page, and the
clicks so far did not turn into purchases. On Free the next step is
always MVP, so its "Upgrade plan" now opens the MVP checkout ("Schedule
more background jobs", up to 3 jobs). Paid plans still go to Plan Usage
until upgrades between paid plans are confirmed not to double bill.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The profiler paywall had its own Paddle checkout that always charged Dedicated monthly ($500) in a plain white modal. "Buy now" now opens the shared direct checkout (yearly preselected, light/dark theme, "See which queries slow your app down"), and the card shows $400/month billed yearly. Removes the duplicated Paddle setup, owner-email lookup and manual event logging (-154 lines); events now come from the shared component, same gate db_profiler. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The log screens show only the most recent lines and older ones come
through support, but nothing said so. Every log screen now ends with
"These are the most recent logs. Need older ones? Open a ticket."
On Access logs, Free also sees "Free keeps access logs for 1 day; MVP
keeps 7 days." (the retention on the pricing page) with an MVP checkout
("Debug with a week of access logs"). New gate: logs_retention.
LogsFooter.react.js is added with -f: the repo's "logs/" ignore rule also
matches src/dashboard/Data/Logs on case-insensitive file systems.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mn delete The backup notice looked like a separate card inside the delete dialogs (bordered box, different width, plain text link). It is now a regular dialog row, like "Confirm this action": "No backups on Free / Deleted data can't be recovered. MVP keeps a daily backup for 7 days." with the standard green "Get daily backups" button, same as the other paywalls. Removing a column deletes that field in every row, so the "Remove a column?" and "Delete this column?" dialogs get the notice too (new gate backup_delete_column). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The banner talked about whichever limit had the highest percentage, so a 78% file storage beat API requests at 74%. Now it picks the most urgent level first (blocked, then red above 90%, then yellow above 70%) and, within the same level, prefers API requests (they run out fastest), then database, then file storage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Overview banner only shows on the Overview, but the sidebar is on every app page. Plan Usage now shows the same limit as the banner (most urgent first, then API, database, files) as a "84%" pill: yellow above 70%, red above 90%, capped at 100%. Hidden otherwise. Each page renders its own sidebar, so the plan is fetched through a 5-minute per-app cache (lib/planDataCache) instead of on every navigation. getMostUrgentUsage is shared with the banner. B4aSidebar accepts a ready badge element per section besides badgeParams. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Plan Usage only colored the numbers yellow. It now shows the same usage banner as the Overview above the plan card (same limit, same wording, MVP checkout on Free; no "See plans" link since the user is already there). - On Free, MVP gets the highlight and the green button with a "Recommended for you" ribbon: for a Free app near its limits, MVP ($15/yr-month) already covers it. Paid plans keep Pay As You Go as "Most Popular". - The banner moves to components/UsageLimitBanner (shared by Overview and Plan Usage), and the plan list moves to dashboard/AppPlan/prices.js to avoid an import cycle (AppPlan -> banner -> checkout -> AppPlan). AppPlan still re-exports prices. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Change" sent every app to the migration Typeform, where Free users pick
South Korea, India, Australia or Singapore only to learn they need a paid
plan. On Free it now opens a region picker in the dashboard:
- Europe (free) goes to the migration form, as before
- the other regions open the MVP checkout ("Run your app closer to your
users"); after paying, the checkout points to the same form for this
app ("Request the migration")
Paid apps still go straight to the form. New gate: region_change.
The checkout's post-purchase step now takes any link (nextStepLink);
HTTPS keeps "Open a ticket".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… only over quota Paid plans keep running over their limits and pay the overage, so "your app stops responding" was wrong for them: - Free: unchanged (yellow >70%, red >90%, blocked at 100%). - MVP: always yellow, with the overage price from the pricing page. "You've used 98% of this month's API requests on MVP (490 K of 500 K). Above 100%, extra requests are billed at $5 per 100K." Past 100%: "It keeps running, and extra requests are billed at $5 per 100K." Button: Upgrade plan (Plan Usage). - Pay As You Go: nothing until over its included usage, then a neutral note that the overage is billed ($2 per 100K requests, $15/GB database, $1 per 10 GB files) with "Upgrade to Dedicated". - Dedicated / custom: no usage warnings. - A real 402 from the server is red on any plan. The sidebar pill follows the same rules and shows the real percentage past 100% on paid plans. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The backend only grants canChangeCustomDomain from Pay As You Go up
(Gold, Silver, Dedicated, Custom), but the dashboard sold custom domains
on MVP, so an MVP buyer would stay blocked. Two steps now:
- Free -> MVP: web hosting on a b4a.app subdomain (copy no longer
mentions your own domain: web hosting headline, MVP card, "Take this
app to production", Plan Usage upgrade box).
- MVP -> Pay As You Go: custom domain with HTTPS. The Domains custom
domain paywall and the Overview "Enable HTTPS" link to Plan Usage
(Pay As You Go highlighted) instead of opening a second subscription
for someone already paying for MVP. The Pay As You Go card lists
"Custom domain".
The custom_domain checkout offer is Pay As You Go ("Use your own domain").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paywalls follow the backend permissions, so they also show for paying apps (e.g. Starter/Solo have no collaborators; Resource-Based, Partners or Public App have none of the paid features). Their button opened the MVP checkout anyway, which starts a second subscription, sometimes for a plan below the current one. UpgradeGateButton now checks the plan (5-minute per-app cache) when clicked: Free opens the direct checkout as before; any other plan, or a failed plan lookup, goes to Plan Usage with ?gate=. The click event is logged in both cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Free app at 100% still serves requests until it is paused, so "Your app
stopped responding" was not true yet (suggested by Charles). Two states:
- over the limit, still running: "Your app reached its API requests limit
and can stop responding at any moment. Upgrade now to keep it running."
(red, "Upgrade to keep it running")
- blocked, when the plan is "Free Plan - Paused" or the server answers
402: the existing "stopped responding" message ("Upgrade to bring it
back").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Solo and Starter offer MVP; MVP, Basic, Intermediate and Standard offer Pay As You Go; Pay As You Go and Advanced offer Dedicated. Dedicated, Silver, Gold, Platinum and custom plans stay without usage warnings. Legacy plans show no overage price, since only MVP and Pay As You Go publish one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Advanced has the same limits and overage prices as Pay As You Go, so it now names the price of the extra usage instead of only the amount. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
charles-ramos
approved these changes
Oct 6, 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
Follow-up to #835 (direct checkout from paywalls). Two moments where a Free user is about to lose something and today sees no offer:
What changed (one commit each)
Backup before delete (
802594c3)backup_delete_class,backup_delete_rows.Usage banner on the Overview (
5479c5fe)usage_limit.getUsagePercentextracted fromgetUsageClassName(same behavior).Jobs limit → MVP checkout on Free (
8a19acbe)Database Profiler → standard checkout (
198dbdde)Logs footer (
4420401b)logs_retention..gitignore'slogs/rule also matchessrc/dashboard/Data/Logs/on macOS, so new files there are silently ignored;LogsFooter.react.jswas added with-f.Backup notice as a dialog row + column delete (
1dc6abbd)backup_delete_column).Usage priority, sidebar badge, Plan Usage (
ab4a72c0,d371571a, latest)components/UsageLimitBanner; plan list →dashboard/AppPlan/prices.js(breaks an import cycle; AppPlan re-exports it).Hosting region on Free (
ec552b8b)region_change.Usage warnings by plan (
5c81c266)Custom domains start on Pay As You Go (
2c23bea8) — fixes a problem shipped in #835checkBackendPricingPermission.js) only grantscanChangeCustomDomainfrom Pay As You Go up; BaaS free→paid: funnel tracking, direct checkout from paywalls, yearly default #835 sold custom domains on MVP.Direct checkout only for Free (
b194f445) — fixes a risk shipped in #835UpgradeGateButtonnow checks the plan on click (cached): Free → direct checkout; any other plan or a failed lookup → Plan Usage with?gate=.Free over its limit vs paused (
7f03e5a7)Not in this PR
/save-subscriptioncancels the old subscription, to avoid double billing.Please verify
Tests run locally
jest: newusageAlert.test.js(7) + backup cases inUpgradeCheckout.test.js; 29 passing across the upgrade suites.eslintclean on changed files;npm run buildpasses;madgeshows only the pre-existingdashboard/Settings/Utilcycle.🤖 Generated with Claude Code