Platform guide
Create a receipt from n8n
Use one HTTP Request node to send a workflow run to Automation Receipts and create a readable receipt.
Start with safe example data
Confirm that n8n can create a receipt before you connect real emails, tickets, documents, customers, or actions. Approval is optional and may happen in Automation Receipts, n8n, Slack, email, another tool, or not be required.
Use the starter workflow
Import the starter JSON into n8n, then add your own API key and endpoint URL before running it.
Use the callback starter workflow
Import this optional example when you want Automation Receipts to send a saved review result back to n8n. Add your own API key before running it.
What you need
Automation Receipts access
Use an active account and an active API key. The key is sent in the Authorization header.
An n8n workflow
For the first test, use Manual Trigger, Edit Fields, and HTTP Request nodes.
Basic workflow shape
This is the first test path. It proves n8n can create a receipt before you connect the same pattern to a production workflow.
Manual Trigger
->
Edit Fields
->
HTTP Request
->
Receipt appears in Automation Receipts
Manual Trigger
Run the workflow by hand while you set up the first receipt.
Edit Fields
Create example values that the HTTP Request node can send.
HTTP Request
POST the JSON body to Automation Receipts.
Receipt
Open the run detail page and confirm the timeline and review state.
HTTP Request settings
- Method
POST- URL
https://automationreceipts.com/api/v1/runs- Body type
- JSON
- Authentication
- Bearer token header
Headers
Authorization: Bearer aar_live_REPLACE_ME
Content-Type: application/json
Use https://automationreceipts.com/api/v1/runs unless your account uses a different workspace or environment endpoint.
Edit Fields values
Most values can be hardcoded strings for the first test. Real workflows should use dynamic n8n expressions where values come from earlier nodes or must change each run, especially run_uid.
Hardcoded first-test value
{
"input_summary": "Customer asked about refund options."
}
Dynamic workflow value
{
"run_uid": "n8n-{{$execution.id}}",
"input_summary": "{{$json.email_summary}}",
"output_summary": "{{$json.ai_reply_summary}}"
}
Make run_uid unique
Automation Receipts rejects duplicate run_uid values within the same workspace. Use an execution ID, timestamp, UUID, or another value that changes every run.
Use exact machine values
Automation Receipts expects exact lowercase machine values for enum fields. Use needs_review, not Needs review; medium, not Medium; pending, not Pending; and n8n, not N8N. Dynamic n8n expressions are fine, but they must resolve to these exact values.
| Field | Valid values |
|---|---|
status | pending, needs_review, approved, rejected, completed, failed, cancelled |
risk_level | low, medium, high, unknown |
approval_status | not_required, pending, approved, rejected, needs_changes |
source_type | n8n, make, ifttt, stackai, zapier, custom_script, manual, other, custom |
| Field | Example value | Type | Notes |
|---|---|---|---|
automation_name | n8n First Receipt | string | Name shown in Automation Receipts. |
run_uid | n8n-first-receipt-{{$execution.id}} | string | Must be unique for each run. |
source_type | n8n | string | Use this for n8n workflows. |
trigger_type | manual_test | string | Good label for a Manual Trigger connection test. |
status | needs_review | string | Use needs_review when the run is waiting on a person. |
risk_level | medium | string | Use medium when the example receipt asks for review. |
input_summary | Manual n8n connection test with sample input. | string | One summary is required. |
output_summary | An example receipt payload was prepared. | string | Keep it short and plain. |
approval_required | true | boolean | Send a JSON boolean, not a quoted string. |
approval_status | pending | string | Use pending when review is requested. |
callback_url | https://example.com/n8n-review-result | string | Optional. Use only when n8n should receive the review result later. |
final_action | No real action taken | string | Be clear about what did or did not happen. |
Keep booleans unquoted
Send false as false, not "false". The string "false" may be treated as truthy by the API and can make approval look required.
Starter payloads
Use the completed example for your first connection test. Use the review example when the workflow output should wait for a recorded review outcome. Keep the wording service-agnostic so receipts make sense even when the workflow later moves beyond n8n.
No review needed
{
"automation_name": "n8n First Receipt",
"run_uid": "n8n-first-receipt-{{$execution.id}}",
"source_type": "n8n",
"trigger_type": "manual_test",
"status": "completed",
"risk_level": "low",
"input_summary": "Manual n8n connection test with sample input.",
"output_summary": "An example receipt payload was sent from n8n to Automation Receipts.",
"model_used": "none",
"tools_used": "Manual Trigger, Edit Fields, HTTP Request",
"approval_required": false,
"approval_status": "not_required",
"final_action": "No real action taken",
"events": [
{
"event_type": "trigger_received",
"event_label": "Manual test started",
"event_summary": "The n8n workflow was started by a Manual Trigger."
},
{
"event_type": "action_taken",
"event_label": "Receipt logged",
"event_summary": "n8n sent an example receipt to Automation Receipts."
}
]
}
Review requested
{
"automation_name": "n8n Review Example",
"run_uid": "n8n-approval-review-{{$execution.id}}",
"source_type": "n8n",
"trigger_type": "manual_test",
"status": "needs_review",
"risk_level": "medium",
"input_summary": "Manual n8n connection test with sample input.",
"output_summary": "A sample draft was created and is waiting for review.",
"model_used": "none",
"tools_used": "Manual Trigger, Edit Fields, HTTP Request",
"approval_required": true,
"approval_status": "pending",
"final_action": "Draft created and waiting for review",
"events": [
{
"event_type": "trigger_received",
"event_label": "Manual test started",
"event_summary": "The n8n workflow was started by a Manual Trigger."
},
{
"event_type": "output_generated",
"event_label": "Sample draft created",
"event_summary": "The workflow prepared sample output for review."
},
{
"event_type": "approval_requested",
"event_label": "Review requested",
"event_summary": "The sample draft is waiting for a review outcome."
}
]
}
Common mistakes
| Problem | What it usually means | Fix |
|---|---|---|
| 400 bad request | The body is not a valid JSON object. | Use JSON body mode and check commas, quotes, brackets, and n8n expressions that may output blank text. |
| 401 unauthorized | The Authorization header is missing, wrong, or uses a revoked key. | Use Authorization: Bearer aar_live_... with the full active API key. |
Missing Bearer | The API key was sent without the expected bearer-token prefix. | Use Authorization: Bearer YOUR_API_KEY, including the space after Bearer. |
| API key in the body | The key was pasted into the JSON payload instead of the header. | Remove it from the body and put it in the Authorization header. |
409 duplicate run_uid | A receipt with that run ID already exists in the workspace. | Use a dynamic value such as n8n-first-receipt-{{$execution.id}}. |
| 422 validation error | A required field is missing or a value is not allowed. | Check automation_name, run_uid, and at least one of input_summary or output_summary. |
Wrong Content-Type | The API did not receive the request as JSON. | Set Content-Type: application/json and use JSON body mode. |
| Manual text where dynamic values are needed | The workflow sends the same value every run. | Use n8n expressions for IDs and any values that should come from the current execution. |
| Empty n8n expressions | An expression such as {{$json.email_summary}} resolves to blank. | Run the previous node and confirm the field exists in its output before using it in the payload. |
| Request does not reach Automation Receipts | The HTTP Request node is pointed at an old, local, or private endpoint. | Use https://automationreceipts.com/api/v1/runs unless your account uses a different endpoint. |
| Payload too large | The JSON body is over 131072 bytes. | Send concise summaries instead of raw emails, documents, or full model payloads. |
| Too much private data | The payload contains full messages, documents, secrets, or private details that are not needed for the receipt. | Send summaries and only the context a person needs to understand what happened. |
| 404 run not found | An append-event request could not find the run. | Use /api/v1/runs/{run_uid}/events with the original run_uid, not numeric run_id. |
Optional: send the review result back to n8n
If your n8n workflow needs to continue after a person records a review in Automation Receipts, include a callback_url when creating the receipt. After the review is saved, Automation Receipts POSTs a small review result payload back to that URL.
Keep this as a second step
First prove the basic receipt path works. Then add a callback URL from the n8n path that should receive the review result. This is useful for Wait/webhook-style continuation patterns, but Automation Receipts does not configure or manage n8n wait nodes for you.
Download the tested callback starter
This workflow uses Manual Trigger, Edit Fields, HTTP Request, a Wait node, and a final Edit Fields node that reads the resumed callback body.
Create-run payload with callback URL
{
"automation_name": "n8n Review Example",
"run_uid": "n8n-approval-review-{{$execution.id}}",
"source_type": "n8n",
"status": "needs_review",
"risk_level": "medium",
"input_summary": "Manual n8n connection test with sample input.",
"output_summary": "A sample draft was created and is waiting for review.",
"approval_required": true,
"approval_status": "pending",
"callback_url": "https://YOUR-N8N-CALLBACK-URL.example/path",
"final_action": "Draft created and waiting for review"
}
The review result payload stays intentionally small. It includes the receipt source, run_uid, automation name, review status, optional review note, review time, and receipt URL. It does not include the full receipt, input summary, output summary, user email, or API key.
Read callback fields after the Wait node
In the tested n8n Wait/webhook resume flow, n8n exposes the Automation Receipts POST body under body after the Wait node resumes.
| Review result | n8n expression |
|---|---|
| Review status | {{$json.body.review_status}} |
| Review note | {{$json.body.review_note}} |
| Receipt URL | {{$json.body.receipt_url}} |
If n8n receives the callback, the receipt records the callback as delivered. If the callback URL fails or times out, the review remains saved and the receipt records the callback failure.
What this does not do yet
Not a workflow builder
This setup creates a readable receipt and can optionally send a review result callback. It does not build the rest of the n8n workflow for you.
There are no callback retries, custom callback headers, callback secrets, or multiple callback URLs in this first pass. Approval or review in Automation Receipts remains optional.
n8n save notes
Depending on your n8n version and account, workflows may autosave. Some node panels do not show a separate Save button. After editing a node, close the node panel and check that the workflow itself is saved or autosaved before running the test again.