Automation

The Complete n8n Fiverr Workflow: Node-by-Node Breakdown + JSON Export

Every single node, complete JSON export, error handling, and rate limiting so Fiverr never bans you. Build this in 45 minutes.

Md. Rony Ahmed · 14 min read
The Complete n8n Fiverr Workflow: Node-by-Node Breakdown + JSON Export

What You're Getting



In [Part 1](https://codehustle.tech/posts/automated-fiverr-gig-n8n-2026/), I showed you the high-level automation that cut my Fiverr delivery time from 4 hours to 20 minutes.

In this post, I'm giving you:
- Every single node in the workflow (12 total)
- Configuration for each node
- The complete JSON export (copy-paste ready)
- Error handling that saved me 3am wake-up calls
- Rate limiting that keeps Fiverr from banning you

Time to build: 45 minutes
Skill level: Intermediate (I explain every step)




The Workflow Overview



[Fiverr Webhook] → [Order Parser] → [Data Scraper] → [AI Processor] 
                                                      ↓
[File Generator] ← [Quality Check] ← [Formatter] ← [Validator]
        ↓
[Fiverr Message] → [Done]


12 nodes. 4 failsafes. 0 manual work.




Node-by-Node Breakdown



Node 1: Webhook Trigger



Purpose: Catch new Fiverr orders instantly

{
  "name": "Fiverr Order Webhook",
  "type": "n8n-nodes-base.webhook",
  "typeVersion": 1,
  "webhookId": "fiverr-order-trigger",
  "path": "fiverr-order",
  "responseMode": "onReceived"
}


Why this matters: Fiverr sends a webhook when order status changes. We listen for "order.started" events.

Critical setting: responseMode: onReceived — Responds immediately so Fiverr doesn't timeout.




Node 2: Order Parser (Code Node)



Purpose: Extract requirements from Fiverr's messy JSON

const order = $input.first().json.body;

return {
  json: {
    orderId: order.order_id,
    buyerName: order.buyer.username,
    requirements: order.requirements?.[0]?.answer || "",
    gigTitle: order.gig.title,
    deliveryDays: order.duration,
    price: order.amount,
    deadline: new Date(order.deadline).toISOString()
  }
};


What this does: Fiverr's webhook has 50+ fields. This extracts only what we need.




Node 3: Requirements Validator (IF Node)



Purpose: Check if buyer actually filled requirements

{
  "name": "Requirements Valid?",
  "type": "n8n-nodes-base.if",
  "typeVersion": 1,
  "conditions": {
    "options": {
      "caseSensitive": true,
      "leftValue": "={{ $json.requirements }}",
      "type": "string",
      "operation": "isNotEmpty"
    }
  }
}


Error handling: If requirements empty → Send message asking for details → Wait for response.




Node 4: Data Scraper (HTTP Request)



Purpose: Scrape data based on buyer requirements

{
  "name": "Scrape Target Site",
  "type": "n8n-nodes-base.httpRequest",
  "typeVersion": 4.1,
  "method": "POST",
  "url": "https://api.scrapingbee.com/v1",
  "sendBody": true,
  "bodyParameters": {
    "parameters": [
      { "name": "url", "value": "={{ $json.targetUrl }}" },
      { "name": "render_js", "value": "true" },
      { "name": "api_key", "value": "={{ $env.SCRAPINGBEE_API_KEY }}" }
    ]
  }
}





Node 5: Data Parser (Code Node)



Purpose: Turn raw HTML into structured JSON

const cheerio = require('cheerio');
const html = $input.first().json.data;
const $ = cheerio.load(html);

const results = [];
$('.product-item').each((i, el) => {
  results.push({
    name: $(el).find('.title').text().trim(),
    price: $(el).find('.price').text().trim(),
    link: $(el).find('a').attr('href')
  });
});

return { json: { data: results, count: results.length } };





Node 6: AI Processor (OpenAI Node)



Purpose: Clean and format data using GPT-4

{
  "name": "Format with GPT-4",
  "type": "@n8n/n8n-nodes-langchain.agent",
  "typeVersion": 1,
  "options": {
    "systemMessage": "You are a data formatting assistant. Clean scraped data, remove duplicates, standardize prices, return JSON."
  },
  "prompt": "={{ JSON.stringify($json.data) }}"
}


Why AI here: Removes duplicates, standardizes price formats ($1,200 vs 1200 USD), flags low-quality entries, and formats for final export.




Node 7: Quality Gate (IF Node)



Purpose: Check data quality before delivery

{
  "name": "Quality Check",
  "type": "n8n-nodes-base.if",
  "typeVersion": 1,
  "conditions": {
    "options": {
      "leftValue": "={{ $json.count }}",
      "type": "number",
      "operation": "gt",
      "rightValue": "={{ $input.first().json.minRequired }}"
    }
  }
}


If quality fails: Loop back to Node 4 with different selectors.




Node 8: File Generator (Code Node)



Purpose: Create Excel/CSV for buyer

const XLSX = require('xlsx');
const data = $input.first().json.data;

const ws = XLSX.utils.json_to_sheet(data);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Results");

const buffer = XLSX.write(wb, { type: 'buffer', bookType: 'xlsx' });
const base64 = buffer.toString('base64');

return {
  json: {
    fileName: `results-${$input.first().json.orderId}.xlsx`,
    fileData: base64,
    fileSize: buffer.length
  }
};





Node 9: Fiverr Message Sender



{
  "name": "Send to Fiverr",
  "type": "n8n-nodes-base.httpRequest",
  "typeVersion": 4.1,
  "method": "POST",
  "url": "https://www.fiverr.com/api/v1/orders/{{ $json.orderId }}/messages",
  "sendBody": true,
  "bodyParameters": {
    "parameters": [
      {
        "name": "message",
        "value": "Hi! I have completed your order. Here is your data file. Let me know if you need any adjustments!"
      },
      { "name": "attachment", "value": "={{ $json.fileData }}" }
    ]
  }
}





Nodes 10-12: Error Handling & Logging



Error Handler:
const error = $input.first().json.error;

await $httpRequest({
  method: 'POST',
  url: `https://api.telegram.org/bot{{$env.TELEGRAM_BOT_TOKEN}}/sendMessage`,
  body: {
    chat_id: '{{$env.TELEGRAM_CHAT_ID}}',
    text: `⚠️ Fiverr workflow failed: ${error.message}\nOrder: ${$input.first().json.orderId}`
  }
});

return { json: { handled: true } };





Environment Variables You Need



VariablePurposeWhere to Get
`SCRAPINGBEE_API_KEY`Web scrapingScrapingBee
`OPENAI_API_KEY`AI formattingOpenAI Platform
`TELEGRAM_BOT_TOKEN`Error alerts@BotFather
`TELEGRAM_CHAT_ID`Your Telegram ID@userinfobot




Error Handling That Saves You



ScenarioResponse
Buyer requirements unclearAuto-message asking for details + pause workflow
Scraping blockedRotate proxy + retry 3x
Data quality lowRe-scrape with different selectors
Fiverr API failsQueue for retry + Telegram alert
Excel too largeCompress + send as ZIP




Rate Limiting (Critical)



Fiverr limits: 20 messages/hour to new buyers, 100 messages/hour total. Violation = 24-hour ban.

Our solution queues messages when approaching limits and retries after the window resets.




Results After 30 Days



MetricBeforeAfter
Delivery time4 hours20 minutes
Manual work100%5% (edge cases only)
5-star reviews89%97%
Orders/day412
Response time6 hours3 minutes