You opened the Bubble backend workflow editor, set up a recursive Schedule API Workflow that re-fires itself every minute, deployed, and watched it run. Then you opened your Workload tab and saw the bookkeeping cost: tens of thousands of workload units a month, not on the work itself, on scheduling the next call. That is the part of Bubble's pricing that catches teams on Starter and Growth plans by surprise. Here is what Schedule API Workflow actually charges, the per-minute math, and why the cheaper shape is to skip the scheduling action entirely and let an external clock fire your API workflow URL on cadence.
If you want the short version: keep your backend workflow, expose it as a public API workflow, and point Crontap at the /version-live/api/1.1/wf/{workflow} URL. Bubble does the work; Crontap is the clock. The schedule itself costs 0 WU, your plan stops bleeding units on bookkeeping, and you get every 1 minute on Crontap Pro, per-IANA timezones, and a single dashboard across every Bubble app you own.
If you want the click-by-click walkthrough, see Schedule a Bubble workflow every minute for the sibling how-to post.
How Bubble Scheduled Workflows cost workload units
Bubble bills you in workload units (WU). Bubble's Pricing and Workload FAQ puts it bluntly: every action your app runs has a WU cost, and the meter ticks regardless of whether the work matters or whether anyone hits the page that triggered it.
Backend workflow actions cost on average 0.6 WU each. The Schedule API Workflow action (the one that reads "schedule this workflow at this time") is itself a workflow action, billed at 0.7 WU per call, per Bubble's Scheduling API workflows docs.
That is the part to internalise. Scheduling work is itself work in Bubble's billing model. If your job runs every minute by re-scheduling itself, you are paying twice per cycle: once to do the work, once to queue the next run.
Recursive API workflows are the only native sub-daily option
Bubble's other native scheduler is the Recurring event feature. The dropdown supports Daily, Weekly, Monthly, Quarterly, Yearly. There is no minute, no hour, no every-X cadence. The only native path to anything sub-daily is a recursive API workflow: a backend workflow that finishes by scheduling itself again N seconds in the future.
Bubble's Recursive API workflows docs call this out themselves. Every iteration of the loop runs the work, then runs Schedule API Workflow once more to queue the next minute. That is the structural reason scheduling overhead exists at all in Bubble: the recursive shape is the only knob available, and the recursive shape pays the 0.7 WU tax every cycle.
Minute-cadence math: 30,240 WU per month on overhead alone
Here is the math, with units. A minute-cadence recursive workflow fires:
- 60 times per hour
- 1,440 times per day
- 43,200 times per (30-day) month
Each iteration ends with a Schedule API Workflow call to queue the next one, at 0.7 WU per call. Multiply: 43,200 × 0.7 = 30,240 WU per month, on the bookkeeping alone. That is before a single line of real work runs.
If your workflow body is itself non-trivial (one DB read, one external API call, one DB write is roughly 1.8 to 2 WU per iteration), the actual work adds another ~80,000 WU per month at minute cadence. Total: about 110,000 WU per month for one minute-level recursive loop with a small body.
The bookkeeping is roughly a quarter of the total. That is the wedge.
The plan-budget reality
Bubble's pricing page lays out the WU allowances:
- Starter: 175,000 WU/month at $59/mo billed annually.
- Growth: 250,000 WU/month at $209/mo billed annually.
- Team: 500,000 WU/month, custom pricing.
Park the per-iteration math next to those allowances and the picture sharpens.
- A Starter plan running one minute-level recursive eats 30,240 WU on scheduling overhead. That is ~17% of the plan, gone before any real work happens.
- On Growth, the same overhead is ~12%.
- On Team, ~6%.
If your real work pushes the total to ~110,000 WU/month, you have already burned ~63% of a Starter plan on a single recursive loop. Two of them and you are paying overage, billed at $0.30 per 1,000 WU and uncapped. Three of them and you are on Growth whether you wanted to upgrade or not.
The thread "Tired of Bubble's 24-hour scheduling limit and workload costs?" on r/Bubbleio is the kind of place where this conversation gets had publicly. It is sustained demand, not a one-off complaint.
There is also the July 2024 default 10-iteration cap on new apps: a recursive workflow that hits the cap stops after 10 chained calls, and you find out from a notification email the next morning. The pricey shape isn't even reliable on new apps without you raising the cap manually.
The external cron alternative
The fix is structural. Stop using Schedule API Workflow for recurring work. Expose the backend workflow as a public API workflow, and let an external scheduler fire the URL on cadence.
Crontap calls your endpoint at https://{your-app}.bubbleapps.io/version-live/api/1.1/wf/{workflow} directly. From Bubble's perspective, that is a single inbound API workflow call. Bubble bills the work the workflow does after it receives the request (your DB reads, your API calls, your writes). The scheduling itself costs 0 WU, because Bubble doesn't meter pings it receives, only work it does.
Crontap (cron) → HTTPS POST → /version-live/api/1.1/wf/your-workflow → the actual work
Bubble still owns the runtime. Crontap owns the clock. The wire between them is one HTTPS POST per cadence with a shared-secret parameter (or a privacy-rule check). On Crontap, you get every 1 minute on Pro at $3.25/mo billed annually, per-schedule IANA timezones, and failure alerts to email / webhook (Slack / Discord / Telegram).
For the click-by-click walkthrough (where to enable the API, what to tick, where to copy the URL, what to paste into Crontap), see the sibling post: How to schedule a Bubble.io workflow every minute.
Move the scheduling overhead out of Bubble. Free tier available. No credit card. Schedule your first job →
Worked example: 5-minute Stripe reconciliation across 500 users
Here is a concrete shape from a Starter-plan team running on Bubble.
The job. Every 5 minutes, page through 500 users on the Stripe API to check for disputed charges, missed payments, and trial expirations. Log anything weird back into the Bubble DB. The job needs to land in America/Los_Angeles business hours and pause overnight in that timezone.
The native recursive shape. A backend workflow reconcile-stripe that does the Stripe page-through, writes results, and finishes by calling Schedule API Workflow reconcile-stripe at: Current date/time + 5 minutes. The workflow re-schedules itself indefinitely.
WU cost on 5-minute scheduling overhead:
- 5-minute cadence = 12 reschedules per hour = 288 per day = 8,640 per month.
- 8,640 × 0.7 WU per
Schedule API Workflowcall = 6,048 WU per month, scheduling overhead alone. - The "pause overnight in LA hours" requirement either runs anyway and wastes WU on no-op iterations, or you wrap it in an "only if business hours" check that itself adds two more 0.6 WU actions per iteration (~5,184 WU/month). Total bookkeeping: about 11,000 WU per month, before the reconciliation work.
The external cron shape. The same reconcile-stripe workflow, exposed as a public API workflow with a shared-secret parameter. One Crontap schedule, cadence */5 8-18 * * 1-5 (every 5 minutes, business hours only, weekdays only), timezone America/Los_Angeles. The Schedule API Workflow action and the "is it business hours" guard both vanish from the workflow body.
WU cost on scheduling: 0. The reconciliation work itself still costs the same WU it did before. The savings are entirely on bookkeeping: in this case, ~11,000 WU per month, which on Starter is ~6% of the plan.
Multiply by the number of recursive workflows your app runs and you can usually move down a Bubble plan tier on bookkeeping alone.
When to keep Bubble's native scheduler
External cron is a shape, not a religion. The native scheduler is the right answer when:
- The cadence is daily or rarer and fits the
Recurring eventdropdown (Daily, Weekly, Monthly, Quarterly, Yearly). - The schedule is per-row in your database (each user has their own daily digest at a personal time, for example). The native
Schedule API Workflowaction takes per-row data and a per-row run time; an external cron has to call back in for each row. - The work runs as admin or ignores privacy rules, and you do not want a public API workflow URL exposed at all.
- The schedule lifecycle is tightly coupled to a Bubble user action ("send this reminder email 24 hours after the user signs up"). That is a one-off
Schedule API Workflowcall per user, not a recurring loop.
For everything else (sub-daily cadence, per-app rather than per-row, multi-environment parity, per-IANA timezone), the external cron pattern reads cleaner and bills cheaper.
FAQ
How does Bubble actually charge for scheduling?
Schedule API Workflow is a workflow action billed at 0.7 WU per call, per Bubble's docs. At minute cadence, that is 30,240 WU/month for the scheduling overhead, separate from whatever the workflow itself does.
Will calling the API workflow from outside Bubble bypass workload billing entirely?
No, only the scheduling overhead. Bubble still bills the WU consumed by the actual workflow actions (DB reads, writes, API calls). The saving is the 0.7 WU per scheduled call you would have paid to queue the next run.
What about Bubble's recursion-cap?
Bubble's infinite recursion protection defaults new apps to 10 iterations on chained schedules. External cron does not have iteration depth; the schedule is just a clock pinging an endpoint, and the chain is one ping deep every time.
Does this work for multiple Bubble environments (live and dev)?
Yes. Point one Crontap schedule at version-live, another at version-test. Same workflow URL shape, different prefix. Per-environment cadence and timezone, no mixing. Pause the dev schedule between sprints to save WU on the test environment.
Is calling a public API workflow from an external scheduler allowed?
Yes. Public API workflows are a documented Bubble feature, and calling them from any HTTPS client is the intended usage, including external schedulers. The auth shape (privacy rules with a Bearer token, or a shared-secret parameter) is the same one Bubble's docs recommend for any third-party caller.
References
- Bubble Docs: Scheduling API workflows
- Bubble Docs: Recursive API workflows
- Bubble Docs: Recurring event
- Bubble Docs: Pricing and Workload FAQ
- r/Bubbleio: Tired of Bubble's 24-hour scheduling limit and workload costs
Related on Crontap
- Schedule a Bubble.io workflow every minute. The sibling how-to post with the click-by-click walkthrough.
- Cron jobs for Bubble spoke. The Bubble-specific guide to running scheduled work without burning workflow units.
- Integrate cron schedules with Zapier webhooks. The webhook-driven shape on a different low-code platform.
