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 connected email, Slack, Discord, or Telegram channels with useful run context. Machine webhooks remain available as Integrations.

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?
Choose connected email, Slack, Discord, or Telegram channels under Notifications, or add a machine webhook under Integrations. If the final attempt fails, the payload includes status code, duration, size, error summary, and attempt history instead of leaving you to discover the problem days later.

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