How to Run a Zapier Zap on a Custom Schedule with Cronhooks
How to Run a Zapier Zap on a Custom Schedule with Cronhooks
Short answer: Add a Catch Hook (webhook) as the trigger in your Zapier Zap, copy the webhook URL Zapier generates, then create a recurring schedule in Cronhooks pointing at that URL. Cronhooks calls it on any cron schedule you define — every 5 minutes, every weekday at 9am, the first of every month. Your Zap runs exactly when you want, not just when Zapier's scheduler allows.
Why not just use Zapier's built-in Schedule trigger?
Zapier has a native Schedule by Zapier trigger, but it comes with real limitations:
- Minimum interval is 15 minutes on paid plans — no sub-15-minute schedules
- No cron expressions — you can't say "every weekday at 8:45am" or "the last Friday of the month"
- No per-timezone control on some plan levels
- No execution logs — if a scheduled Zap fails silently, you won't know until you notice the work didn't happen
- No failure alerts — Zapier doesn't send a notification when a scheduled Zap doesn't run
Cronhooks replaces the Schedule trigger entirely. You get full cron expression control, per-timezone scheduling, execution history, and instant failure alerts — while Zapier still handles all the integration logic you've already built.
What we'll build
A Zapier Zap triggered on a precise recurring schedule. The example is a daily CRM sync — pulling new leads from a Google Sheet and adding them to HubSpot every morning at 8am. The same pattern applies to any Zap you've already built:
- Sending scheduled digest emails via Gmail or Outlook
- Posting scheduled messages to Slack or Teams
- Syncing data between two apps on a fixed interval
- Generating and sending weekly reports
- Archiving or moving rows in Google Sheets on a schedule
- Triggering AI-powered Zaps (OpenAI, Claude) at specific times
Prerequisites
- A Zapier account (Starter plan or above — Catch Hook requires a paid plan)
- A Cronhooks account — free tier works for testing
- An existing Zap to schedule, or follow along to build one
Step 1: Create a new Zap with a Catch Hook trigger
Open Zapier and create a new Zap (or open an existing one to replace its trigger).
- Click the trigger step
- Search for Webhooks by Zapier
- Select Catch Hook
- Click Continue
- Zapier generates a unique webhook URL — it looks like:
https://hooks.zapier.com/hooks/catch/1234567/abcdefg/
Copy this URL. You'll paste it into Cronhooks shortly.
Important: Do not click "Test trigger" yet. First, set up your Cronhooks schedule and fire a test request — that's what populates the sample data Zapier needs to map fields in the next steps.
Step 2: Build the rest of your Zap
With the Catch Hook as your trigger, add your action steps as normal. For the daily CRM sync example:
- Google Sheets → Get Many Spreadsheet Rows — fetch rows added in the last 24 hours
- Filter by Zapier — only continue if there are new rows
- HubSpot → Create Contact — add each lead to HubSpot
Any data you pass in the Cronhooks request body is available as variables in your Zap from the first step. For example, if you pass:
{
"job": "crm-sync",
"date": "2026-04-28",
"limit": 100
}
You can reference {{1. Job}}, {{1. Date}}, {{1. Limit}} in any downstream step.
Leave the Zap in draft for now — you'll turn it on after testing.
Step 3: Create a recurring schedule in Cronhooks
Log in to Cronhooks and create a new schedule.
Webhook URL:
https://hooks.zapier.com/hooks/catch/1234567/abcdefg/
(paste your actual Zapier webhook URL)
Method: POST
Headers:
| Name | Value |
|---|---|
Content-Type |
application/json |
Body (optional):
Pass contextual data your Zap can use downstream:
{
"job": "crm-sync",
"triggered_by": "cronhooks",
"date": "today"
}
Or leave it empty if your Zap doesn't need input data — Cronhooks will still trigger it on schedule.
Schedule: Recurring
Cron expression: 0 8 * * 1-5
(every weekday at 8:00 AM)
Timezone: Select your timezone — Cronhooks handles the UTC conversion automatically.
Click Save.
Step 4: Test the full flow end to end
In Cronhooks, open your schedule and click Trigger now. This fires the webhook immediately.
Switch to Zapier. Go back to your Catch Hook trigger step and click Test trigger — Zapier should now show the sample payload it received from Cronhooks.
If Zapier shows the data correctly, proceed through your Zap steps, mapping fields as needed. Once everything looks right, turn your Zap on using the toggle in the top right.
Your Zap will now run automatically on your Cronhooks schedule.
If Zapier didn't receive the test payload: - Confirm the webhook URL in Cronhooks is the exact URL Zapier generated - Make sure you're in the Catch Hook trigger step when you click "Test trigger" — Zapier listens for 10 minutes after you click it - Click Trigger now in Cronhooks again while Zapier is listening
Common cron expressions for Zapier Zaps
| Schedule | Cron expression |
|---|---|
| Every weekday at 8am | 0 8 * * 1-5 |
| Every day at midnight | 0 0 * * * |
| Every Monday at 9am | 0 9 * * 1 |
| Every hour | 0 * * * * |
| Every 15 minutes | */15 * * * * |
| Every 5 minutes | */5 * * * * |
| Twice daily (8am and 6pm) | 0 8,18 * * * |
| First of every month | 0 0 1 * * |
| Last Friday of the month | 0 17 * * 5#5 |
Not sure about your expression? Paste it into crontab.guru to verify it in plain English.
Can you secure a Zapier webhook?
Unlike n8n or a custom API endpoint, Zapier's Catch Hook doesn't natively support request authentication — it accepts any POST request to its URL. The URL itself is long and random, which provides basic security through obscurity.
For most use cases this is acceptable. But if your Zap performs sensitive actions, here are your options:
Option 1: Treat the URL as a secret Never share the Zapier webhook URL publicly. Store it only in Cronhooks. Regenerate it in Zapier if you suspect it's been exposed.
Option 2: Validate inside the Zap
Add a Filter by Zapier step immediately after the Catch Hook:
- Condition: {{1. Secret}} exactly matches your-expected-value
- If the filter fails, the Zap stops
In Cronhooks, pass "secret": "your-expected-value" in the request body. This is lightweight but effective.
Option 3: Use a Paths step to handle unexpected payloads Add a Paths by Zapier step that routes unknown or unsigned requests to a "do nothing" path, preventing any actions from running.
Running the same Zap on multiple different schedules
One of the most powerful patterns with Cronhooks is creating multiple schedules pointing at the same Zapier webhook, each passing a different job type in the body.
For example, one Zap handles three different jobs:
Cronhooks schedule 1 — runs every morning at 7am:
{ "job": "daily-digest" }
Cronhooks schedule 2 — runs every Monday at 8am:
{ "job": "weekly-report" }
Cronhooks schedule 3 — runs first of every month:
{ "job": "monthly-invoice-sync" }
Inside the Zap, add a Paths by Zapier step that branches on {{1. Job}}. Each path handles a different job. One Zap, three schedules, zero duplication.
One-off scheduling: trigger a Zap at a specific future time
Cronhooks also supports one-off schedules — fire once at a specific date and time, then never again. This is useful for:
- Sending a Zap-triggered email at a specific future time
- Running a Zap once after a delay (e.g. 48 hours after a customer signs up)
- Scheduling a Zap to run during a planned maintenance window
- Future-dating a content or social media publishing Zap
When creating the schedule in Cronhooks, select Once instead of Recurring and pick the exact datetime. Cronhooks fires the webhook at that time and marks the schedule complete.
Frequently asked questions
Does Webhooks by Zapier require a paid plan?
Yes. The Catch Hook trigger is part of Webhooks by Zapier, which requires a Zapier Starter plan or above. It's not available on the free plan.
What's the minimum interval I can schedule a Zap to run?
With Cronhooks, you can trigger a Zap as frequently as every minute (* * * * *). Zapier itself has no minimum interval for webhook-triggered Zaps — the rate limit depends on your Zapier plan's task limits, not the trigger type.
My Zap ran but no tasks were used in Zapier. Why?
Zapier only counts tasks when a Zap's action steps run successfully. If your Zap has a Filter step that stops execution before the action, no tasks are consumed. This is expected behaviour — it's not a bug.
Can I pass the current date dynamically from Cronhooks?
Cronhooks sends a fixed JSON body defined when you create the schedule. For a dynamic current date, generate it inside your Zap using Zapier's built-in {{zap_meta_human_now}} variable in a Formatter step, rather than passing it from Cronhooks.
What happens if Zapier is down when Cronhooks fires?
Cronhooks will receive a non-2xx response or timeout and log it as a failed execution. You'll get an email or Slack alert immediately. Once Zapier recovers, you can manually re-trigger the schedule from Cronhooks with one click.
Can I use Cronhooks to trigger a Zap that's currently paused?
No. A paused or turned-off Zap won't respond to incoming webhooks. Make sure your Zap is turned on before relying on Cronhooks to trigger it.
Can I see what data Cronhooks sent to my Zap?
Yes — from both sides. In Cronhooks, check the execution history for the full request payload and response. In Zapier, check the Zap's run history for the exact data received by the Catch Hook trigger.
Summary
To run a Zapier Zap on a custom schedule:
- Add Webhooks by Zapier → Catch Hook as your Zap's trigger
- Copy the webhook URL Zapier generates
- Build your Zap's action steps and turn it on
- Create a Cronhooks recurring (or one-off) schedule pointing at that URL
- Click Trigger now in Cronhooks to test end to end
From that point, Cronhooks fires on your cron schedule, Zapier executes the Zap, and you get execution logs and failure alerts from Cronhooks — something Zapier's built-in scheduler never gave you.
Start scheduling your Zaps for free on Cronhooks →