Practical guide · 3 minutes

How to create a Slack webhook URL

Six steps from zero to a working https://hooks.slack.com/services/… URL that posts to a channel. With the common errors, what they mean, and how to wire the URL into a Google Form.

The six steps

From nothing to a tested webhook URL

Plan for about 3 minutes start to finish if it's your first time.

  1. 1
    Create a Slack app
    Go to api.slack.com/apps and click Create New AppFrom scratch. Name it (e.g. “Form Notifications”) and pick the Slack workspace it lives in. The app is just a container; nothing posts yet.
  2. 2
    Enable Incoming Webhooks
    In the app's left sidebar, click Incoming Webhooks. Toggle Activate Incoming Webhooks to On. That unlocks the “Add New Webhook to Workspace” button at the bottom of the page.
  3. 3
    Add a webhook to a workspace and pick the channel
    Click Add New Webhook to Workspace. Slack asks you to authorise the app and pick a channel — private channels work too, but you need to be a member. This is the channel every POST to this URL will land in. Click Allow.
  4. 4
    Copy the webhook URL
    Slack drops you back on the Incoming Webhooks page with a new row in the Webhook URLs table. Click Copy. The URL looks like https://hooks.slack.com/services/T.../B.../<long-random>. Treat it like a password — anyone with it can post to that channel.
  5. 5
    Test it
    Paste the URL into the Slack Webhook Tester and click Send test to Slack. If you see the test message in your channel within a second, the URL works. If you see HTTP 404 / no_service, you copied a stale URL — regenerate from step 4.
  6. 6
    Wire it into a Google Form
    Two options. Free DIY: paste the URL into the Google Forms to Slack Generator and copy the emitted Apps Script into your form. Managed: paste it into RouteForms and add routing rules so different answers go to different channels, with a delivery log and retries on failure.
Common errors

When the URL doesn't work

  • HTTP 404 / no_service / no_team — the URL was revoked, deleted, or never existed at that path. Regenerate the webhook (step 4 above) and grab the new URL.
  • HTTP 403 / invalid_token — Slack rejected the request as unauthorised. Re-create the webhook from the Incoming Webhooks page; the old one is dead.
  • HTTP 400 / invalid_payload — the URL is good but your request body is wrong. Almost always a missing Content-Type: application/json header or malformed JSON.
  • HTTP 400 / invalid_blocks— Slack accepted the request but couldn't render the blocks. Use the Block Kit payload generator to build a known-good shape.
  • HTTP 429— you're sending too fast. Back off and retry.
  • Timeout— the request couldn't reach Slack. If only one machine times out, check that machine's outbound network. If everyone times out, Slack status page.

The Slack Webhook Tester translates each of these into plain English so you don't have to memorise Slack's error vocabulary.

What the URL is and isn't

A quick mental model

A Slack webhook URL is a destination, not a channel and not a user. The URL embeds:

  • The workspace — the part starting with T....
  • The app — the part starting with B....
  • A secret — the trailing path segment that authorises the POST.
  • The channel — bound at creation time, not visible in the URL itself.

Revoke a URL by deleting its row on the Incoming Webhooks page. A new POST to the revoked URL returns no_service.

FAQ

Frequently asked questions

What is a Slack webhook URL?

It's an HTTPS URL Slack hands you that accepts a POST request and posts the body to a specific Slack channel as a message. The format is https://hooks.slack.com/services/T.../B.../<secret>. Anyone with that URL can post to that channel, so treat it like a password.

Where do I get a Slack webhook URL?

From the Incoming Webhooks settings of a Slack app you own (or create) in your workspace. You can't get one from Slack's main UI — it requires creating an app at api.slack.com/apps, enabling Incoming Webhooks, and adding the webhook to a specific channel. The steps below walk you through it in 3 minutes.

Can I create a Slack webhook URL without admin permissions?

Usually yes. Slack's default workspace setting lets any member create apps. If your workspace's admin has restricted app creation, you'll see 'App approvals required' when you try — ask your admin to approve the app or to do step 1 for you. Once the app exists, anyone added as a collaborator can manage its webhooks.

Can I change which channel a webhook URL posts to?

No, the channel is baked into the URL at creation time. If you want a different channel, create a new webhook (and a new URL) bound to it. You can have many webhooks per app, one per channel. (Legacy 'custom integration' webhooks supported a channel override field — those have been deprecated by Slack.)

Can a Slack webhook URL be reused across multiple forms?

Yes. The URL just accepts POSTs — there's nothing tying it to one source. You can hand the same URL to multiple Google Forms, multiple Apps Scripts, multiple servers. Just be aware that revoking the URL (because one source leaked it) takes them all down at once.

Is the webhook URL a secret?

Effectively yes. Anyone who has it can post to the channel — including your competitors, ex-employees, or anyone who scraped a public commit. Never put a webhook URL in client-side JavaScript or a public GitHub repo. Slack will automatically revoke webhooks it sees in public commits, but don't rely on that.

What if my webhook URL stops working?

Three things to check, in order. (1) Slack returns 'no_service' or 'no_team' — the URL was revoked or the app was deleted. Regenerate from your app's Incoming Webhooks page. (2) Slack returns 'invalid_payload' — your JSON shape is wrong. Use the Slack Webhook Tester with Simple mode to confirm the URL itself works. (3) The request times out — something between you and Slack is broken; check from a different network.

How do I connect my Slack webhook to Google Forms?

Three options. (1) Free, DIY: paste the URL into the Google Forms to Slack Generator, copy the emitted Apps Script into your form. (2) Managed: paste the URL into RouteForms, and form responses route to Slack with conditional rules, retries, and a delivery log. (3) Roundabout: Zapier or Make.com — works but adds per-task billing. See the comparison on the /google-forms-to-slack hub page.

Got a working webhook URL? Now wire it to a Google Form.

The Google Forms to Slack Generator emits the Apps Script that POSTs every response to your webhook. Or use RouteForms for routing rules, retries, and a delivery log on top — free for 30 responses a month.