Webhooks: Complete Field Reference (Practical Guide)
This article walks you through every outbound webhook Neuro can fire, what each payload looks like, and how to consume them safely in your own systems. It’s designed to be information‑dense but approachable, with step‑based guidance and ready‑to‑paste payload examples.
Last updated About 5 hours ago

Welcome to Webhooks in Neuro
Webhooks are Neuro’s way of tapping you on the shoulder the moment something important happens.
Instead of repeatedly polling our API to find out whether an order has arrived, a fulfilment has been created, or stock has changed, webhooks let Neuro push that information straight into your systems in real time. You give us a URL; we send you rich JSON payloads whenever key events occur across orders, fulfilments, products, and invoices.
This makes life easier in a few very practical ways:
You keep external systems perfectly in sync without writing brittle polling jobs or cron tasks.
You can trigger downstream workflows instantly – update your WMS, notify a 3PL, create accounting entries, or send internal alerts the moment data changes.
You get a consistent, well‑structured payload shape for each entity type, so parsing and mapping data is predictable and repeatable.
This page is your complete field reference for those payloads. For every webhook we fire, you’ll find the event name, when it triggers, the JSON body you can expect, and a description of each field so you can confidently validate, transform, and use the data in your own applications and integrations.

1. Webhook Events at a Glance
Neuro emits outbound webhooks whenever key entities change. Each event always sends a full snapshot of the entity at that moment, not a diff.
Item limits:
Order events include up to 150 items per payload, product events up to 250. Larger orders/products are split into multiple webhook calls.

2. Orders Received (orders.received)
Fired when a new order is imported from a channel into Neuro. Order webhooks all share the same Order payload shape. Only the triggering context differs.
2.1 Example: `orders.received` Payload
Triggered when a new order is imported into Neuro.
Payload: Order
{
"webhook_id": "a1b2c3d4-0000-0000-0000-000000000001",
"order_id": "f7e6d5c4-1111-2222-3333-444444444444",
"channel_id": "c1d2e3f4-aaaa-bbbb-cccc-dddddddddddd",
"channel_alt_id": "ALT-12345",
"channel_name": "My Shopify Store",
"channel_type": "shopify",
"store_id": "s1t2o3r4-eeee-ffff-0000-111111111111",
"remote_id": "5678901234",
"remote_status": "Unshipped",
"status": "Unshipped",
"customer": {
"id": 12345,
"customer_uuid": "cust-uuid-0001",
"company_id": 1,
"name": "Jane Smith",
"email": "jane.smith@example.com",
"created_at": "2025-06-10T08:00:00.000000Z",
"updated_at": "2026-01-15T14:32:00.000000Z"
},
"shipping_method": "Standard Shipping",
"shipping_address": {
"id": "addr-uuid-ship-001",
"name": "Jane Smith",
"company_name": "Acme Ltd",
"address_line_one": "123 High Street",
"address_line_two": "Floor 2",
"address_line_three": "",
"long_address": "123 High Street, Floor 2",
"county": "Greater London",
"city": "London",
"country_iso_code": "GB",
"zip": "EC1A 1BB",
"phone": "+441234567890"
},
"invoice_address": {
"id": "addr-uuid-inv-001",
"name": "Jane Smith",
"company_name": "Acme Ltd",
"address_line_one": "123 High Street",
"address_line_two": "",
"address_line_three": "",
"long_address": "123 High Street",
"county": "Greater London",
"city": "London",
"country_iso_code": "GB",
"zip": "EC1A 1BB",
"phone": "+441234567890"
},
"fulfillment": null,
"return": null,
"payment_method": "shopify_payments",
"send_via_webhook": true,
"payment_status": "paid",
"payment_details": {
"vat_id": "",
"vat_type": null,
"tax_rate": "20",
"tax_total": "8.33",
"shipping_total": "4.99",
"discount_total": "0",
"discount_total_exc_tax": "0",
"order_subtotal": "41.65",
"order_subtotal_exc_tax": "33.32",
"order_total": "46.64",
"payment_method": "shopify_payments",
"payment_ref": "ch_3ABC123",
"payment_currency": "GBP",
"coupon_code": "",
"coupon_total": "0",
"coupon_total_exc_tax": "0"
},
"system_notes": "",
"delivery_notes": "Please leave at the door",
"customer_comments": "",
"gift_note": "",
"channel_specific": {
"shipping_code": "shopify-Standard Shipping-4.99",
"tags": ["VIP", "wholesale"],
"note_attributes": [
{ "name": "gift_message", "value": "Happy Birthday!" }
]
},
"order_access_url": "https://myshop.myshopify.com/admin/orders/5678901234",
"order_date": "2026-01-15T14:32:00.000000Z",
"order_import_date": "2026-01-15T14:33:12.000000Z",
"total_order_item_quantity": 2,
"total_order_item_quantity_inc_kits": 4,
"primary_reference_id": null,
"order_lines": [
{
"id": "item-uuid-0001",
"remote_id": "li_123456",
"sku": "WIDGET-BLU-M",
"channel_product_id": "cp-uuid-0001",
"master_product_id": "mp-uuid-0001",
"matched_sku": "WIDGET-BLU-M",
"quantity": 1,
"refunded_quantity": 0,
"name": "Blue Widget (Medium)",
"unit_price": "20.83",
"unit_price_exc_tax": "16.66",
"unit_discount": "0.00",
"total_discount": "0.00",
"unit_tax_rate": "20.02",
"unit_tax_value": "4.17",
"total_tax_value": "4.17",
"total_price": "20.83",
"is_tax_included": true,
"options": null,
"image_url": "https://cdn.example.com/widget-blue.jpg",
"file_url": null,
"notes": null
},
{
"id": "item-uuid-0002",
"remote_id": "li_123457",
"sku": "KIT-STARTER",
"channel_product_id": "cp-uuid-0002",
"master_product_id": "mp-uuid-0002",
"matched_sku": "KIT-STARTER",
"quantity": 1,
"refunded_quantity": 0,
"name": "Starter Kit",
"unit_price": "20.82",
"unit_price_exc_tax": "16.66",
"unit_discount": "0.00",
"total_discount": "0.00",
"unit_tax_rate": "19.93",
"unit_tax_value": "4.16",
"total_tax_value": "4.16",
"total_price": "20.82",
"is_tax_included": true,
"options": null,
"image_url": "https://cdn.example.com/kit-starter.jpg",
"file_url": null,
"notes": null,
"kit": [
{ "quantity": 1, "sku": "WIDGET-RED-S", "name": "Red Widget (Small)" },
{ "quantity": 2, "sku": "WIDGET-GRN-S", "name": "Green Widget (Small)" }
]
}
],
"md5_hash": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
}
Order Field Reference

