Skip to main content

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.

In n8n:

  1. Create a new Header Auth credential or use the prebuilt ProcureIQ credential definition from the repo docs.
  2. Add:
    • Header name: x-api-key
    • Header value: your ProcureIQ API key
  3. 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, or DELETE depending 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/json for 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, and 504
  • do not blindly retry 400, 401, or 403

Example: Search ProcureIQ products

Configure the node like this:

  • Method: GET
  • URL: https://api.procureiq.com/api/v1/products
  • Query Parameters:
    • q = industrial fans
    • country = NG
    • limit = 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:

  1. Add a Webhook node
  2. Choose POST
  3. 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.created
  • payment.succeeded
  • support.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 invalid
  • 401 - your API key or bearer token is missing or invalid
  • 403 - your ProcureIQ credentials do not have the right scope
  • 404 - the requested resource does not exist
  • 429 - 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.failed events to a finance queue
  • sync support.ticket_created events 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.