How to Trigger an n8n Workflow on a Custom Schedule with Cronhooks

Rameez R.

Short answer: Add a Webhook node as the trigger in your n8n workflow, copy the production webhook URL, then create a recurring schedule in Cronhooks pointing at that URL. Cronhooks calls it on any cron schedule you define. Your n8n workflow runs on time, every time — even if your n8n instance had a blip, Cronhooks keeps the schedule authoritative.


Why use Cronhooks instead of n8n's built-in Schedule Trigger?

n8n has a native Schedule Trigger node. For many workflows it's perfectly fine. But there are real situations where an external scheduler like Cronhooks is the better choice:

If you're self-hosting n8n: The built-in scheduler only fires if your n8n instance is up and healthy at the exact scheduled time. If the process restarted, the container rebooted, or there was a brief outage — the job is silently skipped. Cronhooks runs independently of your infrastructure, so the trigger always happens.

If you want execution logs and failure alerts: n8n doesn't notify you when a scheduled workflow doesn't run. Cronhooks logs every execution attempt with the HTTP response, and sends you an email or Slack alert on failure.

If you need sub-minute precision or complex schedules: Running the same workflow at different times on different days, or coordinating multiple workflows from a single schedule source, is easier to manage in Cronhooks than across multiple n8n trigger nodes.

If you want to trigger n8n from another system: A Cronhooks webhook can be fired manually, by another service, or on a schedule — giving you one consistent way to invoke n8n workflows regardless of the trigger source.


What we'll build

An n8n workflow triggered on a reliable external schedule. The example is a nightly database backup workflow — querying a Postgres database, writing the result to an S3 bucket, and posting a confirmation to Slack. The same pattern applies to any n8n workflow you've built:

  • Scheduled data sync between two systems
  • Periodic report generation and delivery
  • Nightly cleanup or archiving workflows
  • Regular API polling jobs
  • Automated social media posting

Prerequisites

  • An n8n instance — self-hosted or n8n Cloud
  • A Cronhooks account — free tier works for testing
  • An existing n8n workflow, or follow along to create one

Step 1: Add a Webhook trigger to your n8n workflow

Open your workflow in n8n. If it has an existing trigger node (Schedule Trigger, or any other), you'll replace it. If you're starting fresh, this will be your first node.

  1. Click Add first step (or delete your existing trigger and add a new node)
  2. Search for Webhook
  3. Select the Webhook node
  4. Configure it:
    • HTTP Method: POST
    • Path: give it a descriptive path, e.g. nightly-backup
    • Authentication: Header Auth (recommended — see Step 3)
    • Respond: Immediately (so Cronhooks gets a fast 200 response)

Your production webhook URL will be:

https://your-n8n-instance.com/webhook/nightly-backup

For n8n Cloud it looks like:

https://your-username.app.n8n.cloud/webhook/nightly-backup

Test vs Production URLs: n8n gives you two webhook URLs. The test URL (/webhook-test/) only works while you're actively in the editor with the workflow in test mode. Always use the production URL (/webhook/) in Cronhooks — it works whenever your workflow is active.


Step 2: Build out your workflow

With the Webhook node as your trigger, add the rest of your workflow nodes. For the nightly backup example:

  • Postgres → Execute QuerySELECT * FROM orders WHERE created_at > NOW() - INTERVAL '24 hours'
  • AWS S3 → Upload — write the result as a JSON file to your backup bucket
  • Slack → Send Message — post a confirmation with the row count and S3 path

The Webhook node passes the full Cronhooks request body as data available to downstream nodes via {{ $json.body }}.

Once your workflow is built, activate it using the toggle in the top-right of the editor. A workflow must be active for its production webhook URL to respond.


Step 3: Secure the webhook with Header Auth

Since your n8n webhook URL is publicly reachable, you should restrict who can trigger it. The cleanest way is n8n's built-in Header Auth credential.

In the Webhook node, set Authentication to Header Auth, then create a new credential:

Field Value
Name X-Cronhooks-Secret
Value any-long-random-string-you-choose

Save the credential. n8n will now reject any request that doesn't include this header with the exact value. You'll add the same header to your Cronhooks schedule in the next step.


Step 4: Create a recurring schedule in Cronhooks

Log in to Cronhooks and create a new schedule.

Webhook URL:

https://your-n8n-instance.com/webhook/nightly-backup

Method: POST

Headers:

Name Value
X-Cronhooks-Secret your-long-random-string
Content-Type application/json

Body (optional):