2.2 Other Order Events (Same Payload, Different Moment)
These events reuse the exact Order structure:
`
orders.updated` – order state changed (status, addresses, items, etc.)Payload: Identical structure to
orders.received. (The payload always sends the full current state of the order, not a diff. Thewebhook_idwill be different from the original received webhook.)
`
orders.on_hold` – order placed on holdPayload: Identical structure to
orders.received.
`
orders.excluded` – order excluded (e.g. fraud, internal rules)Payload: Identical structure to
orders.received.
Note: For
orders.received,orders.route_to_webhook, andorders.excluded, fully refunded line items are excluded fromorder_lines.
`
orders.route_to_webhook` – order directed to a routing-specific endpointPayload: Identical structure to
orders.received.
`
confirmation.orders.received` – confirmation that Neuro has processed the order, used for acknowledgement workflows.Payload: Identical structure to
orders.received.
For `orders.received`, `orders.route_to_webhook`, and `orders.excluded`, fully refunded line items are omitted from `order_lines`.

3. Fulfilments Created (fulfillments.created)
Fired when a new fulfilment is created for an order. Fulfilment events encapsulate shipment details plus a nested snapshot of the parent order.
3.1 Example: `fulfillments.created` Payload
Triggered when a new fulfilment is created.
Payload: Fulfilment
{
"id": "ff-uuid-0001",
"order_id": "f7e6d5c4-1111-2222-3333-444444444444",
"order_primary_reference_id": null,
"order_remote_id": "5678901234",
"order_remote_alt_id": "ALT-12345",
"courier": {
"id": "cc-uuid-0001",
"name": "Royal Mail",
"custom_name": "RM Tracked 24"
},
"shipping_method": "Royal Mail Tracked 24",
"shipping_tracking_code": "JD012345678GB",
"tracking_url": "https://www.royalmail.com/track-your-item#/tracking-results/JD012345678GB",
"fulfillment_date": "2026-02-18 00:05:16",
"sync_status": 2,
"items": [
{ "sku": "WIDGET-BLU-M", "quantity": 1, "sales_channel_item_id": "5468632165489" }
],
"order_items": [
{
"remote_id": "li_123456",
"sku": "WIDGET-BLU-M",
"quantity": 1
}
],
"order": {
"order_id": "f7e6d5c4-1111-2222-3333-444444444444",
"channel_id": "c1d2e3f4-aaaa-bbbb-cccc-dddddddddddd",
"channel_alt_id": "ALT-12345",
"channel_name": "My Shopify Store",
"channel_type": "shopify",
"store_id": "s1t2o3r4-eeee-ffff-0000-111111111111",
"remote_id": "5678901234",
"remote_status": "fulfilled",
"status": "fulfilled",
"customer": {
"id": 12345,
"customer_uuid": "cust-uuid-0001",
"company_id": 1,
"name": "Jane Smith",
"email": "jane.smith@example.com",
"created_at": "2025-06-10T08:00:00.000000Z",
"updated_at": "2026-01-15T14:32:00.000000Z"
},
"shipping_method": "Standard Shipping",
"shipping_address": {
"id": "addr-uuid-ship-001",
"name": "Jane Smith",
"company_name": "Acme Ltd",
"address_line_one": "123 High Street",
"address_line_two": "Floor 2",
"address_line_three": "",
"long_address": "123 High Street, Floor 2",
"county": "Greater London",
"city": "London",
"country_iso_code": "GB",
"zip": "EC1A 1BB",
"phone": "+441234567890"
},
"invoice_address": {
"id": "addr-uuid-inv-001",
"name": "Jane Smith",
"company_name": "Acme Ltd",
"address_line_one": "123 High Street",
"address_line_two": "",
"address_line_three": "",
"long_address": "123 High Street",
"county": "Greater London",
"city": "London",
"country_iso_code": "GB",
"zip": "EC1A 1BB",
"phone": "+441234567890"
},
"return": null,
"payment_method": "shopify_payments",
"send_via_webhook": true,
"payment_status": "paid",
"payment_details": {
"vat_id": "",
"vat_type": "",
"tax_total": "8.33",
"shipping_total": "4.99",
"discount_total": "0.00",
"discount_total_exc_tax": "0.00",
"order_subtotal": "41.65",
"order_subtotal_exc_tax": "33.32",
"order_total": "46.64",
"payment_method": "shopify_payments",
"payment_ref": "ch_3ABC123",
"payment_currency": "GBP",
"coupon_code": "",
"coupon_total": "0.00",
"coupon_total_exc_tax": "0.00"
},
"system_notes": "",
"delivery_notes": "Please leave at the door",
"customer_comments": "",
"gift_note": "",
"channel_specific": {
"shipping_code": "shopify-Standard Shipping-4.99",
"tags": ["VIP"],
"is_pos_order": false,
"order_number": 458754,
"total_weight": 421,
"shipping_code": "Free Express Tracked: 1-2 Days"
},
"order_access_url": "https://myshop.myshopify.com/admin/orders/5678901234",
"order_date": "2026-01-15T14:32:00.000000Z",
"order_import_date": "2026-01-15T14:33:12.000000Z",
"total_order_item_quantity": 1,
"total_order_item_quantity_inc_kits": 1,
"primary_reference_id": null,
"order_lines": [
{
"id": "item-uuid-0001",
"remote_id": "li_123456",
"sku": "WIDGET-BLU-M",
"channel_product_id": "cp-uuid-0001",
"master_product_id": "mp-uuid-0001",
"matched_sku": "WIDGET-BLU-M",
"quantity": 1,
"refunded_quantity": 0,
"name": "Blue Widget (Medium)",
"unit_price": "20.83",
"unit_price_exc_tax": "16.66",
"unit_discount": "0.00",
"total_discount": "0.00",
"unit_tax_rate": "20.02",
"unit_tax_value": "4.17",
"total_tax_value": "4.17",
"total_price": "20.83",
"is_tax_included": true,
"options": [
{
"option_name": "__kaching_bundles",
"option_value": {
"deal": "7tD45m",
"main": true,
"market": 5455,
"id": "ANtp"
}
}
],
"image_url": "https://cdn.example.com/widget-blue.jpg",
"file_url": null,
"notes": null
}
],
"md5_hash": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
},
"plugin": {
"id": "plg-uuid-0001",
"name": "Whistl 3PL"
},
"channel": {
"id": "c1d2e3f4-aaaa-bbbb-cccc-dddddddddddd",
"name": "My Shopify Store"
},
"fulfillment_plugin": {
"id": "plg-uuid-0001",
"name": "Whistl 3PL"
}
}
Fulfilment Field Reference
Fulfilments Updated
Fired when an existing fulfilment is updated (tracking code changed, status updated, etc.). `
fulfillments.updated` uses the same structure; only values change (e.g. tracking code).Payload: Identical structure to
fulfillments.created.

