Appstrate
[Infrastructure]

Cron that doesn't fire twice. Ever.

BullMQ-backed distributed scheduling. Exactly-once guaranteed. Per-worker rate limiting.

[01 · Why it matters]

Distributed scheduling is surprisingly easy to get wrong.

Fire a cron twice and you might charge a customer twice. Fire zero times and you miss a report. Fire with drift and your reports lag.

Appstrate uses BullMQ's repeatable jobs for exactly-once firing across N workers. Max 5 runs/min per schedule, configurable. Upgrades are zero-downtime.


[02 · How it works]

Create a schedule. Walk away.

Cron expression + agent + input. Scheduler dispatches to the same run path as API calls. All observability applies.

Create a schedulePOST /api/agents/{scope}/{name}/schedules
{
  "name": "Nightly enrichment",
  "connectionProfileId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "cronExpression": "0 3 * * *",
  "timezone": "Europe/Paris",
  "input": {
    "source": "hubspot"
  }
}

[03 · Deep dive]

What makes it work.

🎯

Exactly-once

Atomic Redis dequeue. No double-fires across workers.

⏱️

Timezone-aware

DST-safe cron. IANA tz identifiers.

🚦

Rate limited

Default 5/min per schedule. Protects against runaway loops.

🔄

Boot sync

Schedules re-registered from DB on startup. No stale state.


Schedules you can sleep through.

Distributed exactly-once firing. Boring — the good kind.