Stop running cron in your database.
Move scheduled jobs out of pg_cron and Edge Functions. Keep Supabase.
Why it breaks
Why pg_cron and Edge Functions break at scale
pg_cron jobs that fail just fail. No retries. No alerts. No logs.
Edge Functions on a schedule timeout at 50 seconds.
No durable state between runs. Each run starts cold.
Database load spikes when scheduled jobs fan out.
Coexistence
What you keep
Supabase as your database. Rotor reads and writes through your API.
Your auth, RLS, and realtime. Untouched.
Your Edge Functions for sync work. Rotor handles the async parts.
Upgrade
What changes
Scheduled work moves out of the database. The DB stays a database.
Long-running jobs. Up to 5 minutes per step. Multi-step workflows.
Retries that work. State that survives crashes. Logs you can search.
Together
How they work together
Rotor is built on Supabase. You can be too.
Connect your Supabase project as a Rotor connection.
Workflows read and write to your tables. The vault holds the keys.
How Rotor compares to Supabase pg_cron
| Feature | Rotor | Supabase pg_cron |
|---|---|---|
| Retry on failure | Yes | No |
| Step-level state | Yes | No |
| External API calls from steps(pg_cron is SQL-only; external calls need pg_net or Edge Functions) | Yes | No |
| Encrypted secrets vault | Yes | No |
| Searchable run history | Yes | No |
| MCP callable in production | Yes | No |
| Keep Supabase as your database | Yes | Yes |
Rotor
YesSupabase pg_cron
NoRotor
YesSupabase pg_cron
NoRotor
YesSupabase pg_cron
NoRotor
YesSupabase pg_cron
NoRotor
YesSupabase pg_cron
NoRotor
YesSupabase pg_cron
NoRotor
YesSupabase pg_cron
YesThe math
| Volume | Rotor | Supabase pg_cron |
|---|---|---|
| Basic scheduling | $9/moHobby | Supabase Pro required for pg_cron ($25/mo) |
30-day money back on any Rotor plan.
Switch in an afternoon
Identify what your pg_cron job does
Move that logic into a TypeScript Rotor workflow function
Point it at your Supabase DB using step.run() with your existing Supabase client
Move DB credentials to the Rotor vault
Disable the pg_cron job after confirming Rotor runs correctly
Deploy with npx rotor@latest init