4. Product & Stock Webhooks
Two layers of product data are exposed: master products, channel products, and plugin products.
4.1 Master Products – `products.updated`
Triggered when a main product changes (stock, title, etc.).
4.2 Products Created (products.created)
Coming Soon — This event will be available in an upcoming release.
Fired when a new main (master) product is created in Neuro.
Payload: Identical structure to products.updated.
4.3 Products Updated (products.updated)
Fired when a main (master) product is updated (stock quantity change, title change, etc.).
Payload: Product
{
"id": "mp-uuid-1001",
"sku": "TSHIRT-BLK-L",
"title": "Classic T-Shirt Black (Large)",
"product_nominal_code": "4000",
"tax_type": "standard",
"quantity": 150,
"price": "24.99",
"plugin_quantity": 150,
"plugin_quantity_synced_at": "2026-01-15T08:00:00.000000Z",
"plugin_sync_status": 2,
"plugin_synced_at": "2026-01-15T08:00:00.000000Z",
"api_quantity": 0,
"type": "product",
"auto_sync_stock": true,
"product_kit_items": [],
"channels": [
{
"id": "cp-uuid-1001",
"type": "product",
"store_id": "store-uuid-001",
"store_name": "My Store",
"channel_id": "ch-uuid-shopify",
"channel_name": "My Shopify Store",
"remote_id": "7654321098765",
"remote_sku": "TSHIRT-BLK-L",
"sku": "TSHIRT-BLK-L",
"matched_sku": "TSHIRT-BLK-L",
"title": "Classic T-Shirt Black (Large)",
"description": "A classic black t-shirt in size large.",
"image_url": "https://cdn.shopify.com/s/files/tshirt-black.jpg",
"pending_quantity": 148,
"synced_quantity": 148,
"quantity": 150,
"price": "24.99",
"currency": "GBP",
"product_nominal_code": "4000",
"dimensions": {
"weight": 0.35,
"weight_unit": "kg",
"length": 30.0,
"length_unit": "cm",
"width": 25.0,
"width_unit": "cm",
"height": 2.0,
"height_unit": "cm"
},
"export": {
"hs_code": "6109.10.00",
"country_of_origin": "GB",
"customs_description": "Cotton T-Shirt"
},
"barcodes": [
{
"id": 1,
"barcode": "5060000000001"
}
],
"use_low_stock_buffer": false,
"low_stock_buffer": 0,
"channel_product_url": "https://myshop.myshopify.com/admin/products/7654321098765"
}
],
"plugin_products": [
{
"id": "pp-uuid-0001",
"store_id": "store-uuid-001",
"store_name": "My Store",
"remote_id": "IP-98765",
"sku": "TSHIRT-BLK-L",
"product_id": 101,
"quantity": 150,
"plugin_sync_status": 2,
"plugin_synced_at": "2026-01-15T08:00:00.000000Z",
"title": "Classic T-Shirt Black (Large)",
"image_url": "",
"created_at": "2025-06-01T10:00:00.000000Z",
"updated_at": "2026-01-15T08:00:00.000000Z",
"plugin": {
"id": "a0c745fd-d344-48ab-b520-54985314654",
"name": "my amazon plugin",
"provider_type": "amazon_mcf",
"push_orders": true,
"use_max_order_limit": false,
"max_order_limit": 0,
"max_order_sent_days": 0,
"max_order_status": 0,
"is_active": true,
"is_connected": true,
"allow_order_split": false,
"is_default": false,
"push_order_cancellation_data": false,
"last_push_order_cancellation_data_at": null,
"refetch_fulfillment": false,
"channels": [
{
"id": "f38f9610-8d5b-1232-a19f-6f610289af4c",
"name": "My Shopify Store"
}
]
}
}
]
}Product Field Reference
Product with Kit Items Example
When type is kit:
{
"id": "mp-uuid-2001",
"sku": "KIT-STARTER",
"title": "Starter Kit",
"product_nominal_code": "",
"tax_type": "standard",
"quantity": 50,
"price": "39.99",
"plugin_quantity": 0,
"plugin_quantity_synced_at": null,
"plugin_sync_status": 0,
"plugin_synced_at": null,
"api_quantity": 0,
"type": "kit",
"auto_sync_stock": true,
"product_kit_items": [
{
"id": "mp-uuid-3001",
"sku": "WIDGET-RED-S",
"quantity": 1,
"name": "Red Widget (Small)"
},
{
"id": "mp-uuid-3002",
"sku": "WIDGET-GRN-S",
"quantity": 2,
"name": "Green Widget (Small)"
}
],
"channels": [],
"plugin_products": []
}
When `type` is `kit`, the `product_kit_items` array describes the component SKUs and quantities instead of direct stock.

