Transform uploaded sales CSV files into validated, enriched invoices, all handled natively inside n8n using Data tables, validation logic, enrichment, duplicate detection, and automated email notifications.
This workflow demonstrates a full ETL + business automation pattern, turning raw CSV data into structured, auditable records ready for storage and customer notifications.
Products DatatableInvoices DatatableStores your product catalog with SKU-based pricing and tax details.
| Column | Type | Example |
|---|---|---|
| sku | String | PROD-001 |
| name | String | Premium Widget |
| price | Number | 49.99 |
| tax_rate | Number | 0.10 |

Stores validated, calculated invoices created by this workflow.
| Column | Type | Example |
|---|---|---|
| invoice_id | String | INV-20251103-001 |
| customer_email | String | [email protected] |
| order_date | Date | 2025-01-15 |
| subtotal | Number | 99.98 |
| total_tax | Number | 10.00 |
| grand_total | Number | 109.98 |
| created_at | DateTime | 2025-11-03T08:00:00Z |

Import the provided workflow JSON file into your n8n instance.
Use cURL or Postman to send a test CSV to your endpoint.
curl -X POST \
-H "Content-Type: text/csv" \
--data-binary $'sku,quantity,customer_email,order_date\nPROD-001,2,[email protected],2025-01-15\nPROD-002,1,[email protected],2025-01-15' \
https://<your-n8n-url>/webhook/process-sales
{
"success": true,
"processed_at": "2025-11-04T15:36:52.899Z",
"invoice_count": 1,
"invoices": {
"to": "[email protected]",
"subject": "Invoice INV-1762270612772-1 - Order Confirmation",
"body": "Dear Customer,\n\nThank you for your order!\n\nInvoice ID: INV-1762270612772-1\nOrder Date: 1/14/2025\n\nSubtotal: $99.98\nTax: $10.00\nGrand Total: $109.98\n\nThank you for your business!\n\nBest regards,\nSales Team"
},
"email_notifications": [
{
"to": "[email protected]",
"subject": "Invoice INV-1762270612772-2 - Order Confirmation",
"body": "Dear Customer,\n\nThank you for your order!\n\nInvoice ID: INV-1762270612772-2\nOrder Date: 1/14/2025\n\nSubtotal: $89.99\nTax: $9.00\nGrand Total: $98.99\n\nThank you for your business!\n\nBest regards,\nSales Team"
}
],
"message": "All invoices processed and customers notified"
}
Occurs when the CSV file is missing required columns or contains invalid data.
{
"success": false,
"message": "CSV validation failed",
"error": "Validation failed: [ { \"row\": 2, \"errors\": [\"Valid email is required\"] } ]"
}