Add an HTTP Request node to the workflow that already handles this, at the start, and again at the finish.
Decide where this node goes: right after the very first step of the scenario, before any of the real work happens.
Open the n8n workflow you want to monitor and add an HTTP Request node at that point.
Authentication: set to None. FlowProofs authenticates via the header you add below, not n8n's built-in credential system.
Request Method: set to POST.
URL: paste this in.
https://flowproof-ok3mquge8-hitenbs-projects.vercel.app/api/v1/events
Send Query Parameters: leave off.
Send Headers: turn on. Add a header named Authorization with value:
Bearer fp_live_YOUR_API_KEY
Send Body: turn on. Set Body Content Type to JSON, and Specify Body Using to JSON.
JSON body: paste the template below, then map your own fields into external_id and match (see the table underneath).
{
"flow": "your-flow-slug",
"endpoint": "source",
"external_id": "USE-YOUR-OWN-REFERENCE",
"match": {
"phone": "+15551234567"
}
}| Key | What it is | What to replace with |
|---|---|---|
| flow | Your flow's identifier | Leave as shown |
| endpoint | Which side of the run this is | "source" for the start ping, "destination" for the finish ping |
| external_id | Unique reference for this specific run | A row ID, order ID, or unique field from the incoming data. Use the tool's variable syntax. |
| match | Fields used to pair start and finish pings | Include whichever unique identifier is available (email, phone, order_id). Use the tool's variable syntax. |
n8n references a previous node's output with {{ $json.fieldname }}. For example:
"external_id": "{{ $json.row_id }}",
"match": { "email": "{{ $json.email }}" }"external_id": "{{ $json.order_id }}",
"match": { "phone": "{{ $json.phone }}" }Under Options, add Response: set Response Format to JSON, and leave Never Error off, so a real failure still surfaces in the workflow.
Save the workflow, then Activate it.
You'll add TWO of these nodes total: one BEFORE the work step with endpoint: source, and one AFTER the work step with endpoint: destination. They share the same external_id so FlowProofs can pair them.
START OF YOUR FLOW | +--> FlowProofs HTTP Request node (endpoint: source) <- add this first | v ...your existing steps, untouched... | +--> FlowProofs HTTP Request node (endpoint: destination) <- add this last v END OF YOUR FLOW
Execute the workflow once (or trigger it for real). Return to FlowProofs. The pending indicator turns green when your first ping arrives.
Screenshot placeholder
n8n HTTP Request node configuration panel
drop a PNG at /public/docs/n8n-http-request-node.png
Decide where this node goes: right after the very last step, once the record has actually landed where it should.
Open the n8n workflow you want to monitor and add an HTTP Request node at that point.
Authentication: set to None. FlowProofs authenticates via the header you add below, not n8n's built-in credential system.
Request Method: set to POST.
URL: paste this in.
https://flowproof-ok3mquge8-hitenbs-projects.vercel.app/api/v1/events
Send Query Parameters: leave off.
Send Headers: turn on. Add a header named Authorization with value:
Bearer fp_live_YOUR_API_KEY
Send Body: turn on. Set Body Content Type to JSON, and Specify Body Using to JSON.
JSON body: paste the template below, then map your own fields into external_id and match (see the table underneath).
{
"flow": "your-flow-slug",
"endpoint": "destination",
"external_id": "USE-YOUR-OWN-REFERENCE",
"match": {
"phone": "+15551234567"
}
}| Key | What it is | What to replace with |
|---|---|---|
| flow | Your flow's identifier | Leave as shown |
| endpoint | Which side of the run this is | "source" for the start ping, "destination" for the finish ping |
| external_id | Unique reference for this specific run | A row ID, order ID, or unique field from the incoming data. Use the tool's variable syntax. |
| match | Fields used to pair start and finish pings | Include whichever unique identifier is available (email, phone, order_id). Use the tool's variable syntax. |
n8n references a previous node's output with {{ $json.fieldname }}. For example:
"external_id": "{{ $json.row_id }}",
"match": { "email": "{{ $json.email }}" }"external_id": "{{ $json.order_id }}",
"match": { "phone": "{{ $json.phone }}" }Under Options, add Response: set Response Format to JSON, and leave Never Error off, so a real failure still surfaces in the workflow.
Save the workflow, then Activate it.
You'll add TWO of these nodes total: one BEFORE the work step with endpoint: source, and one AFTER the work step with endpoint: destination. They share the same external_id so FlowProofs can pair them.
START OF YOUR FLOW | +--> FlowProofs HTTP Request node (endpoint: source) <- add this first | v ...your existing steps, untouched... | +--> FlowProofs HTTP Request node (endpoint: destination) <- add this last v END OF YOUR FLOW
Execute the workflow once (or trigger it for real). Return to FlowProofs. The pending indicator turns green when your first ping arrives.
Screenshot placeholder
n8n node placed right after the destination step, workflow activated
drop a PNG at /public/docs/n8n-workflow-activated.png