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.