You can pass metadata to your n8n workflow that's available as variables inside the Webhook node:

{
  "trigger": "cronhooks",
  "job": "nightly-backup",
  "environment": "production"
}

This is useful if one webhook URL handles multiple job types — your n8n workflow can branch based on {{ $json.body.job }}.

Schedule: Recurring

Cron expression: 0 1 * * * (every night at 1:00 AM UTC)

Timezone: Select your timezone — Cronhooks handles the UTC offset.

Click Save.


Common cron expressions for n8n workflows

Schedule Cron expression
Every night at 1am 0 1 * * *
Every day at midnight 0 0 * * *
Every weekday at 8am 0 8 * * 1-5
Every Monday at 6am 0 6 * * 1
Every hour 0 * * * *
Every 30 minutes */30 * * * *
First of every month 0 0 1 * *
Every Sunday at 11pm 0 23 * * 0

Verify your expression at crontab.guru before saving.


Step 5: Test the full flow

In Cronhooks, open your schedule and click Trigger now.

Switch to n8n and open your workflow. Click Executions in the left sidebar to see the execution history. You should see a new execution appear with status Success.

Click the execution to inspect it — confirm the Webhook node received the payload and each downstream node ran as expected.

If the execution doesn't appear: - Confirm your workflow is active (not just in test/edit mode) - Check you're using the production URL (/webhook/) not the test URL (/webhook-test/) - Check the X-Cronhooks-Secret header value matches exactly what you set in the n8n credential - Check n8n's logs for any auth rejection: journalctl -u n8n on a self-hosted instance


Self-hosted n8n: extra reliability considerations

If you're running n8n yourself, a few things are worth knowing:

Process restarts: If n8n restarts between a Cronhooks trigger and the webhook being received, the request will fail. n8n queues incoming webhook requests in most configurations, so brief restarts usually recover gracefully. For zero-tolerance jobs, consider running n8n in a container with a restart policy (restart: always in Docker Compose).

Reverse proxy timeouts: If n8n sits behind nginx or Caddy, make sure your proxy timeout is longer than the time your workflow takes to complete. With the Webhook node set to Respond: Immediately, n8n returns 200 before the workflow finishes, so this is usually not an issue.

Webhook URL on private networks: If your n8n instance is on a private network or VPN, Cronhooks won't be able to reach it. Either expose the webhook endpoint via a reverse proxy with a public domain, or use a tunnelling tool like Cloudflare Tunnel during development.


Frequently asked questions

Does this work with self-hosted n8n?

Yes. As long as your n8n webhook URL is publicly reachable (or accessible to Cronhooks), this works identically for self-hosted and n8n Cloud.

What's the difference between the test URL and the production URL in n8n?

The test URL (/webhook-test/path) only accepts one request at a time while you're in the workflow editor with listening mode active. The production URL (/webhook/path) is always active when the workflow is turned on. Always use the production URL in Cronhooks.

Can I trigger multiple n8n workflows from one Cronhooks schedule?

Not directly — one Cronhooks schedule calls one URL. But you can build a single n8n workflow that acts as an orchestrator: trigger it from Cronhooks, then use Execute Workflow nodes to fan out and run multiple sub-workflows in parallel.

What happens if my n8n instance is down when Cronhooks fires?

Cronhooks will receive a connection error or timeout and log it as a failed execution. You'll get an alert immediately. This is one of the key advantages of Cronhooks over n8n's built-in scheduler — you know when the trigger failed, rather than silently missing a run.

Can I pass different data to the same workflow on different schedules?

Yes. Create multiple Cronhooks schedules pointing at the same webhook URL, each with a different JSON body. Use an IF or Switch node in n8n to branch based on {{ $json.body.job }} or any other field you pass.

My workflow is active but n8n returns 404 on the webhook URL. What's wrong?

The most common cause is using the wrong URL format. Double-check: the path you set in the Webhook node matches the URL you're calling, you're using /webhook/ not /webhook-test/, and your n8n instance URL is correct (including port if self-hosted, e.g. :5678).


Summary

To trigger an n8n workflow on a custom schedule:

  1. Add a Webhook node as the trigger in your n8n workflow, set to POST with Header Auth
  2. Note the production webhook URL (not the test URL)
  3. Activate the workflow
  4. Create a Cronhooks recurring schedule pointing at that URL with your auth header
  5. Click Trigger now to verify the full flow end to end

Cronhooks fires on schedule. n8n executes. You get logs and alerts from both sides.

Start scheduling for free on Cronhooks →


Related guides