5. Channels Products Created (channels.products.created)
Coming Soon — This event will be available in an upcoming release.
Activated when a new channel product is created (e.g. imported from a sales channel into Neuro).
Payload: Identical structure to channels.products.updated.
5.1 Channels Products Updated (channels.products.updated)
Represents how a product appears on a specific sales channel. Activated when a channel product is updated (stock sync, quantity change, price update, etc.).
Payload: Channel Product
{
"id": "cp-uuid-1001",
"type": "product",
"store_id": "store-uuid-001",
"store_name": "My Store",
"channel_id": "ch-uuid-shopify",
"channel_name": "My Shopify Store",
"remote_id": "7654321098765",
"remote_sku": "TSHIRT-BLK-L",
"sku": "TSHIRT-BLK-L",
"matched_sku": "TSHIRT-BLK-L",
"title": "Classic T-Shirt Black (Large)",
"description": "A classic black t-shirt in size large.",
"image_url": "https://cdn.shopify.com/s/files/tshirt-black.jpg",
"pending_quantity": 148,
"synced_quantity": 148,
"quantity": 150,
"price": "24.99",
"currency": "GBP",
"product_nominal_code": "4000",
"dimensions": {
"weight": 0.35,
"weight_unit": "kg",
"length": 30.0,
"length_unit": "cm",
"width": 25.0,
"width_unit": "cm",
"height": 2.0,
"height_unit": "cm"
},
"export": {
"hs_code": "6109.10.00",
"country_of_origin": "GB",
"customs_description": "Cotton T-Shirt"
},
"barcodes": [
{ "id": 1, "barcode": "5060000000001" }
],
"meta_fields": null,
"use_low_stock_buffer": false,
"low_stock_buffer": 0,
"channel_product_url": "https://myshop.myshopify.com/admin/products/7654321098765"
}
Channel Product Field Reference

