Run background jobs without Redis or workers
Runza lets you run queues, delayed jobs and scheduled tasks
without running your own job system.
- Send a job via API.
- Runza stores it.
- Runza calls your backend when it's time.
No Redis
No workers
No cron
No queue libraries
No workers
No cron
No queue libraries
Built for small SaaS and integrations.
Background jobs are still more complex
than they should be
than they should be
Even for simple async tasks you often need:
- Redis
- Queue library
- Worker process
- Cron jobs
- Retries
- Locks
- Monitoring
For small apps this is often more infrastructure
than the app itself.
than the app itself.
Every project starts simple
Then you need retries.
Then scheduling.
Then a worker loop.
Then a task table.
Then locking.
Then scheduling.
Then a worker loop.
Then a task table.
Then locking.
And suddenly you have a job system.
Run jobs outside your app
With Runza you don't need a worker process
and you don't need a queue inside your code.
- Send a job via API.
- Runza stores it.
- Runza executes it later.
- Your backend receives a callback.
Your app stays simple.
How Runza works
- Send a job via API: POST /jobs
- Runza stores the job, handles delay, retries and scheduling
- Runza calls your backend via HTTP callback
Use cases
- Send emails later
- Retry webhooks
- Scheduled tasks
- Long API calls
- Background processing
- Queue for SaaS jobs
- Automation and bots
- Internal tools
- ...and anything that shouldn't run
inside the request
Your app stays simple.
Typical setup:
App → Redis → Worker → Retry → Cron → Logs
With Runza:
App → Runza → Callback
Built for small backends
Runza works well for:
- SaaS apps
- Bots
- Integrations
- Webhooks
- Side projects
- Internal tools
Works best when you need async without heavy infrastructure
Not a workflow engine.
Not a queue library.
Just a simple external job runner.
Not a queue library.
Just a simple external job runner.
Your app stays simple.
Runza API
Run background jobs without Redis, workers or cron.
Your App
│
│ enqueue job / webhook / schedule
▼
Runza
│
├ Queue
├ Scheduler
├ Retries
├ Logs
│
▼
Worker URL
│
▼
Your Backend
1. Create a Queue
Create a queue that will process email jobs:
POST /v1/queues
Authorization: Bearer YOUR_RUNZA_API_KEY
{
"name": "emails",
"worker_url": "https://api.myapp.com/jobs/email"
}
Response:
{
"id": "q_emails",
"name": "emails"
}
2. Send a job
Enqueue a background job:
POST /v1/jobs
Authorization: Bearer YOUR_RUNZA_API_KEY
{
"queue": "emails",
"payload": {
"user_id": 42,
"template": "welcome"
}
}
Response:
{
"job_id": "job_123",
"status": "queued"
}
3. Worker endpoint
Runza calls your backend when it's time to run the job:
POST https://api.myapp.com/jobs/email
{
"job_id": "job_123",
"payload": {
"user_id": 42,
"template": "welcome"
},
"retry": 0
}
Your backend processes the job. Example in Go:
func EmailJob(w http.ResponseWriter, r *http.Request) {
var req struct {
JobID string `json:"job_id"`
Payload map[string]interface{} `json:"payload"`
}
json.NewDecoder(r.Body).Decode(&req)
userID := req.Payload["user_id"]
sendWelcomeEmail(userID)
w.WriteHeader(http.StatusOK)
}
If the request fails → Runza retries automatically.
4. Schedule jobs
Run jobs on a schedule:
POST /v1/schedules
Authorization: Bearer YOUR_RUNZA_API_KEY
{
"queue": "maintenance",
"cron": "0 * * * *",
"payload": {
"task": "cleanup"
}
}
Runza will run the job every hour.
No cron needed.
5. Webhook queue
Use Runza as a webhook buffer.
Send webhook to Runza:
POST /hook/emails
Runza:
- stores job
- retries on failure
- calls worker
- logs result
Perfect for:
- Stripe webhooks
- Telegram bots
- GitHub webhooks
- integrations
- AI jobs
- stores job
- retries on failure
- calls worker
- logs result
Perfect for:
- Stripe webhooks
- Telegram bots
- GitHub webhooks
- integrations
- AI jobs
6. What Runza replaces
Without Runza you need:
- Redis
- queue library
- workers
- cron
- retries
- logging
- monitoring
With Runza:
- Redis
- queue library
- workers
- cron
- retries
- logging
- monitoring
With Runza:
POST /jobs
Done. No Redis, workers or cron.