> ## Documentation Index
> Fetch the complete documentation index at: https://docs.navisops.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Receive webhooks in Navis Ops workflows

> Trigger Navis Ops workflows from external services using inbound webhooks. Set up a webhook endpoint in your workflow, secure it, and start receiving events.

Navis Ops workflows support inbound webhooks — HTTP endpoints that external services can POST to in order to trigger a workflow run. When a webhook fires, Navis Ops queues the workflow run immediately, and the JSON payload from the request becomes available as variables throughout the workflow. You can also send requests to external services from within a workflow using the HTTP Request action node.

## Setting up an inbound webhook

<Steps>
  <Step title="Create or open a workflow">
    In the Navis Ops sidebar, click **Workflows** and either create a new workflow or open an existing one.
  </Step>

  <Step title="Add a Webhook trigger node">
    In the workflow canvas, click **Add node** and select **Webhook** from the trigger options. Navis Ops generates a unique endpoint URL for this workflow and displays it in the node panel.

    Copy this URL — you will paste it into your external service's webhook configuration.
  </Step>

  <Step title="Secure the endpoint (recommended)">
    In the Webhook trigger node panel, set a value for **Webhook secret**. This is an arbitrary string you choose — for example, a random 32-character alphanumeric value.

    Once set, every inbound request must include an `x-webhook-secret` header with this value. Requests without the correct secret are rejected.

    <Warning>
      Without a webhook secret, anyone who discovers your endpoint URL can trigger your workflow. Always set a secret for production endpoints.
    </Warning>
  </Step>

  <Step title="Paste the endpoint URL into your external service">
    Go to your external service (for example, Stripe, GitHub, or Zapier) and add the Navis Ops webhook URL as a webhook destination. Configure it to POST JSON to that URL.

    If you set a webhook secret, also configure the external service to send it in the `x-webhook-secret` header on every request.
  </Step>

  <Step title="Enable the workflow">
    Make sure the workflow is enabled (the toggle in the top bar is on). Disabled workflows do not process incoming webhook requests.
  </Step>
</Steps>

## How requests are handled

When a POST request arrives at your webhook endpoint:

1. Navis Ops validates the `x-webhook-secret` header (if configured). Mismatched or missing secrets return `403 Forbidden`.
2. The request body is parsed as JSON. If the body is not valid JSON or is empty, Navis Ops proceeds with an empty payload object.
3. Navis Ops responds with `200 OK` immediately — the workflow run is queued and processed asynchronously.
4. The workflow executes with the request payload available as trigger variables.

<Note>
  Navis Ops returns `200 OK` as soon as the workflow is queued, not when it finishes running. Your external service should not rely on the response body for execution results.
</Note>

## Request format

Send a standard HTTP POST with a JSON body and the correct headers:

```bash theme={null}
curl https://<your-supabase-project>.supabase.co/functions/v1/webhook-trigger?endpoint_id=<your-endpoint-id> \
  -X POST \
  -H "Content-Type: application/json" \
  -H "x-webhook-secret: your-secret-value" \
  -d '{
    "event": "payment.succeeded",
    "customer_id": "cus_abc123",
    "amount": 9900
  }'
```

The endpoint accepts any valid JSON structure as the body. Navis Ops does not enforce a schema — your workflow accesses whatever fields you send.

## Accessing payload data in the workflow

The request body is available in the workflow as trigger variables using the `{{trigger.*}}` syntax. See the [Events reference](/api-reference/webhooks/events) for variable path examples and a full walkthrough.

## Sending outbound requests

Workflows can also call external URLs using the **HTTP Request** action node. This lets you:

* Post a message to Slack when a task is created
* Send data to an external API when a project status changes
* Trigger a Zapier webhook from a Navis Ops workflow

The HTTP Request node supports GET, POST, PUT, PATCH, and DELETE methods, custom headers, and variable interpolation in the request body.

## Next steps

<CardGroup cols={1}>
  <Card title="Webhook payload examples and variables" icon="code" href="/api-reference/webhooks/events">
    See how to access trigger variables in your workflow, with real payload examples for common services.
  </Card>
</CardGroup>