6. Plugin Products
Represents product state on a plugin (e.g. Inventory Planner, 3PL, etc.).
6.1 Plugins Products Created (plugins.products.created)
Coming Soon — This event will be available in an upcoming release.
Fired when a new plugin product is created in Neuro.
Payload: Identical structure to plugins.products.updated.
6.2 Plugins Products Updated (plugins.products.updated)
Fired when a plugin product is updated.
Payload: Plugin Product
{
"id": "pp-uuid-0001",
"store_id": "store-uuid-001",
"store_name": "My Store",
"remote_id": "IP-98765",
"sku": "TSHIRT-BLK-L",
"product_id": 101,
"quantity": 150,
"plugin_sync_status": 2,
"plugin_synced_at": "2026-01-15T08:00:00.000000Z",
"title": "Classic T-Shirt Black (Large)",
"image_url": "",
"created_at": "2025-06-01T10:00:00.000000Z",
"updated_at": "2026-01-15T08:00:00.000000Z",
"product": {
"id": "mp-uuid-1001",
"sku": "TSHIRT-BLK-L",
"title": "Classic T-Shirt Black (Large)",
"product_nominal_code": "4000",
"tax_type": "standard",
"quantity": 150,
"price": "24.99",
"plugin_quantity": 150,
"plugin_quantity_synced_at": "2026-01-15T08:00:00.000000Z",
"plugin_sync_status": 2,
"plugin_synced_at": "2026-01-15T08:00:00.000000Z",
"api_quantity": 0,
"type": "product",
"auto_sync_stock": true,
"product_kit_items": [],
"channels": [],
"plugin_products": []
},
"plugin": {
"id": "plg-uuid-0001",
"name": "Inventory Planner",
"provider_type": "inventory_planner",
"push_orders": true,
"use_max_order_limit": false,
"max_order_limit": 0,
"max_order_sent_days": 30,
"max_order_status": 0,
"is_active": true,
"is_connected": true,
"push_order_cancellation_data": false,
"last_push_order_cancellation_data_at": null
}
}
Plugin Product Field Reference

