n8n integration
n8n is a strong fit for ProcureIQ teams that want more control than simple no-code recipes. You can combine ProcureIQ with Google Sheets, Airtable, email systems, internal APIs, Slack, CRMs, and custom logic without needing to build a full integration service from scratch.
This guide shows you how to:
- call the ProcureIQ API from n8n
- receive ProcureIQ webhooks
- verify webhook signatures safely
- build real workflows for orders, support tickets, and product search
Why use ProcureIQ with n8n
Teams often choose n8n when they need:
- more flexible branching and error handling
- custom JavaScript logic in the middle of a workflow
- self-hosted automation
- easier control over retries, logging, and credentials
- direct webhook support instead of 15-minute polling
ProcureIQ API basics for n8n
Base URL
Use this as your base URL:
https://api.procureiq.com
Authentication
The simplest option is API key authentication.
Send your ProcureIQ API key in the x-api-key header:
x-api-key: piq_live_xxx
You can also use OAuth 2.0 if your organization already has a ProcureIQ OAuth app, but API keys are usually easier for server-to-server workflows.
Recommended credential setup
In n8n:
- Create a new Header Auth credential or use the prebuilt ProcureIQ credential definition from the repo docs.
- Add:
- Header name:
x-api-key - Header value: your ProcureIQ API key
- Header name:
- Save the credential as something clear, such as
ProcureIQ Production API.
Setting up the HTTP Request node with the ProcureIQ API
Basic configuration
For most ProcureIQ calls, configure your HTTP Request node like this:
- Method:
GET,POST,PATCH, orDELETEdepending on the endpoint - URL:
https://api.procureiq.com/api/v1/... - Authentication: None if you are manually adding headers, or use your saved Header Auth credential
- Send Headers: On
- Headers:
x-api-key: {{your_api_key}}Content-Type: application/jsonfor POST and PATCH requests
- Response Format: JSON
Error handling recommendation
In n8n, turn on:
- Continue On Fail only when you explicitly want the workflow to keep going after a ProcureIQ API error
- Retry On Fail for temporary network or service issues
Good practice:
- retry
429,502,503, and504 - do not blindly retry
400,401, or403
Example: Search ProcureIQ products
Configure the node like this:
- Method:
GET - URL:
https://api.procureiq.com/api/v1/products - Query Parameters:
q=industrial fanscountry=NGlimit=10
This returns product listings you can pass into later n8n nodes.
Webhook trigger setup
ProcureIQ outbound webhooks are usually the best option for real-time automation.
Step 1: Create an n8n Webhook node
In your workflow:
- Add a Webhook node
- Choose
POST - Copy the production webhook URL
It will look similar to:
https://n8n.example.com/webhook/procureiq-orders
Step 2: Create the ProcureIQ webhook subscription
Use a ProcureIQ API call to register that webhook URL.
You can do this from:
- a one-time HTTP Request node
- Postman
- curl
- your ProcureIQ admin tooling
Example request:
POST /api/v1/webhooks
Content-Type: application/json
x-api-key: piq_live_xxx
{
"name": "n8n order sync",
"url": "https://n8n.example.com/webhook/procureiq-orders",
"events": ["order.created", "payment.succeeded"],
"description": "Sends ProcureIQ order and payment events into n8n"
}
Step 3: Verify the webhook signature
ProcureIQ signs outbound webhook payloads with the x-procureiq-signature header. Verify that signature before trusting the event.
Add a Code node directly after the Webhook node and use this code:
const crypto = require("crypto");
const secret = $env.PROCUREIQ_WEBHOOK_SECRET;
const signature = $json.headers?.["x-procureiq-signature"] || $headers["x-procureiq-signature"];
const rawBody =
typeof $json.body === "string"
? $json.body
: JSON.stringify($json.body ?? $json);
if (!secret) {
throw new Error("Missing PROCUREIQ_WEBHOOK_SECRET environment variable");
}
if (!signature) {
throw new Error("Missing x-procureiq-signature header");
}
const expected =
"sha256=" +
crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
if (signature !== expected) {
throw new Error("Invalid ProcureIQ webhook signature");
}
return [
{
json: typeof $json.body === "object" ? $json.body : JSON.parse(rawBody),
},
];
Step 4: Route by event type
After signature verification, add a Switch node or IF node to branch based on:
{{$json.type}}
For example:
order.createdpayment.succeededsupport.ticket_created
Example workflow 1: Sync orders to Google Sheets
Goal
Whenever a new ProcureIQ order is created, append it as a row in Google Sheets.
Workflow shape
Webhook Trigger -> Code (verify signature) -> Code (map fields) -> Google Sheets (append row)
Node 1: Webhook Trigger
- Method:
POST - Path:
procureiq-orders
Node 2: Code node for signature verification
Use the verification code from the previous section.
Node 3: Code node to map fields
const event = $json;
const data = event.data;
return [
{
json: {
eventId: event.id,
eventType: event.type,
orderId: data.orderId,
userId: data.userId,
totalAmount: data.totalAmount,
currency: data.currency,
itemCount: data.itemCount,
createdAt: new Date(event.created * 1000).toISOString(),
},
},
];
Node 4: Google Sheets - Append Row
Map the fields like this:
- Event ID ->
{{$json.eventId}} - Event Type ->
{{$json.eventType}} - Order ID ->
{{$json.orderId}} - User ID ->
{{$json.userId}} - Total Amount ->
{{$json.totalAmount}} - Currency ->
{{$json.currency}} - Item Count ->
{{$json.itemCount}} - Created At ->
{{$json.createdAt}}
Why this workflow works well
It keeps your spreadsheet synchronized without polling, and you can add more steps later such as:
- notifying a Slack channel
- updating a finance dashboard
- triggering procurement team follow-up actions
Example workflow 2: Auto-create support tickets from email
Goal
When a shared support inbox receives an email, create a ProcureIQ support ticket automatically.
Workflow shape
Email Trigger -> Code (clean email) -> HTTP Request (POST /support/tickets) -> Send confirmation
Node 1: Email Trigger
Use any email trigger your n8n setup supports, such as:
- IMAP Email
- Gmail Trigger
- Microsoft Outlook Trigger
Capture:
- sender email
- sender name
- subject
- body text
Node 2: Code node to clean the message
return [
{
json: {
subject: $json.subject || "Email support request",
message: $json.text || $json.html || "No message body provided",
guestEmail: $json.from?.email || "unknown@example.com",
guestName: $json.from?.name || "Email User",
},
},
];
Node 3: HTTP Request node to create the ticket
- Method:
POST - URL:
https://api.procureiq.com/api/v1/support/tickets - Headers:
x-api-key: {{your_api_key}}Content-Type: application/json
JSON Body:
{
"subject": "={{$json.subject}}",
"category": "OTHER",
"priority": "NORMAL",
"guestEmail": "={{$json.guestEmail}}",
"guestName": "={{$json.guestName}}",
"message": "={{$json.message}}"
}
Node 4: Send confirmation
Use Gmail, Outlook, or SMTP to send a confirmation message back to the sender:
Thanks for contacting ProcureIQ support. Your request has been received and a support ticket has been created.
Example workflow 3: Product search pipeline
Goal
Search ProcureIQ products from an external trigger and store the results in Airtable.
Workflow shape
Trigger -> HTTP Request (search products) -> Split Out / Loop -> Airtable
Node 1: Trigger
This can be:
- a manual trigger
- a webhook
- a spreadsheet row trigger
- a scheduled workflow
Node 2: HTTP Request
- Method:
GET - URL:
https://api.procureiq.com/api/v1/products - Query Parameters:
q = {{$json.searchTerm}}country = {{$json.country || "NG"}}limit = 10
Node 3: Split results
If ProcureIQ returns multiple products, use a Split Out or Item Lists node to process one item at a time.
Node 4: Airtable
Map each product into Airtable fields such as:
- Product ID
- Title
- Category
- Display Price
- Currency
- Origin Country
Handling ProcureIQ API errors in n8n
Common response codes
400- your request body or query parameters are invalid401- your API key or bearer token is missing or invalid403- your ProcureIQ credentials do not have the right scope404- the requested resource does not exist429- you have hit a rate limit
Good error-handling patterns
- use Error Trigger workflows to capture failed runs
- store the ProcureIQ response body in logs for debugging
- add retries only for temporary errors
- route invalid payloads into a dead-letter workflow or alert channel
Best practices for ProcureIQ webhooks in n8n
- acknowledge the webhook quickly
- verify the signature before doing anything else
- use the ProcureIQ event ID as an idempotency key
- keep expensive processing in downstream nodes, not in the first webhook step
- log failed workflows with the ProcureIQ event type and event ID
When to use n8n instead of Zapier
Choose n8n when you need:
- deeper branching and conditional logic
- custom code in the middle of a workflow
- self-hosted automation
- lower cost at higher event volume
- real-time webhook processing with more control
Choose Zapier when you want:
- faster setup for business users
- easier point-and-click app connections
- simpler automations with fewer custom steps
Next steps
Once your first workflow is running, good follow-on automations include:
- send
payment.failedevents to a finance queue - sync
support.ticket_createdevents into an internal helpdesk - create a sourcing dashboard from ProcureIQ product search results
- combine ProcureIQ orders with shipping and warehouse systems
If you want full control over the receiving application itself, continue to Custom Webhook Consumer.