DEV Community

Cover image for No more cron job setup, I built something.
Flavienb
Flavienb

Posted on

No more cron job setup, I built something.

A few months ago I was working on a SaaS and needed to trigger a webhook 14 days after a user signed up β€” trial expiration stuff. Standard thing. And I did what I always do: spun up a cron job, added a table to store context, added some retry logic, added logging because obviously the first version had none and something broke silently.

It worked. It was also kind of a mess.

The annoying part isn't that it's hard. It's that I've built this same thing like four or five times across different projects. Every time slightly different, always the same core problem: I need to call something later, reliably, and I need to know what happened.


At some point I started looking for a simple API that just... did this. Something where I could POST an action with a delay and it would handle the rest. I found a few options but nothing that felt right β€” either too complex, or abandoned, or missing the retry/audit stuff I actually needed.

So I built it myself. Classic.

It's called CallMeLater. The API is intentionally boring:

curl -X POST https://api.callmelater.io/v1/actions \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Trial expiration",
    "schedule": { "wait": "14d" },
    "request": {
      "url": "https://your-app.com/webhooks/trial-expired",
      "body": { "user_id": 42 }
    }
  }'
Enter fullscreen mode Exit fullscreen mode

That's it. It fires the webhook in 14 days. If your endpoint is down, it retries with exponential backoff. Every attempt is logged. If the user upgrades during the trial, you cancel the action with one API call.

No workers to maintain. No polling. No state table.


The part I didn't expect to build

There's also a human approval feature. The idea came from a client project where we needed a human to approve before certain actions ran β€” expert validation, permanent data deletion, or basic reminder.

Instead of executing the webhook directly, you can have CallMeLater send an email (or Slack/Teams message) first, with Yes / No / Snooze buttons. The person clicks one. No login needed. If nobody responds in time, it can escalate to someone else.

{
  "mode": "approval",
  "name": "Deploy v2.1 to production",
  "gate": {
    "message": "Ready to deploy?",
    "recipients": ["ops@yourcompany.com"],
    "channels": ["slack", "email"]
  }
}
Enter fullscreen mode Exit fullscreen mode

Where things are now

There are SDKs for Node.js and Laravel if that's your stack, otherwise the REST API works from anything.

I'm still early-stage and actively shaping what to build next based on actual usage. If you've ever duct-taped a cron job + a database table together to solve this kind of problem, I'd genuinely appreciate you trying it and telling me what's missing.

πŸ‘‰ callmelater.io

Top comments (0)