Back to blog

Comparisons · Jan 7, 2026

Bubble Scheduled Workflows vs external cron: the workload-unit math

Bubble's recursive API workflows are the only native sub-daily scheduler, and every re-schedule charges 0.7 WU. At minute cadence that is 30,240 WU per month on bookkeeping alone, before any real work runs. Here is the workload-unit math and the external cron pattern that drops scheduling overhead to zero by calling the public API workflow URL directly.
crontap.com / blog
Bubble's recursive API workflows are the only native path to sub-daily cadence, and every re-schedule costs 0.7 WU. At minute cadence that is 30,240 WU per month on bookkeeping alone, before any real work runs. Here is the WU math, the plan-budget reality, and why pointing an external cron at a public API workflow drops scheduling overhead to zero.

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 Workflow call = 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 event dropdown (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 Workflow action 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 Workflow call 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

Related on Crontap

From the blog

Read the blog

Guides, patterns and product updates.

Tutorials on scheduling API calls, webhooks and automations, plus deep dives into cron syntax, timezones and reliability.

Alternatives

Vercel Cron every minute: beating the Hobby hourly limit

Vercel Cron caps Hobby at hourly cadence and 5 jobs, and ties every change to a redeploy. Here is the external cron pattern teams use to ship per-minute schedules, per-IANA timezones, and one dashboard across projects without paying $20/mo per user for Pro.

Alternatives

Cloud Run cron without Cloud Scheduler

Cloud Scheduler costs $0.10 per job per month after the first 3 and asks for OIDC plus IAM bindings on every target. Here is the IAM-free pattern Cloud Run teams use to fire their .run.app URLs on a clock with one bearer token and one dashboard across every GCP project.

Alternatives

Heroku Scheduler alternative: any cron expression without the add-on

Heroku Scheduler caps you at three cadences and account-wide UTC, and spins a one-off dyno per run. Here is the external cron pattern that gives you any cron expression, per-schedule timezones, and zero per-execution dyno spin-up cost.

Guides

Running an OpenAI sentiment pipeline on a real scheduler

OpenAI batch work needs a clock, not a user session. Here is the scheduled HTTP-route pattern teams use to drain LLM batches at a sustainable rate inside OpenAI's rate limits, with per-task failure alerts.

Reference

Cron syntax cheat sheet with real-world examples

Cron syntax without the math. Every pattern you're likely to reach for (every 5 minutes, weekdays, business hours, first of the month), with a practical example and a link to a free debugger.