Use case

Retry failed charges, send renewal reminders, run month-end invoices.

Billing logic has a known cadence (retry at 24h, 72h, 7d; invoice on the 1st; dunning every 3 days for 14 days). Crontap makes the cadence explicit so the logic stays in your app, but the clock lives outside it.

Get started

Free plan · no credit card required

The problem

Why this is painful without the right tool

  • Stripe's automatic card-retry logic is black-box and does not match the dunning schedule your finance team actually wants.
  • You wrote a retry loop in-app and it went from one method to 500 lines of if-else once it had to handle multiple processors and customer states.
  • A monthly invoice run on the 1st needs to fire at 00:05 in your billing timezone (Europe/Berlin, America/New_York), not 00:05 UTC.
  • When a retry job silently stops firing, the first signal is an angry CFO email about a payment that did not retry on day 7.

The fix

How Crontap solves it

Move the cadence out of the app. Crontap fires your /billing/retry-failed-charges or /billing/monthly-invoice-run endpoint at the exact cron and timezone you want. Your app keeps the logic but sheds the scheduler. Failures alert to email / webhook (Slack / Discord / Telegram) with the run's status and response body, so a finance ping fires before the month closes.

cron expression
5 0 1 * *
Run the monthly invoice job at 00:05 local on the 1st of each month.

Three schedules cover most billing flows. A short-cadence schedule for the dunning loop (every day at 09:00 local, fires /billing/retry-failed-charges with a window parameter so the endpoint knows which charges to retry today). A monthly schedule for the invoice run (5 0 1 * * in the billing timezone). A weekly schedule for renewal reminders (Monday 08:00 in the customer timezone).

Pair with Stripe or Lemon Squeezy as the processor and your own backend as the orchestrator. The processor stays the source of truth for transactions; your backend reads charge state, decides what to do (retry, refund, dunning email), and calls the processor. Crontap is the alarm clock that makes sure the orchestrator runs on time.

For multi-tenant SaaS, one schedule per tenant per cadence is the cleanest pattern when tenants live in different timezones. The dashboard groups them and the failure alerts route per tenant if you wire one Slack channel per region. For single-tenant or shared-tenant setups, one schedule per cadence is enough; the endpoint loops over tenants internally.

FAQ

Common questions

Is this a replacement for Stripe billing?
No, it is a driver for your custom logic layered on top. Stripe stays the processor; Crontap fires your backend at the right local time and your backend hits the Stripe API. Same pattern works with Lemon Squeezy, Paddle, or your own merchant-of-record processor.
What if a retry triggers a charge at the same time a customer is paying?
That is your backend's responsibility (idempotency keys, race-condition checks). Crontap only calls the URL on the cadence you configured. The clean pattern is: your endpoint claims a row from a charges-to-retry table, marks it in-flight, calls Stripe, and unwinds on conflict. Idempotency keys at the Stripe layer protect you from double-charges if the same retry fires twice.
What's the shortest interval Crontap supports?
Every 1 minute on paid plans. Free tier available for slower cadences. Most billing schedules sit at every 15 minutes, every hour, daily, or monthly; minute cadence shows up only for the dunning runners that have to fire several waves a day on tight customer-attention windows.
How do I get notified if the invoice run fails?
Wire failure alerts to email / webhook (Slack / Discord / Telegram) on the schedule's Integrations panel. The failure payload includes the run's status code, duration, and response body. For a billing schedule that has to fire on the 1st, alerting on the failure of the 00:05 run is the difference between catching the issue at 00:10 and finding out on the 5th.

Ready to fix it?

Point Crontap at any URL. Pick any cron. Done.

WordPress, Shopify, Railway, Cloud Run, Vercel, HubSpot, Ghost, your own box. If it answers HTTP, Crontap can drive it on a clock you can read, in the timezone that actually matters, and page you when something breaks.

Free forever tier ・ No credit card required

GET

/wp-cron.php?doing_wp_cron=1

Running
Your next schedule

Schedule

"every 5 minutes"

Next

in 23s