AutomationFlowsEmail & Gmail › Automate Payment Receipts: Email, Archive, and Track with Stripe and Google…

Automate Payment Receipts: Email, Archive, and Track with Stripe and Google…

Original n8n title: Automate Payment Receipts: Email, Archive, and Track with Stripe and Google Workspace

ByRahul Joshi @rahul08 on n8n.io

This workflow automates the process of retrieving Stripe invoices, validating API responses, generating payment receipts, sending them via email, storing PDFs in Google Drive, and appending details to a Google Sheet ledger. It also includes an error logging system to capture and…

Event trigger★★★★☆ complexity21 nodesHTTP RequestGmailGoogle DriveGoogle Sheets
Email & Gmail Trigger: Event Nodes: 21 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #8955 — 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": "gr2rafzxOw1ks4Bd",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Archive Payment Receipts with Stripe, Google Drive, and Google Sheets",
  "tags": [],
  "nodes": [
    {
      "id": "cdfad755-0724-4156-b4ec-04a671a85013",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1104,
        -32
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "a511f05a-495d-4066-af54-9b977ca59aec",
      "name": "Fetch Invoices",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -848,
        -32
      ],
      "parameters": {
        "url": "https://api.stripe.com/v1/invoices?limit=5",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer ${{credential.stripe.secret.key}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "c24bc890-1e3e-4334-88a2-69fcd2c0be5e",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -928,
        128
      ],
      "parameters": {
        "height": 272,
        "content": "Fetch Invoices\n\nDescription: Makes an authenticated request to the Stripe API and retrieves the 5 most recent invoices. This serves as the raw dataset that contains invoice details such as customer information, amounts, statuses, and hosted invoice URLs.\nAction: Fetches invoice data from Stripe."
      },
      "typeVersion": 1
    },
    {
      "id": "1d8ec260-aa38-4dfa-8f73-98ea5e5e671c",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        656,
        -544
      ],
      "parameters": {
        "height": 288,
        "content": "Send Receipt Email \u2013 \n\nDescription: Sends an email to the customer using the invoice details (customer name, invoice number, amount, etc.). The previously downloaded invoice PDF is attached automatically. This ensures the customer receives a formal receipt directly in their inbox.\nAction: Sends a payment receipt email with the PDF attached."
      },
      "typeVersion": 1
    },
    {
      "id": "94dac976-2243-463c-8ac0-5bf2b3061a95",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        80
      ],
      "parameters": {
        "height": 240,
        "content": "Download File \n\nDescription: Uses the invoice\u2019s hosted PDF link (invoice_pdf) to fetch the actual receipt document. It retrieves the PDF from Stripe as binary data, making it usable as an email attachment or for archiving.\nAction: Downloads the invoice PDF from Stripe."
      },
      "typeVersion": 1
    },
    {
      "id": "afba0c2a-08e2-4d19-ab7f-29e79b70c29a",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        -352
      ],
      "parameters": {
        "height": 256,
        "content": "IF (Already Receipted?) \n\nDescription: Looks into the invoice metadata field receipt_sent. If the receipt has already been generated and sent, the workflow will skip. Otherwise, it continues to generate and send the receipt email.\nAction: Filters out invoices that already have a receipt sent."
      },
      "typeVersion": 1
    },
    {
      "id": "64a4d0dc-6d8f-4728-adaf-ce509afce060",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        96
      ],
      "parameters": {
        "height": 224,
        "content": "IF (Paid?)\n\nDescription: Evaluates whether the invoice is marked as status = paid. Only paid invoices should move forward to receipt generation. Unpaid or draft invoices are skipped here.\nAction: Routes invoices based on payment status."
      },
      "typeVersion": 1
    },
    {
      "id": "d776ef15-e417-4449-a2a5-e1c53319f87e",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -368
      ],
      "parameters": {
        "height": 288,
        "content": "Expand List\n\nDescription: Since Stripe returns a bundled list of invoices, this node breaks them into individual records. That way, each invoice can be independently evaluated (paid/unpaid, receipted/unreceipted) and processed correctly in subsequent steps.\nAction: Splits Stripe\u2019s invoice list into single invoice items."
      },
      "typeVersion": 1
    },
    {
      "id": "8c3f5034-5e26-429d-9d30-4f56dd99db5d",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        288
      ],
      "parameters": {
        "height": 288,
        "content": "Append to Ledger \n\nDescription: Adds a new row in the \u201cPayment Receipts\u201d Google Sheet ledger with key invoice details such as date, invoice number, file name, Drive link, file ID, and file size. This acts as your permanent record of receipts for accounting and tracking purposes.\nAction: Updates the Google Sheet with invoice + Drive file metadata."
      },
      "typeVersion": 1
    },
    {
      "id": "aacfb7d2-7acb-4b1a-a7c7-39069a01055f",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        704,
        272
      ],
      "parameters": {
        "height": 208,
        "content": "Upload Invoice PDF \n\nDescription: Uploads the invoice PDF into a specific Google Drive folder. The file is named according to the invoice number, making it easy to search and retrieve later.\nAction: Stores the invoice PDF in Google Drive."
      },
      "typeVersion": 1
    },
    {
      "id": "b107aa2b-90b9-48fe-98dc-d828012444e7",
      "name": "Expand List",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -336,
        -48
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "=data"
      },
      "typeVersion": 1
    },
    {
      "id": "a83ac85d-4737-44bc-877e-6844389a9689",
      "name": "IF (Paid?)",
      "type": "n8n-nodes-base.if",
      "position": [
        -128,
        -48
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3e81fec9-095e-4ada-b6d0-1e7db2d0b446",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "paid"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d7fec273-c100-43bf-9ddc-311f31b34493",
      "name": "IF (Already Receipted?)",
      "type": "n8n-nodes-base.if",
      "position": [
        128,
        -64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "b8f92661-228b-457c-b6ae-263ba3b034da",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.metadata.receipt_sent }}",
              "rightValue": "false"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c2dbb175-469f-4c19-8466-08afba27115d",
      "name": "Download File",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        464,
        -80
      ],
      "parameters": {
        "url": "={{$json[\"invoice_pdf\"]}}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "49c0e75c-8b77-4d43-bc71-60b6bd02519a",
      "name": "Send Receipt Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        736,
        -240
      ],
      "parameters": {
        "sendTo": "={{$json.customer_email}}",
        "message": "=Hi {{$json.customer_name}},  \n\nThanks for your payment.  \nAttached is your receipt for invoice {{$json.number}} (Total: {{$json.currency}} {{$json.total}}).  \n\nRegards,  \nYour Company\n",
        "options": {
          "attachmentsUi": {
            "attachmentsBinary": [
              {}
            ]
          }
        },
        "subject": "=Payment Receipt - Invoice {{$json.number}}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "b4401084-8c70-47f3-8804-637c9bef9834",
      "name": "Upload Invoice PDF",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        768,
        112
      ],
      "parameters": {
        "name": "={{$json[\"number\"]}}.pdf",
        "driveId": {
          "__rl": true,
          "mode": "url",
          "value": "{{YOUR_GOOGLE_DRIVE_URL}}"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "{{YOUR_URL}}"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "1efedacb-1e07-4e23-ab7c-19e0e21b6b08",
      "name": "Append to Ledger",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1040,
        112
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "url",
          "value": "{{YOUR_URL}}"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "{{YOUR_SPREADSHEET_URL}}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "f535062a-1ced-46d3-8b4e-73aaeb6c6e3b",
      "name": " Error Logging",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -384,
        272
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "url",
          "value": "{{YOUR_URL}}"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "{{YOUR_SPREADSHEET_URL}}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "6f14b401-170b-4fb8-ae5d-aa079f7549cb",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -464,
        432
      ],
      "parameters": {
        "height": 320,
        "content": "Action: Logs workflow errors and failures to a dedicated error tracking spreadsheet for monitoring and debugging purposes. \n\nDescription: This Google Sheets append node serves as the error logging destination for your workflow's error handling system. When API calls fail, data validation errors occur, or other workflow issues arise, this node captures the error details and appends them as new rows to your \"error log sheet\"."
      },
      "typeVersion": 1
    },
    {
      "id": "4cd976cd-8739-47ad-bddd-25d0973c3cd8",
      "name": "Check API Response",
      "type": "n8n-nodes-base.if",
      "position": [
        -608,
        -32
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e2130860-3ee5-490c-9eb0-6a6e02e9f41e",
              "operator": {
                "type": "array",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.data }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "89781301-0ca4-4dc7-924f-0ea978d6bc83",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        -400
      ],
      "parameters": {
        "height": 336,
        "content": "Action: Validates that the Stripe API returned a proper data array before attempting to process invoices. \n\nDescription: This conditional node acts as a data quality gate that prevents the workflow from breaking when the Stripe API returns unexpected or empty responses. It specifically checks for the existence of the data array in the API response, which is the standard structure that Stripe uses to return collections of objects like invoices, payments, or disputes."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "d54ecc14-b03b-46b3-88c8-1b25d10351db",
  "connections": {
    "IF (Paid?)": {
      "main": [
        [
          {
            "node": "IF (Already Receipted?)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Expand List": {
      "main": [
        [
          {
            "node": "IF (Paid?)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download File": {
      "main": [
        [
          {
            "node": "Send Receipt Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Upload Invoice PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Invoices": {
      "main": [
        [
          {
            "node": "Check API Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check API Response": {
      "main": [
        [
          {
            "node": "Expand List",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": " Error Logging",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Receipt Email": {
      "main": [
        []
      ]
    },
    "Upload Invoice PDF": {
      "main": [
        [
          {
            "node": "Append to Ledger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF (Already Receipted?)": {
      "main": [
        [
          {
            "node": "Download File",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Fetch Invoices",
            "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 process of retrieving Stripe invoices, validating API responses, generating payment receipts, sending them via email, storing PDFs in Google Drive, and appending details to a Google Sheet ledger. It also includes an error logging system to capture and…

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

Tags: Supply Chain Management, Logistics, Transportation

Telegram Trigger, Telegram, Google Drive +2
Email & Gmail

This workflow implements a lightweight authentication system for n8n web portals using Google Sheets as a simple user and session store. It supports email-based registration, username and password log

Google Sheets, Form Trigger, Gmail +1
Email & Gmail

Shopify and E-Commerce store owners often struggle to create engaging 3D videos from static product images. This workflow automates that entire process—from image upload to video delivery—so store own

Form Trigger, Google Drive, HTTP Request +2
Email & Gmail

This workflow automates the bulk generation and delivery of personalized certificates using Google Sheets, Google Slides, Google Drive, and Gmail.

HTTP Request, Google Drive, Google Sheets +1
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