# Connect Flow to n8n

> To send a WhatsApp template from n8n through SkedX Flow: store the Flow API key as an n8n Header Auth credential (name Authorization, value "Bearer sk_flow_…"), then add an HTTP Request node — method POST, URL https://flowserver.skode.ai/api/v1/messages/template/, authentication Generic Credential Type → Header Auth, and a JSON body with to, template_name and variables mapped from earlier nodes. A 200 {"ok": true} means sent. Without a key, POST the same data to a Flow inbound hook address instead. To react to Flow in n8n, add a Webhook node (POST), activate the workflow, and paste its Production URL into Flow’s Settings → Developers → Outbound Webhooks.

Product: SkedX Flow · Topic: APIs & Developers · Draft — steps not yet re-verified in the live product

n8n is where many teams already run their reminders — a class timetable, a form, a spreadsheet. This guide wires it to Flow both ways: an HTTP Request node that sends a WhatsApp template, and a Webhook node that hears back from Flow. About ten minutes, and you need an API key from Flow.

## Step 1: Save your Flow key as an n8n credential

[Create an API key](https://skode.ai/help/flow/developers/create-an-api-key/) in Flow with **Send messages and templates** ticked. In n8n, open **Credentials**, add a **Header Auth** credential and fill it in: **Name** `Authorization`, **Value** `Bearer sk_flow_…` — the word Bearer, one space, then your key. Name it SkedX Flow. The key now lives in n8n’s credential store, not in your workflow.

## Step 2: Add an HTTP Request node

After the node that has your data, add **HTTP Request** and set: **Method** `POST`; **URL** `https://flowserver.skode.ai/api/v1/messages/template/`; **Authentication** Generic Credential Type -> Header Auth -> SkedX Flow; turn on **Send Body**, choose **JSON**, and map your fields into the body. Each blank of the template is one entry in `variables`, in order.

```json
{
  "to": "+91{{ $json.phone }}",
  "template_name": "batch_session_reminder_v1",
  "variables": ["{{ $json.batch }}", "{{ $json.faculty }}", "{{ $json.time }}",
                "{{ $json.topic }}", "{{ $json.link }}"],
  "callback_data": "{{ $json.batch }}-reminder"
}
```

## Step 3: Run it once, to your own number

Point `to` at your own number and click **Execute step**. The node’s output shows `"ok": true` and an `id` — the template is on its way. Anything else shows an `error` that names the fix: [Flow API errors](https://skode.ai/help/flow/developers/flow-api-errors/).

## Step 4: Rather not store a key? Call an inbound hook

Create an [inbound hook](https://skode.ai/help/flow/developers/inbound-hooks-send-without-code/) in Flow, paste one example of what n8n sends, and let Flow map it — phone to Phone, the rest to the template’s blanks. Then the HTTP Request node needs only **Method** `POST`, the hook’s address as **URL**, and your data as the JSON body — no credential. Add a secret header before real traffic ([how](https://skode.ai/help/flow/developers/secure-an-inbound-hook/)).

## Step 5: Hear back from Flow: a Webhook node

Start a new workflow with a **Webhook** node, set **HTTP Method** to `POST`, and copy its **Production URL**. In Flow, open **Settings -> Developers -> Outbound Webhooks**, click **+ New webhook**, give it a name, paste n8n’s address under **Where should we send it?** and click **Create**; then open it and tick the events you want — for example A customer sends a message. Activate the workflow: n8n answers on its production address only while the workflow is active.

## Step 6: Check each delivery is genuine

Flow signs every delivery. If the workflow changes anything — updates a record, sends a reply — check the signature first, on the exact bytes received: in the Webhook node’s options turn on **Raw Body**, then follow [Check that a webhook really came from Flow](https://skode.ai/help/flow/developers/check-a-webhook-came-from-flow/).

## Common questions

### My numbers are saved without +91. Do I need to change them?

No — add it in the body, as in the example: `"+91{{ $json.phone }}"`. Flow sends to exactly the digits it gets and never adds a country code, so without it the message can’t be delivered.

### Can one node send to many people?

Yes: n8n runs the HTTP Request node once per item, so a list of 200 students is 200 sends, each with its own blanks. Every send is charged to the messaging wallet — test with a list of one first.

### I used Interakt from n8n. What changes?

The URL, the key and a flatter body. [Move your API calls from Interakt](https://skode.ai/help/flow/developers/move-your-api-calls-from-interakt/) maps every field.

### Where do customers’ replies go?

Into Flow’s inbox, like any conversation. To have them reach n8n too, add A customer sends a message to your [outbound webhook](https://skode.ai/help/flow/developers/outbound-webhooks/) (step 5).

## Useful links
- API Keys in Flow — create the key n8n will use: https://flow.skode.ai/settings/api-keys/
- Flow API reference — every field of the template request: https://flow.skode.ai/docs/
- n8n: HTTP Request node — n8n’s own documentation: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/
- n8n: Webhook node — n8n’s own documentation: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/

Videos and screenshots © 2026 SkedX, with sample data only. Share and link to them freely; copying the SkedX product or its design is not allowed. Terms: https://skode.ai/terms/

## Related guides
- Move your WhatsApp API calls from Interakt to Flow: https://skode.ai/help/flow/developers/move-your-api-calls-from-interakt/
- Send WhatsApp templates without code, using an inbound hook: https://skode.ai/help/flow/developers/inbound-hooks-send-without-code/
- Connect Flow to Zapier: https://skode.ai/help/flow/developers/connect-flow-to-zapier/
- Get notified with outbound webhooks: https://skode.ai/help/flow/developers/outbound-webhooks/

Source: https://skode.ai/help/flow/developers/connect-flow-to-n8n/