AutomationFlowsData & Sheets › Automated Invoice Generator From Google Sheets to Google Docs

Automated Invoice Generator From Google Sheets to Google Docs

ByRobert Breen @rbreen on n8n.io

This workflow automates invoice creation using Google Sheets for structured input and Google Docs for templated output — all built inside n8n.

Event trigger★★★★☆ complexity11 nodesGoogle SheetsGoogle Docs
Data & Sheets Trigger: Event Nodes: 11 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #7138 — we link there as the canonical source.

This workflow follows the Google Docs → Google Sheets 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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "ede2cb2e-bb56-4870-94a4-c27c78509124",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -420,
        560
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "85ff7b59-2c72-4846-953a-46ab1f50fee8",
      "name": "Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -240,
        880
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MHVZRVo5aPs5VqRXk7lBNPVlZ2gilKqZ8J9yeg4taW4/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1MHVZRVo5aPs5VqRXk7lBNPVlZ2gilKqZ8J9yeg4taW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MHVZRVo5aPs5VqRXk7lBNPVlZ2gilKqZ8J9yeg4taW4/edit?usp=drivesdk",
          "cachedResultName": "Invoices"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "e92eee15-18b1-4851-92ae-985d666b1857",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        320,
        880
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "736b3314-daf7-4bd2-82e0-9e23018091b5",
      "name": "Get Invoice Template",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        100,
        800
      ],
      "parameters": {
        "operation": "get",
        "documentURL": "18n0HTqabDldi7fVbhbI1aG12qbFWsjyTXdduwDDOUu8"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "97b2ea4d-4904-49f5-bb1e-ae7e71156640",
      "name": "Create New Doc",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        120,
        980
      ],
      "parameters": {
        "title": "=Invoice:  {{ $json.Invoice }}",
        "folderId": "1TnDibwPPPUm3VbmETiqWDVhtaUTLJ6mn"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "86fb16bb-484b-44df-b4f5-25fde65a6c7f",
      "name": "Insert Content into Doc",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        600,
        540
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $json.content }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "89810e9d-685e-4007-be83-0686ea779163",
      "name": "Input Invoice Details",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        800,
        940
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "=FromCompany#",
              "action": "replaceAll",
              "replaceText": "={{ $('Google Sheets').item.json['Company From'] }}"
            },
            {
              "text": "ToCompany#",
              "action": "replaceAll",
              "replaceText": "={{ $('Google Sheets').item.json['Company To'] }}"
            },
            {
              "text": "Terms#",
              "action": "replaceAll",
              "replaceText": "={{ $('Google Sheets').item.json.Terms }}"
            },
            {
              "text": "Invoice#",
              "action": "replaceAll",
              "replaceText": "={{ $('Google Sheets').item.json.Invoice }}"
            },
            {
              "text": "Description#",
              "action": "replaceAll",
              "replaceText": "={{ $('Google Sheets').item.json.Description }}"
            },
            {
              "text": "Amount#",
              "action": "replaceAll",
              "replaceText": "={{ $('Google Sheets').item.json.Amount }}\n"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $('Merge').item.json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d9d22f6b-bd25-4af5-b460-c76e9a9c527b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        -60
      ],
      "parameters": {
        "color": 3,
        "width": 480,
        "height": 1220,
        "content": "### Step 1: **Manual Trigger**\n- Node: `When clicking \u2018Execute workflow\u2019`\n- Use this to manually execute the workflow during testing or on-demand runs.\n\n---\n\n### Step 2: **Google Sheets \u2014 Load Invoice Data**\n- Node: `Google Sheets`\n- Pulls rows from this [Google Sheet](https://docs.google.com/spreadsheets/d/1MHVZRVo5aPs5VqRXk7lBNPVlZ2gilKqZ8J9yeg4taW4/edit#gid=0)  \n- **Sheet Expectations**:\n  - Columns: `Company From`, `Company To`, `Terms`, `Invoice`, `Description`, `Amount`\n\n**Required Credentials**:\n- **Google Sheets OAuth2**  \n  Follow these steps:\n  1. Go to [Google Cloud Console](https://console.cloud.google.com/)\n  2. Enable the **Google Sheets API**\n  3. Create OAuth 2.0 credentials\n  4. Add redirect URI:  \n     ```\n     https://api.n8n.cloud/oauth2-credential/callback\n     ```"
      },
      "typeVersion": 1
    },
    {
      "id": "ad368f70-57a1-4693-9763-d7d2b8980efe",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40,
        -60
      ],
      "parameters": {
        "color": 4,
        "width": 460,
        "height": 1220,
        "content": "### ### Step 3: `Get Invoice Template` \u2014 Load Google Doc  \nLoads a static Google Docs template containing placeholder values.\n\n- \ud83e\uddfe **Template URL**: [Copy This Template](https://docs.google.com/document/d/18n0HTqabDldi7fVbhbI1aG12qbFWsjyTXdduwDDOUu8/edit)\n- **Required Placeholders** in the document:\n  ```\n  FromCompany#\n  ToCompany#\n  Terms#\n  Invoice#\n  Description#\n  Amount#\n  ```\n\n> \ud83d\udd11 **Credentials Required**:  \n> Connect to **Google Docs OAuth2 API** in n8n.\n\n---\n\n### ### Step 4: `Create New Doc` \u2014 Make Invoice File  \nCreates a new Google Doc by duplicating the invoice template.\n\n- **Title Format**: `Invoice: {{ $json.Invoice }}`\n- **Destination Folder ID**: `1TnDibwPPPUm3VbmETiqWDVhtaUTLJ6mn`  \n  *(You can change this to your own Google Drive folder)*\n\n> \ud83d\udd10 Make sure your Google Docs credential has write access to this folder.\n\n---\n\n### ### Step 5: `Merge` \u2014 Combine Data  \nMerges the loaded document and spreadsheet row together for downstream updates.\n\n---"
      },
      "typeVersion": 1
    },
    {
      "id": "a17e1690-a974-4552-88d2-5d87b89f5045",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        520,
        -60
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 1220,
        "content": "### ### Step 7: `Input Invoice Details` \u2014 Replace Fields  \nUses Google Docs API to replace all placeholders from the original template with the actual values.\n\n**Replacements:**\n\n| Placeholder    | Replaced With                |\n|----------------|------------------------------|\n| FromCompany#   | `Company From` from sheet     |\n| ToCompany#     | `Company To` from sheet       |\n| Terms#         | `Terms` from sheet            |\n| Invoice#       | `Invoice` number              |\n| Description#   | `Description` of service      |\n| Amount#        | `Amount` of invoice           |\n\n---\n\n## \ud83d\udce4 Final Output\n\nEach row from the Google Sheet results in a completed, branded Google Doc invoice stored in your Drive.\n\n---"
      },
      "typeVersion": 1
    },
    {
      "id": "9a875848-3be3-4763-8c08-05c2db7d4601",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        -180
      ],
      "parameters": {
        "width": 1460,
        "height": 100,
        "content": "## \ud83d\udcac Need Help?\n\ud83d\udce7 rbreen@ynteractive.com\n\ud83d\udd17 [LinkedIn](https://www.linkedin.com/in/robert-breen-29429625/)"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Insert Content into Doc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets": {
      "main": [
        [
          {
            "node": "Create New Doc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create New Doc": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Get Invoice Template": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert Content into Doc": {
      "main": [
        [
          {
            "node": "Input Invoice Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get Invoice Template",
            "type": "main",
            "index": 0
          },
          {
            "node": "Google Sheets",
            "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 invoice creation using Google Sheets for structured input and Google Docs for templated output — all built inside n8n.

Source: https://n8n.io/workflows/7138/ — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

Supercharge your insurance agency's efficiency with this powerful automation template for n8n. Designed specifically for commercial insurance brokers and agents, this workflow transforms the tedious p

Email Send, Google Sheets, Google Docs +1
Data & Sheets

Automating web scraping with recursive depth is ideal for collecting content across multiple linked pages—perfect for content aggregation, lead generation, or research projects.

Form Trigger, Google Sheets, Airtop +2
Data & Sheets

This workflow turns contract process into a fully automated, production-ready signing pipeline.

Form Trigger, Google Sheets, Form +3
Data & Sheets

Fetch the Most Recent Document from Google Drive. Uses googleDocs, toolWikipedia, toolCalculator, googleSheets. Event-driven trigger; 12 nodes.

Google Docs, Tool Wikipedia, Tool Calculator +3
Data & Sheets

This template is ideal for solo store owners, eCommerce marketers, automation beginners, or anyone using Shopify and Gmail who wants to recover lost revenue without coding.

HTTP Request, Gmail, Twilio +3