AutomationFlowsEmail & Gmail › Generate, Encrypt, and Send Invoices with PDF Generator API & Google Suite

Generate, Encrypt, and Send Invoices with PDF Generator API & Google Suite

ByMarián Današ @marian on n8n.io

Creating and sending invoices manually is a major administrative bottleneck. It's not only slow but also prone to human error, such as creating duplicate invoice numbers or sending sensitive financial data in an unsecured format. This workflow solves these problems by creating a…

Webhook trigger★★★★☆ complexity13 nodesGoogle Sheets@Pdfgeneratorapi/N8N Nodes Pdf Generator ApiGoogle DriveGmail
Email & Gmail Trigger: Webhook Nodes: 13 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #10387 — 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": "NmF3SAX03cSvsHpW",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Generate, Encrypt, and Send Invoices with PDF Generator API & Google Suite",
  "tags": [],
  "nodes": [
    {
      "id": "e30f9a26-b270-41ea-b732-95df22a8b3ed",
      "name": "Generate Invoice ID",
      "type": "n8n-nodes-base.code",
      "position": [
        480,
        208
      ],
      "parameters": {
        "jsCode": "function generateOrderNumber(length = 8) {\n  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n  let result = 'INVOICE-';\n  for (let i = 0; i < length; i++) {\n    result += chars.charAt(Math.floor(Math.random() * chars.length));\n  }\n  return result;\n}\n\nreturn [\n  {\n    json: {\n      order_number: generateOrderNumber()\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "5fb09b61-d55e-4b78-bdd8-cfc997737434",
      "name": "Check if ID Already Exists",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        688,
        208
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1915774434,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WO-vIxG5lSWWF7_BwDDjLSfEbwNkFtIcMSgFRKAoUCU/edit#gid=1915774434",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1WO-vIxG5lSWWF7_BwDDjLSfEbwNkFtIcMSgFRKAoUCU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WO-vIxG5lSWWF7_BwDDjLSfEbwNkFtIcMSgFRKAoUCU/edit?usp=drivesdk",
          "cachedResultName": "n8n pokus x"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5,
      "alwaysOutputData": true
    },
    {
      "id": "7a7132cf-2847-4dc6-812c-036339b6d30d",
      "name": "If Does not Exist",
      "type": "n8n-nodes-base.if",
      "position": [
        912,
        208
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cee7659a-cea3-494a-b4f3-c76d035a3a32",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.row_number }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "23696cc6-71e0-4a5f-a391-5116024ad19d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        128,
        0
      ],
      "parameters": {
        "color": 3,
        "height": 352,
        "content": "## Pinned TEST data \nThis pinned data simulates the test payload (JSON) from the Webhook. It contains sample customer and line item details needed to test the invoice generation."
      },
      "typeVersion": 1
    },
    {
      "id": "32b3abc7-9cc3-4586-8bc2-10234c1071f2",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        128
      ],
      "parameters": {
        "width": 656,
        "height": 288,
        "content": "## Generate a random INVOICE number and check for duplicities"
      },
      "typeVersion": 1
    },
    {
      "id": "d0c8d1a6-02df-4038-af24-ee607f67a1ae",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        16
      ],
      "parameters": {
        "color": 5,
        "width": 224,
        "height": 528,
        "content": "## Generate a document and Encrypt"
      },
      "typeVersion": 1
    },
    {
      "id": "1d61d3f5-251f-43b2-9d75-e916fc04c2ca",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        448
      ],
      "parameters": {
        "color": 4,
        "width": 624,
        "height": 272,
        "content": "## Upload the file and send the invoice to the customer"
      },
      "typeVersion": 1
    },
    {
      "id": "e6b468a5-abc2-4a81-b7ec-a1fc133b7cfa",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        192,
        208
      ],
      "parameters": {
        "path": "4707540d-382e-45b2-a385-4ee35b447c27",
        "options": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "c4a87e74-50e3-4e67-a313-9503502987e7",
      "name": "Generate a PDF document",
      "type": "@pdfgeneratorapi/n8n-nodes-pdf-generator-api.pdfGeneratorApi",
      "position": [
        1216,
        128
      ],
      "parameters": {
        "data": "={\n  \"order_number\": \"{{ $('Generate Invoice ID').item.json.order_number }}\",\n  \"name\": \"{{ $('Webhook').item.json.name }}\",\n  \"company\": \"{{ $('Webhook').item.json.company }}\",\n  \"address1\": \"{{ $('Webhook').item.json.address1 }}\",\n  \"city\": \"{{ $('Webhook').item.json.city }}\",\n  \"additional_fee\": \"{{ $('Webhook').item.json.additional_fee }}\",\n  \"payment_qr_data\": \"{{ $('Webhook').item.json.payment_qr_data }}\",\n  \"line_items\": {{ $('Webhook').item.json.line_items.toJsonString() }}\n}",
        "templateId": {
          "__rl": true,
          "mode": "list",
          "value": "496040",
          "cachedResultName": "n8n Invoice Example (ID: 496040)"
        },
        "documentOutput": "url",
        "additionalFields": {}
      },
      "credentials": {
        "pdfGeneratorApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "44d10eb3-8b32-465d-8482-2bcd0791dd26",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        912,
        -224
      ],
      "parameters": {
        "color": 5,
        "width": 464,
        "height": 224,
        "content": "## PDF Generator API\nThe PDF Generator API node connects to the pdfgeneratorapi.com service. In this workflow, it dynamically generates a PDF document (like an invoice) by populating a custom document template\u2014which can be downloaded from this workflow's description\u2014using data passed from earlier steps. After generation, it uses a separate 'pdfServices' operation to encrypt the PDF with a password, ensuring the file is secure before it's sent to the customer."
      },
      "typeVersion": 1
    },
    {
      "id": "afa73496-801f-4ad4-a412-045466d88175",
      "name": "Upload file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        496,
        560
      ],
      "parameters": {
        "name": "={{ $('Generate Invoice ID').item.json.order_number }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive",
          "cachedResultUrl": "https://drive.google.com/drive/my-drive",
          "cachedResultName": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "16TmHxVNxPHVoXZX5_an_dPAeFCx_eGKb",
          "cachedResultUrl": "https://drive.google.com/drive/folders/16TmHxVNxPHVoXZX5_an_dPAeFCx_eGKb",
          "cachedResultName": "n8n_folder"
        },
        "inputDataFieldName": "={{ $json.filename }}"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "52a1e363-9295-4772-bdce-bbbe4027ebb9",
      "name": "Send a message + file",
      "type": "n8n-nodes-base.gmail",
      "position": [
        736,
        560
      ],
      "parameters": {
        "sendTo": "={{ $('Webhook').item.json.email }}",
        "message": "=Dear {{ $('Webhook').item.json.name}},\n\nPlease find your invoice ({{ $('Generate Invoice ID').item.json.order_number }}) attached.\n\nThe document is encrypted with your customer_id as a password.\n\nPayment details are included on the invoice. Please don't hesitate to reach out if you have any questions.\n\nWe appreciate your business.\n\nBest regards,",
        "options": {
          "attachmentsUi": {
            "attachmentsBinary": [
              {
                "property": "={{ $('Encrypt PDF document').item.json.filename }}"
              }
            ]
          }
        },
        "subject": "=Here's your {{ $('Generate Invoice ID').item.json.order_number }}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": false
    },
    {
      "id": "2093fdde-1ea0-4237-8bba-d52c014b50b3",
      "name": "Encrypt PDF document",
      "type": "@pdfgeneratorapi/n8n-nodes-pdf-generator-api.pdfGeneratorApi",
      "position": [
        1216,
        352
      ],
      "parameters": {
        "fileUrl": "={{ $json.response }}",
        "resource": "pdfServices",
        "operation": "encrypt",
        "outputFormat": "file",
        "ownerPassword": "={{ $('Webhook').item.json.customer_id }}"
      },
      "credentials": {
        "pdfGeneratorApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "1bf2294e-f7ea-4df1-b167-087052a7d957",
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Generate Invoice ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Send a message + file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Does not Exist": {
      "main": [
        [
          {
            "node": "Generate a PDF document",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Generate Invoice ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Invoice ID": {
      "main": [
        [
          {
            "node": "Check if ID Already Exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Encrypt PDF document": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate a PDF document": {
      "main": [
        [
          {
            "node": "Encrypt PDF document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if ID Already Exists": {
      "main": [
        [
          {
            "node": "If Does not Exist",
            "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

Creating and sending invoices manually is a major administrative bottleneck. It's not only slow but also prone to human error, such as creating duplicate invoice numbers or sending sensitive financial data in an unsecured format. This workflow solves these problems by creating a…

Source: https://n8n.io/workflows/10387/ — 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

Streamline and standardize your entire client onboarding process with a single end-to-end automation. 🚀📋 This workflow captures detailed client intake data via webhook, automatically creates a fully s

Slack, Asana, HTTP Request +4
Email & Gmail

Invoice_Workflow. Uses googleSheets, googleDrive, googleDocs, gmail. Webhook trigger; 19 nodes.

Google Sheets, Google Drive, Google Docs +4
Email & Gmail

✨🔪 Advanced AI Powered Document Parsing & Text Extraction with Llama Parse. Uses gmail, gmailTrigger, limit, stickyNote. Webhook trigger; 54 nodes.

Gmail, Gmail Trigger, HTTP Request +6
Email & Gmail

Description

Google Sheets, OpenAI, Gmail +1
Email & Gmail

Automate WhatsApp communication for recruitment agencies with an interactive, structured customer experience. This workflow handles pricing inquiries, request submissions, tracking, complaints, and hu

HTTP Request, Google Sheets, Gmail +1