This workflow corresponds to n8n.io template #8819 — we link there as the canonical source.
This workflow follows the Gmail → Google Drive recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "vJ0wZhatRHwADMcn",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AutoInvoicing",
"tags": [],
"nodes": [
{
"id": "1fc28d00-b93a-47d1-bc7e-9616f36128b2",
"name": "Google Sheets Trigger",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
0,
0
],
"parameters": {
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xRWt65Mu7Lx_LAbCdf_FsZmO0MW2o61kMPM854_L4jw/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1xRWt65Mu7Lx_LAbCdf_FsZmO0MW2o61kMPM854_L4jw",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xRWt65Mu7Lx_LAbCdf_FsZmO0MW2o61kMPM854_L4jw/edit?usp=drivesdk",
"cachedResultName": "ClientPayments"
}
},
"credentials": {
"googleSheetsTriggerOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "4c634c62-6e9e-4948-b2c7-69f278f861c3",
"name": "Send Email via Gmail",
"type": "n8n-nodes-base.gmail",
"position": [
352,
432
],
"parameters": {
"toList": [
"={{ $('Filter').item.json[\"Client Email\"] }}"
],
"message": "Invoice",
"subject": "Invoice for Services",
"resource": "message",
"htmlMessage": "=<!DOCTYPE html> <html> <head> <meta charset=\"UTF-8\"> <style> body { font-family: Arial, sans-serif; background-color: #f8f9fa; padding: 20px; } .container { max-width: 600px; margin: auto; background: #ffffff; border: 1px solid #ddd; border-radius: 8px; padding: 30px; } h2 { color: #333333; } p { font-size: 15px; color: #555555; } .info { background: #f1f1f1; padding: 15px; border-radius: 6px; margin-bottom: 20px; } .btn { background-color: #007bff; color: #ffffff !important; padding: 12px 20px; text-decoration: none; border-radius: 5px; display: inline-block; font-weight: bold; } .footer { font-size: 12px; color: #999999; margin-top: 30px; text-align: center; } </style> </head> <body> <div class=\"container\"> <h2>Invoice: {{ $('Filter').item.json[\"Order ID\"] }}</h2> <p>Dear {{ $('Filter').item.json[\"Client Name\"] }},</p> <p>Thank you for your business! Please find your invoice details below:</p> <div class=\"info\"> <p><strong>Invoice Date:</strong> {{ DateTime.now().format('yyyy-LL-dd') }}</p> <p><strong>Due Date:</strong> {{ $('Filter').item.json[\"Due Date\"] }}</p> <p><strong>Total Amount:</strong>{{ $('Filter').item.json.Amount }} {{ $('Filter').item.json.Currency }}</p> <p><strong>Items:</strong><br>{{ $('Filter').item.json[\"Items Description\"] }}</p> </div> <p>You can view or download your invoice using the button below:</p> <p><a class=\"btn\" href=\"https://drive.google.com/file/d/{{ $('Google Drive').item.json.id }}/view?usp=drive_link\" target=\"_blank\">View Invoice</a></p> <p>To complete your payment, please click below:</p> <p><a class=\"btn\" href=\"{{ $('Create Stripe Payment Link').item.json.url }}\" target=\"_blank\">Pay Now</a></p> <p>If you have any questions or concerns, feel free to contact us.</p> <div class=\"footer\"> \u00a9 {{ DateTime.now().format('yyyy') }} Your Company Name. All rights reserved. </div> </div> </body> </html>",
"includeHtml": true,
"additionalFields": {}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "7221a13f-9278-47e1-b99d-dd063b69b2ab",
"name": "Filter",
"type": "n8n-nodes-base.filter",
"position": [
224,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "8b570f11-d7d3-412d-a637-a24fa07008ea",
"operator": {
"type": "string",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json[\"Last Updated\"] }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "85accbae-199e-4541-8e19-dbfc41339a2a",
"name": "Create Stripe Product",
"type": "n8n-nodes-base.httpRequest",
"position": [
-96,
208
],
"parameters": {
"url": "https://api.stripe.com/v1/products",
"options": {
"bodyContentCustomMimeType": "application/x-www-form-urlencoded"
},
"requestMethod": "POST",
"authentication": "basicAuth",
"bodyParametersUi": {
"parameter": [
{
"name": "name",
"value": "={{ $json[\"Items Description\"] }}"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "f69f2dd2-3446-4f83-aa82-e66e4010f233",
"name": "Create Stripe Price",
"type": "n8n-nodes-base.httpRequest",
"position": [
128,
208
],
"parameters": {
"url": "https://api.stripe.com/v1/prices",
"options": {
"bodyContentCustomMimeType": "application/x-www-form-urlencoded"
},
"requestMethod": "POST",
"authentication": "basicAuth",
"bodyParametersUi": {
"parameter": [
{
"name": "currency",
"value": "={{ $('Filter').item.json.Currency }}"
},
{
"name": "unit_amount",
"value": "={{ $('Filter').item.json.Amount }}"
},
{
"name": "product",
"value": "={{ $json.id }}"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "2b785e52-0f4a-4583-ae9b-9df7f19b2ca0",
"name": "Create Stripe Payment Link",
"type": "n8n-nodes-base.httpRequest",
"position": [
352,
208
],
"parameters": {
"url": "https://api.stripe.com/v1/payment_links",
"options": {
"bodyContentCustomMimeType": "application/x-www-form-urlencoded"
},
"requestMethod": "POST",
"authentication": "basicAuth",
"bodyParametersUi": {
"parameter": [
{
"name": "line_items[0][price]",
"value": "={{ $json.id }}"
},
{
"name": "line_items[0][quantity]",
"value": "1"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "983b3432-dd64-4ffa-9e15-5305840867dd",
"name": "Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
-96,
432
],
"parameters": {
"name": "=Invoice_{{ $('Filter').item.json[\"Order ID\"] }}",
"content": "=INVOICE\nInvoice Number: {{ $('Filter').item.json[\"Order ID\"] }}\nDate: {{ DateTime.now().format('yyyy-MM-dd') }}\nDue Date: {{ $('Filter').item.json[\"Due Date\"] }}\nClient Name: {{ $('Filter').item.json[\"Client Name\"] }}\nClient Email: {{ $('Filter').item.json[\"Client Email\"] }}\n\n\n\nDescription:\n{{ $('Filter').item.json[\"Items Description\"] }}\n\nAmount:\n{{ $('Filter').item.json.Amount }}\n\n\n\n\nTotal Amount: {{ $('Filter').item.json.Amount }} {{ $('Filter').item.json.Currency }}\nPlease complete your payment using the link below:\n{{ $('Create Stripe Payment Link').item.json.url }}\n\nThank you for your business!\nIf you have any questions, feel free to contact us.\n",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1FfQW6DeAd0UPj-CFFEsXqgE43I2V6zDX",
"cachedResultUrl": "https://drive.google.com/drive/folders/1FfQW6DeAd0UPj-CFFEsXqgE43I2V6zDX",
"cachedResultName": "Youtube"
},
"operation": "createFromText"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "a43b8711-6c28-40e3-aa60-3883b6cdacca",
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
128,
432
],
"parameters": {
"columns": {
"value": {
"Order ID": "={{ $('Filter').item.json[\"Order ID\"] }}",
"Invoice Link": "={{ $json.id }}",
"Last Updated": "={{ DateTime.now() }}",
"Stripe Payment Link": "={{ $('Create Stripe Payment Link').item.json.url }}"
},
"schema": [
{
"id": "Order ID",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Order ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Client Name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Client Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Client Email",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Client Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Items Description",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Items Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Due Date",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Due Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Amount",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Amount",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Currency",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Currency",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invoice Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Invoice Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invoice Link",
"type": "string",
"display": true,
"required": false,
"displayName": "Invoice Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Stripe Payment Link",
"type": "string",
"display": true,
"required": false,
"displayName": "Stripe Payment Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Payment Received On",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Payment Received On",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Updated",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Updated",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Order ID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xRWt65Mu7Lx_LAbCdf_FsZmO0MW2o61kMPM854_L4jw/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1xRWt65Mu7Lx_LAbCdf_FsZmO0MW2o61kMPM854_L4jw",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xRWt65Mu7Lx_LAbCdf_FsZmO0MW2o61kMPM854_L4jw/edit?usp=drivesdk",
"cachedResultName": "ClientPayments"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "4dbe5318-59e7-4787-b397-64aabdc6a3e7",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-736,
-32
],
"parameters": {
"width": 560,
"height": 848,
"content": "## \ud83d\udee0 Setup Guide \n\n### Prerequisites \n- **n8n account** \n- **Google Sheets & Google Drive credentials** \n- **Gmail API credentials** \n- **Stripe API Key** \n\n### Steps \n1. **Clone/Import Workflow** \n - Import the workflow JSON file into your **n8n** instance. \n\n2. **Configure Google Sheets** \n - Create a Google Sheet with columns: \n - `Order ID, Client Name, Client Email, Items Description, Due Date, Amount, Currency, Invoice Status, Invoice Link, Stripe Payment Link, Last Updated` \n - Connect your **Google Sheets node** to this sheet. \n\n3. **Set Up Stripe** \n - Obtain your **Stripe Secret Key** from [Stripe Dashboard](https://dashboard.stripe.com/). \n - Add it in the Stripe nodes for **Product**, **Price**, and **Payment Link** creation. \n\n4. **Google Drive** \n - Configure to store invoice backups (optional). \n\n5. **Gmail** \n - Authorize Gmail and set up the **Send Email** node. \n - Customize the email template with client details and the Stripe link. \n\n6. **Test the Workflow** \n - Add a sample row in Google Sheets. \n - Run the workflow manually or update the sheet to trigger automatically. \n - Verify that the Stripe link is created, updated in the sheet, and emailed to the client. "
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "e166fc02-4473-4099-b669-e6898694feff",
"connections": {
"Filter": {
"main": [
[
{
"node": "Create Stripe Product",
"type": "main",
"index": 0
}
]
]
},
"Google Drive": {
"main": [
[
{
"node": "Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets": {
"main": [
[
{
"node": "Send Email via Gmail",
"type": "main",
"index": 0
}
]
]
},
"Create Stripe Price": {
"main": [
[
{
"node": "Create Stripe Payment Link",
"type": "main",
"index": 0
}
]
]
},
"Create Stripe Product": {
"main": [
[
{
"node": "Create Stripe Price",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets Trigger": {
"main": [
[
{
"node": "Filter",
"type": "main",
"index": 0
}
]
]
},
"Create Stripe Payment Link": {
"main": [
[
{
"node": "Google Drive",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2googleDriveOAuth2ApigoogleSheetsOAuth2ApigoogleSheetsTriggerOAuth2ApihttpBasicAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates the end-to-end process of generating and sending client payment links using Google Sheets and Stripe.
Source: https://n8n.io/workflows/8819/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Hiring teams often struggle with document follow-ups, offer letter generation, and stakeholder communication. Manual checks, email back-and-forth, and missing files slow down hiring and create chaos d
This workflow turns a Google Sheet into an automated certificate-issuing pipeline. The moment a new completion row is added — whether by your training team, a Zap, or a quiz platform — a branded PDF/A
This template is ideal for HR teams, startup founders, operations leads, remote-first companies, and freelancers managing onboarding manually or across multiple tools.
Automatically processes new orders added to Google Sheets. Small orders are approved instantly; large orders trigger an HTML email with one-click Approve / Reject links — each handled by an independen
General use cases include: Property managers who manage multiple buildings or units. Building owners looking to centralize tenant repair communication. Automation builders who want to learn multi-trig