Skip to content

How to send any webhook to a Slack channel

Slack's incoming webhooks only accept Slack's format. Receive any app's webhook, turn its fields into a readable message, and post it to a channel. No code.

Updated

Slack's incoming webhooks are a simple way to post into a channel, but they only accept Slack's own format: a JSON body with a text field (or Slack blocks). Most apps send their own JSON instead, like an order, an alert or a form answer, and Slack rejects it or posts something unreadable. This guide puts a small workflow in between: it receives any webhook, builds a clear message from the fields you pick, and posts it to the channel.

  1. Trigger

    When a webhook is received

    Foliot gives you a URL that accepts any JSON, form or text body.
  2. Step 1

    Post to Slack

    New order from Trigger → customer for $Trigger → total
The workflow you'll build: any JSON in, a readable Slack message out.

Before you start

  • A Foliot account. The free plan is enough to build and test this.
  • A Slack workspace where you're allowed to add apps, and the channel to post in.
  • The app that sends the webhook, or curl to send a test yourself.

Create a Slack incoming webhook

Foliot posts through a Slack incoming webhook, a secret URL tied to one channel. Following Slack's current steps (Slack docs, checked October 15, 2026):

  1. Go to api.slack.com/apps and create an app for your workspace, or open an existing one.
  2. In the app's settings, open Incoming Webhooks and turn on Activate Incoming Webhooks.
  3. Click Add New Webhook to Workspace, choose the channel, and authorize. For a private channel, you need to be a member of it first.
  4. Copy the new URL. It starts with https://hooks.slack.com/services/ and works like a password, so keep it private.

Set it up in Foliot

1. Create the workflow and pick the webhook trigger

Create a new workflow and choose When a webhook is received. Copy its URL (it looks like https://usefoliot.com/api/hooks/…) into the app that sends the webhook. This is the URL your app calls, not the Slack one.

2. Send one sample request

While the workflow is off, requests are saved as sample data instead of running. Click Get sample data, then trigger a test from your app, or send one yourself:

curl -X POST https://usefoliot.com/api/hooks/YOUR-TOKEN \
  -H "Content-Type: application/json" \
  -d '{"customer": "Ada Lovelace", "total": 49, "items": 3, "url": "https://shop.example.com/orders/1042"}'

3. Add the Post to Slack step

Click + after the trigger and choose Post to Slack. Under Slack connection, choose + Add a Slack webhook… and paste the URL from Slack. (You can also add it on the Connections page under Slack webhooks, then pick it here.) Foliot stores the URL encrypted and never shows it in run history.

Then write the Message, picking data from the webhook where you need it:

*New order* from [Trigger → customer]
$[Trigger → total] for [Trigger → items] items
<[Trigger → url]|Open the order>

The bracketed parts are data chips you pick with the data button. Slack formatting works in the message: *bold*, _italic_ and links written as <https://example.com|text>.

4. Test the step, then turn the workflow on

Test this step posts the message for real, so check the channel. When it looks right, switch the workflow on. From then on, each webhook becomes a Slack message within a few seconds, and the sender gets a 202 reply right away.

Useful variations

Only post what matters

A Filter step before Slack keeps the channel quiet: “Only continue if Trigger → total is greater than 100”. Webhooks that don't match end as “Filtered out”.

Different channels for different events

Each Slack webhook posts to one channel. Add one webhook per channel, then use a Branch step: urgent events go down the Yes path to #alerts, everything else down the No path to #activity.

Turn a messy payload into a tidy message

A Code step can format what Slack shows: convert cents to dollars, join a list of item names, or shorten a long description. It returns a value that the Slack message can use.

Keep a record as well

Add Add row to Google Sheets after the Slack step to log every event in a spreadsheet. See webhook to Google Sheets.

Good to know

  • Foliot posts a text message with Slack formatting. It doesn't send Slack blocks, buttons or files, and it can't read messages or reply in threads.
  • The webhook URL accepts POST requests with bodies up to 256 KB, up to 60 a minute per workflow.
  • Each webhook is one run. The free plan includes 500 runs a month; Pro includes 10,000 for $12 a month.

Other ways to do it

  • Send to Slack directly. If the sending app lets you choose the JSON it sends, or it has a Slack integration of its own, post straight to the Slack webhook. No middle step needed.
  • A small script. An endpoint of your own that reformats the payload and calls the Slack webhook. Flexible, but you host and maintain it.
  • Slack's own automation. Slack's Workflow Builder can automate work that starts and ends inside Slack. Check what your Slack plan includes if your whole job lives there.

Questions

Why does my app's webhook not work with a Slack incoming webhook URL?

Slack incoming webhooks expect a JSON body with a text field (or Slack blocks). Most apps send their own JSON, which Slack can't display. A workflow in between can receive the app's JSON and post a message built from its fields.

Can I format the Slack message?

Yes. The message supports Slack formatting such as *bold*, _italic_ and links written as <https://example.com|text>, plus any fields from the webhook.

Can I post to more than one channel?

Each Slack incoming webhook posts to one channel. Add a webhook per channel in Foliot, then use a Branch step or several Post to Slack steps.

Is it free?

Foliot's free plan includes 500 runs a month and 5 active workflows. Each incoming webhook is one run. Pro is $12 a month for 10,000 runs.