Tend is a hosted API for cron schedules, delayed jobs, retries with backoff, concurrency limits, and signed webhook deliveries. You describe the work; we make sure it happens on time, the right number of times, and tell you how it went.
Standard five-field cron expressions evaluated in any IANA time zone, with daylight saving transitions handled explicitly. Intervals can be as short as 30 seconds. A job scheduled for 2:30 AM on the night the clocks jump runs once, not zero times and not twice.
Delayed one-off jobs
Enqueue a job with run_at or delay_seconds and Tend fires it at that moment. Cancel or reschedule until it starts. Useful for trial-expiry emails, abandoned-cart nudges, and anything else that begins with the words "in three days".
Retries with exponential backoff
Failed runs retry automatically with full-jitter exponential backoff, starting at 10 seconds and capped at one hour by default. Set up to 25 attempts per job, or mark a specific response code as permanent so we stop asking.
Concurrency limits per key
Assign a concurrency_key and cap how many runs sharing it may execute at once. Excess runs wait in order instead of stampeding your database. A limit of 1 gives you a mutex with a paper trail.
Signed webhook deliveries
Every result is delivered to your endpoint with a Tend-Signature header containing an HMAC-SHA256 of the timestamp and body. Verify it in four lines. Undelivered webhooks are retried for 48 hours before we give up and tell you so.
Idempotency built in
Send an Idempotency-Key header on any create request and repeat it safely for 24 hours. Network timeouts stop being a philosophical question about whether your job exists.
We replaced a homegrown cron server, three Redis queues, and one person's memory of how it all fit together. Tend has now run 41 million of our jobs and the pager has been quiet for most of that time.