7. Invoices Received (invoices.received)
Invoices are emitted when financial records are created or updated. Activated when a new invoice is received / created.
7.1 Example: `invoices.received`
Payload: Invoice
{
"id": "inv-uuid-0001",
"invoice_number": "INV-2026-0042",
"order_id": 500,
"currency": "GBP",
"store_id": "store-uuid-001",
"channel_id": "ch-uuid-shopify",
"shipping_total": "4.99",
"shipping_tax_type": "standard",
"shipping_account_code": "4200",
"notes": "Monthly recurring order",
"total": "46.64",
"invoice_date": "2026-01-15T00:00:00.000000Z",
"due_date": "2026-02-14T00:00:00.000000Z",
"notify_contact": true,
"meta": null,
"sync_status": 0,
"status": "pending",
"lines": [
{
"id": "invl-uuid-0001",
"product_nominal_code": "4000",
"product": {
"id": "mp-uuid-1001",
"sku": "WIDGET-BLU-M",
"title": "Blue Widget (Medium)",
"product_nominal_code": "4000",
"tax_type": "standard",
"quantity": 150,
"price": "20.83",
"plugin_quantity": 150,
"plugin_quantity_synced_at": "2026-01-15T08:00:00.000000Z",
"plugin_sync_status": 2,
"plugin_synced_at": "2026-01-15T08:00:00.000000Z",
"api_quantity": 0,
"type": "product",
"auto_sync_stock": true,
"product_kit_items": [],
"channels": [],
"plugin_products": []
},
"sku": "WIDGET-BLU-M",
"description": "Blue Widget (Medium) x1",
"tax_type": "standard",
"quantity": 1,
"unit_price": "16.66",
"price": "20.83",
"discount_total": "0.00",
"tax_total": "4.17"
}
],
"customer": {
"id": 12345,
"customer_uuid": "cust-uuid-0001",
"company_id": 1,
"name": "Jane Smith",
"email": "jane.smith@example.com",
"created_at": "2025-06-10T08:00:00.000000Z",
"updated_at": "2026-01-15T14:32:00.000000Z"
},
"invoice_address": {
"id": "addr-uuid-inv-001",
"name": "Jane Smith",
"company_name": "Acme Ltd",
"address_line_one": "123 High Street",
"address_line_two": "",
"address_line_three": "",
"long_address": "123 High Street",
"county": "Greater London",
"city": "London",
"country_iso_code": "GB",
"zip": "EC1A 1BB",
"phone": "+441234567890"
}
}
Invoice Field Reference
7.2 Invoices Updated (invoices.updated)
Fired when an existing invoice is updated.
Payload: Identical structure to invoices.received.

Whats Next
In the next article, we’ll unpack the exact data structures that sit inside your webhook deliveries, from channel-specific metadata to the shared customer, address, payment, and line-item objects that make up each order. To continue, open Order Payload Reference: Channel-Specific Fields and Shared Object Schemas and follow along from the start of the page.
All data in this document is fictitious. No real customer, order, address, or product data is used.
