JotForm订单的自动化发票生成与交付
中级
这是一个自动化工作流,包含 14 个节点。主要使用 Code, Gmail, GoogleDrive, HttpRequest, JotFormTrigger 等节点。 从JotForm生成发票,转换为PDF后保存至Google Drive并通过邮件发送
前置要求
- •Google 账号和 Gmail API 凭证
- •Google Drive API 凭证
- •可能需要目标 API 的认证凭证
分类
-
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "Rrs4ZCaJZKAZIHKG",
"meta": {
"instanceId": "277842713620d9f5554de3b1518b865a152c8c4db680008bd8aec536fc18b4a8"
},
"name": "JotForm 订单的自动化发票生成与交付",
"tags": [
{
"id": "CWardZYJBmejoyC4",
"name": "under review",
"createdAt": "2025-10-09T18:43:37.031Z",
"updatedAt": "2025-10-09T18:43:37.031Z"
}
],
"nodes": [
{
"id": "99ab3063-af31-4701-890f-67b42ed901f6",
"name": "格式化发票数据",
"type": "n8n-nodes-base.code",
"position": [
-160,
496
],
"parameters": {
"jsCode": "// Extract and format order data for invoice\nconst orderData = $input.first().json.body;\n\n// Calculate totals\nconst lineItems = orderData.line_items.map(item => ({\n name: item.name,\n quantity: item.quantity,\n price: parseFloat(item.price),\n total: parseFloat(item.price) * item.quantity,\n sku: item.sku || 'N/A'\n}));\n\nconst subtotal = lineItems.reduce((sum, item) => sum + item.total, 0);\nconst taxAmount = parseFloat(orderData.total_tax || 0);\nconst shippingAmount = parseFloat(orderData.shipping_lines?.[0]?.price || 0);\nconst total = parseFloat(orderData.total_price);\n\n// Format invoice data\nconst invoiceData = {\n // Order info\n orderNumber: orderData.order_number,\n orderDate: new Date(orderData.created_at).toLocaleDateString(),\n \n // Customer info\n customer: {\n name: `${orderData.customer.first_name} ${orderData.customer.last_name}`,\n email: orderData.customer.email,\n phone: orderData.customer.phone || 'N/A'\n },\n \n // Billing address\n billingAddress: orderData.billing_address ? {\n address1: orderData.billing_address.address1,\n address2: orderData.billing_address.address2 || '',\n city: orderData.billing_address.city,\n province: orderData.billing_address.province,\n zip: orderData.billing_address.zip,\n country: orderData.billing_address.country\n } : null,\n \n // Shipping address\n shippingAddress: orderData.shipping_address ? {\n address1: orderData.shipping_address.address1,\n address2: orderData.shipping_address.address2 || '',\n city: orderData.shipping_address.city,\n province: orderData.shipping_address.province,\n zip: orderData.shipping_address.zip,\n country: orderData.shipping_address.country\n } : null,\n \n // Line items\n items: lineItems,\n \n // Totals\n subtotal: subtotal.toFixed(2),\n tax: taxAmount.toFixed(2),\n shipping: shippingAmount.toFixed(2),\n total: total.toFixed(2),\n currency: orderData.currency,\n \n // Additional info\n paymentMethod: orderData.payment_gateway_names?.[0] || 'Online Payment',\n notes: orderData.note || ''\n};\n\nreturn { invoiceData };"
},
"typeVersion": 2
},
{
"id": "0bfdcf22-ecc4-4fb1-b9a7-5ee86079feb1",
"name": "生成 HTML 发票",
"type": "n8n-nodes-base.code",
"position": [
144,
496
],
"parameters": {
"jsCode": "// Generate professional invoice HTML\nconst data = $input.first().json.invoiceData;\n\nconst html = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Invoice #${data.orderNumber}</title>\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n \n body {\n font-family: 'Arial', sans-serif;\n line-height: 1.6;\n color: #333;\n background: #f8f9fa;\n }\n \n .container {\n max-width: 800px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n box-shadow: 0 0 20px rgba(0,0,0,0.1);\n }\n \n .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 40px;\n padding-bottom: 20px;\n border-bottom: 3px solid #007bff;\n }\n \n .company-info {\n flex: 1;\n }\n \n .company-name {\n font-size: 28px;\n font-weight: bold;\n color: #007bff;\n margin-bottom: 5px;\n }\n \n .invoice-info {\n text-align: right;\n }\n \n .invoice-title {\n font-size: 36px;\n font-weight: bold;\n color: #333;\n margin-bottom: 10px;\n }\n \n .invoice-number {\n font-size: 18px;\n color: #666;\n }\n \n .details-section {\n display: flex;\n justify-content: space-between;\n margin-bottom: 40px;\n gap: 40px;\n }\n \n .detail-box {\n flex: 1;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n }\n \n .detail-title {\n font-weight: bold;\n margin-bottom: 15px;\n color: #007bff;\n font-size: 16px;\n }\n \n .detail-content {\n color: #555;\n }\n \n .items-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 30px;\n }\n \n .items-table th,\n .items-table td {\n padding: 15px;\n text-align: left;\n border-bottom: 1px solid #ddd;\n }\n \n .items-table th {\n background-color: #007bff;\n color: white;\n font-weight: bold;\n text-transform: uppercase;\n font-size: 14px;\n }\n \n .items-table tr:hover {\n background-color: #f5f5f5;\n }\n \n .text-right {\n text-align: right;\n }\n \n .totals-section {\n margin-left: auto;\n width: 300px;\n }\n \n .totals-table {\n width: 100%;\n border-collapse: collapse;\n }\n \n .totals-table td {\n padding: 10px 0;\n border-bottom: 1px solid #eee;\n }\n \n .total-row {\n font-weight: bold;\n font-size: 18px;\n border-top: 2px solid #007bff;\n color: #007bff;\n }\n \n .footer {\n margin-top: 50px;\n padding-top: 20px;\n border-top: 1px solid #ddd;\n text-align: center;\n color: #666;\n font-size: 14px;\n }\n \n .thank-you {\n font-size: 18px;\n color: #007bff;\n margin-bottom: 10px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <div class=\"company-info\">\n <div class=\"company-name\">Your Company Name</div>\n <div>123 Business Street</div>\n <div>City, State 12345</div>\n <div>Phone: (555) 123-4567</div>\n <div>Email: info@yourcompany.com</div>\n </div>\n <div class=\"invoice-info\">\n <div class=\"invoice-title\">INVOICE</div>\n <div class=\"invoice-number\">#${data.orderNumber}</div>\n <div style=\"margin-top: 10px;\">Date: ${data.orderDate}</div>\n </div>\n </div>\n \n <div class=\"details-section\">\n <div class=\"detail-box\">\n <div class=\"detail-title\">Bill To:</div>\n <div class=\"detail-content\">\n <strong>${data.customer.name}</strong><br>\n ${data.customer.email}<br>\n ${data.customer.phone}<br><br>\n ${data.billingAddress ? `\n ${data.billingAddress.address1}<br>\n ${data.billingAddress.address2 ? data.billingAddress.address2 + '<br>' : ''}\n ${data.billingAddress.city}, ${data.billingAddress.province} ${data.billingAddress.zip}<br>\n ${data.billingAddress.country}\n ` : ''}\n </div>\n </div>\n \n ${data.shippingAddress ? `\n <div class=\"detail-box\">\n <div class=\"detail-title\">Ship To:</div>\n <div class=\"detail-content\">\n ${data.shippingAddress.address1}<br>\n ${data.shippingAddress.address2 ? data.shippingAddress.address2 + '<br>' : ''}\n ${data.shippingAddress.city}, ${data.shippingAddress.province} ${data.shippingAddress.zip}<br>\n ${data.shippingAddress.country}\n </div>\n </div>\n ` : ''}\n \n <div class=\"detail-box\">\n <div class=\"detail-title\">Payment Info:</div>\n <div class=\"detail-content\">\n <strong>Method:</strong> ${data.paymentMethod}<br>\n <strong>Currency:</strong> ${data.currency}<br>\n <strong>Status:</strong> Paid\n </div>\n </div>\n </div>\n \n <table class=\"items-table\">\n <thead>\n <tr>\n <th>Item</th>\n <th>SKU</th>\n <th>Qty</th>\n <th>Price</th>\n <th>Total</th>\n </tr>\n </thead>\n <tbody>\n ${data.items.map(item => `\n <tr>\n <td><strong>${item.name}</strong></td>\n <td>${item.sku}</td>\n <td>${item.quantity}</td>\n <td>$${item.price.toFixed(2)}</td>\n <td class=\"text-right\">$${item.total.toFixed(2)}</td>\n </tr>\n `).join('')}\n </tbody>\n </table>\n \n <div class=\"totals-section\">\n <table class=\"totals-table\">\n <tr>\n <td>Subtotal:</td>\n <td class=\"text-right\">$${data.subtotal}</td>\n </tr>\n ${parseFloat(data.shipping) > 0 ? `\n <tr>\n <td>Shipping:</td>\n <td class=\"text-right\">$${data.shipping}</td>\n </tr>\n ` : ''}\n ${parseFloat(data.tax) > 0 ? `\n <tr>\n <td>Tax:</td>\n <td class=\"text-right\">$${data.tax}</td>\n </tr>\n ` : ''}\n <tr class=\"total-row\">\n <td><strong>Total:</strong></td>\n <td class=\"text-right\"><strong>$${data.total}</strong></td>\n </tr>\n </table>\n </div>\n \n ${data.notes ? `\n <div style=\"margin-top: 30px; padding: 20px; background: #f8f9fa; border-radius: 8px;\">\n <strong>Notes:</strong><br>\n ${data.notes}\n </div>\n ` : ''}\n \n <div class=\"footer\">\n <div class=\"thank-you\">Thank you for your business!</div>\n <div>This invoice was generated automatically on ${new Date().toLocaleDateString()}</div>\n <div style=\"margin-top: 10px;\">For questions about this invoice, please contact us at info@yourcompany.com</div>\n </div>\n </div>\n</body>\n</html>\n`;\n\nreturn { html };"
},
"typeVersion": 2
},
{
"id": "9cedf436-1a03-4fb6-910d-086b6dca81b5",
"name": "保存到 Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
1056,
288
],
"parameters": {
"name": "=Invoice - {{ $('Shopify Order Webhook').item.json.body.id }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1A2B3C4D5E6F7G8H9I0J",
"cachedResultName": "Invoices"
}
},
"typeVersion": 3
},
{
"id": "cfc5e050-ca7f-4197-aec2-efea24529538",
"name": "发送给客户",
"type": "n8n-nodes-base.gmail",
"position": [
1056,
592
],
"webhookId": "fd101041-8325-4589-a347-d966678a2883",
"parameters": {
"sendTo": "={{ $('Shopify Order Webhook').item.json.body.customer.email }}",
"message": "=<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <title>Invoice for Order #{{ $('Shopify Order Webhook').item.json.body.order_number }}</title> <style> body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; } .header { text-align: center; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 2px solid #007bff; } .company-name { font-size: 24px; font-weight: bold; color: #007bff; margin-bottom: 5px; } .attachment-notice { background: #f8f9fa; padding: 15px; border-left: 4px solid #28a745; margin: 20px 0; } .footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #ddd; color: #666; font-size: 14px; } </style> </head> <body> <div class=\"header\"> <div class=\"company-name\">Company Name</div> </div> <p>Dear {{ $('Shopify Order Webhook').item.json.body.customer.first_name }},</p> <p>Thank you for your recent order! Your payment has been successfully processed.</p> <div class=\"attachment-notice\"> <strong>📎 Invoice Attached</strong><br> Please find your invoice attached to this email for order #{{ $('Shopify Order Webhook').item.json.body.order_number }}. </div> <p>We're now preparing your order for shipment. You'll receive a tracking notification once your order is on its way.</p> <p>If you have any questions about your order, please don't hesitate to contact us at support@pdfmunk.com.</p> <p>Thank you for choosing Company Name!</p> <p>Best regards,<br> The Company Name Team</p> <div class=\"footer\"> <p>This is an automated email regarding your order. Please save the attached invoice for your records.</p> </div> </body> </html>",
"options": {
"attachmentsUi": {
"attachmentsBinary": [
{}
]
}
},
"subject": "=Invoice for your Order# {{ $('Shopify Order Webhook').item.json.body.order_number }}"
},
"typeVersion": 2.1
},
{
"id": "8162eb8b-938d-4361-b54d-e745984ba8b1",
"name": "生成 PDF 发票",
"type": "n8n-nodes-htmlcsstopdf.htmlcsstopdf",
"position": [
512,
496
],
"parameters": {},
"typeVersion": 1
},
{
"id": "23581c69-fd48-49a9-abe8-8f3efb1bcc9e",
"name": "下载 PDF 文件",
"type": "n8n-nodes-base.httpRequest",
"position": [
800,
496
],
"parameters": {
"url": "={{ $json.pdf_url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "6ff41885-733c-4e38-b16b-3e9f3adae96b",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
288
],
"parameters": {
"color": 4,
"width": 288,
"height": 368,
"content": "## 来自 Jotform 的 Webhook"
},
"typeVersion": 1
},
{
"id": "5ddc5e49-007b-4a46-a41a-e7f5a50c2679",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
384
],
"parameters": {
"color": 4,
"height": 272,
"content": "## 创建 HTML"
},
"typeVersion": 1
},
{
"id": "989e9a89-dcd8-42fb-9fa6-c20916ef42f5",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
384
],
"parameters": {
"color": 4,
"width": 352,
"height": 272,
"content": "## 生成 PDF"
},
"typeVersion": 1
},
{
"id": "8aeeed1b-3c2f-44de-a330-2547f2d1a3bd",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
384
],
"parameters": {
"color": 4,
"height": 272,
"content": "## 格式化数据"
},
"typeVersion": 1
},
{
"id": "db3b1636-c5c8-4212-8cfa-8a1d4e21410e",
"name": "便签4",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
576
],
"parameters": {
"color": 4,
"width": 304,
"height": 288,
"content": "## 发送发票邮件"
},
"typeVersion": 1
},
{
"id": "6d92f3cf-4574-44af-b88a-e309974f809b",
"name": "便签5",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
192
],
"parameters": {
"color": 4,
"width": 304,
"height": 288,
"content": "## 保存发票 PDF"
},
"typeVersion": 1
},
{
"id": "bfc8cada-2bd0-485f-a9b5-4d1701474374",
"name": "GET 模型",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"color": 6,
"width": 544,
"height": 288,
"content": "## 🎯 此模板的功能"
},
"typeVersion": 1
},
{
"id": "000cdfd3-ae0d-4716-9ca9-ef155ff6c3ec",
"name": "JotForm 触发器",
"type": "n8n-nodes-base.jotFormTrigger",
"position": [
-512,
496
],
"webhookId": "d222ca8c-80f7-4504-bf39-6b2e5ec87316",
"parameters": {
"form": "252815424602048"
},
"credentials": {
"jotFormApi": {
"id": "cOSh16Q5l4e0EB1A",
"name": "Jotform jitesh@mediajade.com"
}
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "4eaaebd6-4d7c-4c24-bde6-4553f7978a77",
"connections": {
"JotForm Trigger": {
"main": [
[
{
"node": "Format Invoice Data",
"type": "main",
"index": 0
}
]
]
},
"Download File PDF": {
"main": [
[
{
"node": "Email to Customer",
"type": "main",
"index": 0
},
{
"node": "Save to Google Drive",
"type": "main",
"index": 0
}
]
]
},
"Email to Customer": {
"main": [
[]
]
},
"Format Invoice Data": {
"main": [
[
{
"node": "Generate HTML Invoice",
"type": "main",
"index": 0
}
]
]
},
"Generate PDF Invoice": {
"main": [
[
{
"node": "Download File PDF",
"type": "main",
"index": 0
}
]
]
},
"Save to Google Drive": {
"main": [
[]
]
},
"Generate HTML Invoice": {
"main": [
[
{
"node": "Generate PDF Invoice",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
中级
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
研讨会证书预颁发系统
自动化研讨会证书系统,集成 JotForm、邮件验证和 Google Workspace
If
Code
Gmail
+8
24 节点Jitesh Dugar
文档提取
会议纪要和行动项跟踪器
基于AI的会议纪要:使用GPT-4、任务分配和多渠道分发
If
Set
Code
+10
38 节点Jitesh Dugar
内容创作
家长同意自动化
使用电子邮件验证、PDF生成和Google Drive自动化学校旅行同意书
If
Code
Gmail
+7
22 节点Jitesh Dugar
文档提取
发票和收据生成器(HTML转PDF)
自动发票生成器 - 从Shopify到PDF,支持Google Drive存储和邮件发送
If
Code
Gmail
+6
19 节点Jitesh Dugar
内容创作
使用 Jotform、OpenAI 自动处理员工差旅费用报告/解析
使用 Jotform、GPT-4.1 mini 和 Google Sheets 实现员工差旅费用处理自动化
Code
Gmail
Google Drive
+7
17 节点Jitesh Dugar
AI医疗分诊:智能分诊、医生简报和紧急情况检测
基于GPT-4和JotForm的医疗分诊与预约自动化
If
Set
Code
+8
22 节点Jitesh Dugar
工作流信息
难度等级
中级
节点数量14
分类-
节点类型7
作者
Jitesh Dugar
@jiteshdugarAI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.
外部链接
在 n8n.io 查看 →
分享此工作流