AutomationFlowsEmail & Gmail › Automate Client Invoicing & Payments with Stripe, Google Sheets, Drive and Gmail

Automate Client Invoicing & Payments with Stripe, Google Sheets, Drive and Gmail

ByRohit Dabra @rohitdabra on n8n.io

This workflow automates the end-to-end process of generating and sending client payment links using Google Sheets and Stripe.

Event trigger★★★★☆ complexity9 nodesGoogle Sheets TriggerGmailHTTP RequestGoogle DriveGoogle Sheets
Email & Gmail Trigger: Event Nodes: 9 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

This workflow watches Google Sheets for new rows, renders a personalized video with iLoveVideoEditor using the row data, uploads the finished MP4 to Google Drive, writes the Drive link back to the sam

Google Sheets Trigger, N8N Nodes Ilovevideoeditor, HTTP Request +3
Email & Gmail

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

Google Sheets Trigger, HTTP Request, Slack +3
Email & Gmail

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

Google Sheets Trigger, N8N Nodes Templatefox, HTTP Request +3
Email & Gmail

This template is ideal for HR teams, startup founders, operations leads, remote-first companies, and freelancers managing onboarding manually or across multiple tools.

Google Sheets Trigger, Jira, HubSpot Trigger +7
Email & Gmail

This workflow ingests proof-of-delivery and completion documents from Gmail or a webhook, extracts key fields with an OpenRouter vision model, reconciles them against Google Sheets dispatch data, arch

Gmail Trigger, HTTP Request, Google Sheets +2