AutomationFlowsEmail & Gmail › Google Sheets and Quickbooks Expenses Automation Template

Google Sheets and Quickbooks Expenses Automation Template

ByRosh Ragel @roshragel on n8n.io

This n8n workflow template automates the process of uploading categorized expenses from Google Sheets into QuickBooks Online. It leverages your Google Sheets data to create expense entries in QuickBooks with minimal manual effort, streamlining the accounting process. QuickBooks…

Event trigger★★★★☆ complexity16 nodesQuickBooksHTTP RequestGoogle Sheets
Email & Gmail Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:

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

This workflow follows the Google Sheets → HTTP Request 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": "4678f902-8b59-42f2-adab-f123ca1f637f",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -16,
        192
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5b68c737-5caa-4d36-b957-5b4458c759a8",
      "name": "Get Active Vendors in QuickBooks",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        880,
        0
      ],
      "parameters": {
        "filters": {},
        "resource": "vendor",
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "quickBooksOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "5f464de5-83b7-4fd2-9068-93422b2356bf",
      "name": "Get Chart of Accounts",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        432,
        192
      ],
      "parameters": {
        "url": "=https://sandbox-quickbooks.api.intuit.com/v3/company/{{ $json.realmID }}/query",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "query",
              "value": "select * from Account where active=true maxResults 500"
            },
            {
              "name": "minorversion",
              "value": "75"
            }
          ]
        },
        "nodeCredentialType": "quickBooksOAuth2Api"
      },
      "credentials": {
        "quickBooksOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.2
    },
    {
      "id": "0b295195-8e3b-4d64-b1ef-ca4dbfca84c9",
      "name": "Split Out Accounts",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        656,
        192
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "QueryResponse.Account"
      },
      "typeVersion": 1
    },
    {
      "id": "aaaa6cf5-8e29-42d1-a182-b4506dd73583",
      "name": "Add Accounts to Google Sheet Template",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        880,
        192
      ],
      "parameters": {
        "columns": {
          "value": {
            "ID": "={{ $json.Id }}",
            "Name": "={{ $json.Name }}",
            "Account Type": "={{ $json.AccountType }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Account Type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Account Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 124163501,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit#gid=124163501",
          "cachedResultName": "Accounts"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit?usp=sharing"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "a37448d0-6c95-4bf0-8504-3519abda9d49",
      "name": "Add an Expense to QBO",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "position": [
        880,
        384
      ],
      "parameters": {
        "url": "=https://sandbox-quickbooks.api.intuit.com/v3/company/{{ $('Set Realm ID for Custom API Call').item.json.realmID }}/purchase",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"PaymentType\": \"Cash\",\n  \"TxnDate\": \"{{ $json.Date.toDateTime('M/d/y').toFormat('yyyy-MM-dd') }}\",\n  \"PrivateNote\": \"{{ $json.Description }}\",\n  \"EntityRef\": {\n    \"value\": \"{{ $json['Vendor ID'] }}\"\n  },\n  \"AccountRef\": {\n    \"value\": \"{{ $json['Asset ID'] }}\"\n  },\n  \"Line\": [\n    {\n      \"DetailType\": \"AccountBasedExpenseLineDetail\",\n      \"Amount\": {{ $json.Total }},\n      \"AccountBasedExpenseLineDetail\": {\n        \"AccountRef\": {\n          \"value\": \"{{ $json['Expense ID'] }}\"\n        }\n      }\n    }\n  ]\n}\n",
        "sendBody": true,
        "sendQuery": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "minorversion",
              "value": "75"
            }
          ]
        },
        "nodeCredentialType": "quickBooksOAuth2Api"
      },
      "credentials": {
        "quickBooksOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "typeVersion": 4.2
    },
    {
      "id": "b1ed3c64-f832-4822-ae8a-2bf04cd7dd01",
      "name": "Get New Vendors from Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        208,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1066861641,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit#gid=1066861641",
          "cachedResultName": "Vendors"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit?usp=sharing"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "5ed5cff9-7c9a-48c0-90f7-fdb158e10983",
      "name": "Refresh Vendors in Google Sheet Template",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1104,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "ID": "={{ $json.Id }}",
            "Name": "={{ $json.DisplayName }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1066861641,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit#gid=1066861641",
          "cachedResultName": "Vendors"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit?usp=sharing"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "6de704e8-7007-4802-ac84-10f81ca21af3",
      "name": "Get New Expense Transactions",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        432,
        384
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "Transaction ID"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit#gid=0",
          "cachedResultName": "Expenses"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit?usp=sharing"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "17d09d9c-028a-4ccd-b2d7-1fc269e7fcca",
      "name": "Remove Duplicates",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        432,
        0
      ],
      "parameters": {
        "compare": "selectedFields",
        "options": {},
        "fieldsToCompare": "Name"
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "ff8d137b-b491-49e4-b656-81896a6bed0e",
      "name": "Remove Empties",
      "type": "n8n-nodes-base.if",
      "position": [
        656,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "2aa9700c-74c1-464a-bce8-beb2ce28c7da",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json['Transaction ID'] }}",
              "rightValue": ""
            },
            {
              "id": "481f12f7-e8d0-4c80-bb3c-c21850c8795c",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.Vendor }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "da89ac36-ba2b-431f-b2ff-345951d90a45",
      "name": "Record Txn ID in Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1104,
        288
      ],
      "parameters": {
        "columns": {
          "value": {
            "#": "={{ $('Remove Empties').item.json['#'] }}",
            "Transaction ID": "={{ $json.Purchase.Id }}"
          },
          "schema": [
            {
              "id": "#",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "#",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Description",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Total",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Total",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Vendor",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Vendor",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Asset Account",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Asset Account",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Expense Account",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Expense Account",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Transaction ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Transaction ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Message",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Vendor ID",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Vendor ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Asset ID",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Asset ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Expense ID",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Expense ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "#"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/10pdz8hvNsCWX6IogQ_Nyb2qlXmOHWtgsAH4EgAUKfSw/edit#gid=0",
          "cachedResultName": "Expenses"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/10pdz8hvNsCWX6IogQ_Nyb2qlXmOHWtgsAH4EgAUKfSw/edit?pli=1&gid=0#gid=0"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "fb36bbce-7b08-4ec1-aeaf-4fbc409a3f4c",
      "name": "Create New Vendors in QuickBooks",
      "type": "n8n-nodes-base.quickbooks",
      "onError": "continueRegularOutput",
      "position": [
        656,
        0
      ],
      "parameters": {
        "resource": "vendor",
        "operation": "create",
        "displayName": "={{ $json.Name }}",
        "additionalFields": {}
      },
      "credentials": {
        "quickBooksOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "615ced03-6162-494f-9006-7aef2b8f10b6",
      "name": "Set Realm ID for Custom API Call",
      "type": "n8n-nodes-base.set",
      "position": [
        208,
        288
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "df10e087-0f27-4d07-98ba-aee302ee5477",
              "name": "realmID",
              "type": "string",
              "value": ""
            }
          ]
        }
      },
      "executeOnce": true,
      "typeVersion": 3.4
    },
    {
      "id": "cd56254b-d062-40f0-87dc-f3c6d1bca8c3",
      "name": "Record Error Message",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1104,
        480
      ],
      "parameters": {
        "columns": {
          "value": {
            "#": "={{ $json['#'] }}",
            "Message": "={{ $json.error }}"
          },
          "schema": [
            {
              "id": "#",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "#",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Description",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Total",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Total",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Vendor",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Vendor",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Asset Account",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Asset Account",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Expense Account",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Expense Account",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Transaction ID",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Transaction ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Vendor ID",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Vendor ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Asset ID",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Asset ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Expense ID",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Expense ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Message",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "#"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/10pdz8hvNsCWX6IogQ_Nyb2qlXmOHWtgsAH4EgAUKfSw/edit#gid=0",
          "cachedResultName": "Expenses"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit?usp=sharing"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "cc3c8c70-63c7-4c48-bcd2-3c8321f7f489",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -800,
        -448
      ],
      "parameters": {
        "width": 660,
        "height": 2192,
        "content": "## Automatically Upload Expenses to QuickBooks from Google Sheets\n\n## What It Does\nThis n8n workflow template automates the process of uploading categorized expenses from Google Sheets into QuickBooks Online. It leverages your Google Sheets data to create expense entries in QuickBooks with minimal manual effort, streamlining the accounting process.\n\n## Prerequisites\n- **QuickBooks Online Credential**: Set up your QuickBooks Online connection in n8n for expense creation.\n- **Google Sheets Credential**: Set up your Google Sheets connection in n8n to read and write data.\n\n## How It Works\n1. **Refresh Google Sheets Data**: The workflow will first refresh the list of vendors and chart of accounts from your Google Sheets template.\n2. **Import Bank Transactions**: Open the provided Google Sheets template and copy-paste your transactions from your online banking CSV file.\n3. **Categorize Transactions**: Quickly categorize the transactions in Google Sheets, or assign this task to a team member.\n4. **Run the Workflow**: Once the transactions are categorized, run the workflow again, and each expense will be created automatically in QuickBooks Online.\n\n## Example Use Cases\n- **Small Business Owners**: Automatically track and upload monthly expenses to QuickBooks Online without manually entering data.\n- **Accountants**: Automate the transfer of bank transactions to QuickBooks, streamlining the financial process.\n- **Bookkeepers**: Quickly categorize and upload business expenses to QuickBooks with minimal effort.\n\n## Setup Instructions\n1. **Connect Your Google Sheets and QuickBooks Credentials**:  \n   - In n8n, connect your Google Sheets and QuickBooks accounts. Follow the credential setup instructions for both services.\n\n2. **Setup the Google Sheets Node**:  \n   - Link the specific Google Sheet that contains your expense data. Make sure the sheet includes the correct columns for transactions, vendors, and accounts.\n\n3. **Setup the QuickBooks Node**:  \n   - Configure the QuickBooks Online node to create expense entries in QuickBooks from the data in your Google Sheets.\n\n4. **Setup the HTTP Node for API Calls**:  \n   - Use the HTTP node to make custom API calls to QuickBooks\n\n5. **Configure the QuickBooks Realm ID**:  \n   - Obtain the QuickBooks Realm ID from your QuickBooks Online Developer account to use for custom API calls. This ensures the workflow targets the correct QuickBooks instance.\n\n## How to Use\n1. **Import Transactions**:  \n   - Copy and paste your bank transactions from the CSV into the provided Google Sheets template.\n\n2. **Categorize Transactions**:  \n   - Manually categorize the transactions in the sheet, or delegate this task to another person to ensure they\u2019re correctly tagged (e.g., Utilities, Office Supplies, Travel).\n\n3. **Run the Workflow**:  \n   - Execute the workflow to automatically upload the categorized expenses into QuickBooks.\n\n4. **Verify in QuickBooks**:  \n   - After the workflow runs, log into QuickBooks Online to confirm the expenses have been created and categorized correctly.\n\n## Free Google Sheets Template\nTo get started quickly, download my **free Google Sheets template** that includes pre-configured sheets for bank transactions, vendors, and chart of accounts. This template will make it easier for you to import and categorize your expenses before running the n8n workflow.\n\n[Download the Free Google Sheets Template](https://docs.google.com/spreadsheets/d/1dmkXHeMghVp5AHrdyU1vrwjUHWNaoDfkk9UOuG-SNKI/edit?usp=sharing)\n\n## Customization Options\n- **Category Mapping**: Customize how categories in Google Sheets are mapped to QuickBooks expense types.\n- **Additional API Calls**: Add custom API calls if you need extra functionality, such as creating custom reports or syncing additional data.\n- **Notifications**: Configure email or Slack notifications to alert you when the expenses have been successfully uploaded.\n\n## Why It's Useful\n- **Time-Saving**: Automatically upload and categorize expenses in QuickBooks without needing to enter them manually.\n- **Error Reduction**: Minimize human error by automating the process of uploading and categorizing transactions.\n- **Efficiency**: Connects Google Sheets to QuickBooks, making it easy to manage expenses in one place without having to toggle between multiple apps.\n- **Accuracy**: Syncs data between Google Sheets and QuickBooks in a structured, automated way for consistent and reliable financial reporting.\n- **Flexibility**: Allow external users or lower-permission employees to categorize financial transactions without providing direct access to QBO\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Remove Empties": {
      "main": [
        [
          {
            "node": "Add an Expense to QBO",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Duplicates": {
      "main": [
        [
          {
            "node": "Create New Vendors in QuickBooks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out Accounts": {
      "main": [
        [
          {
            "node": "Add Accounts to Google Sheet Template",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add an Expense to QBO": {
      "main": [
        [
          {
            "node": "Record Txn ID in Google Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Record Error Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Chart of Accounts": {
      "main": [
        [
          {
            "node": "Split Out Accounts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get New Expense Transactions": {
      "main": [
        [
          {
            "node": "Remove Empties",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create New Vendors in QuickBooks": {
      "main": [
        [
          {
            "node": "Get Active Vendors in QuickBooks",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Get Active Vendors in QuickBooks": {
      "main": [
        [
          {
            "node": "Refresh Vendors in Google Sheet Template",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Realm ID for Custom API Call": {
      "main": [
        [
          {
            "node": "Get Chart of Accounts",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get New Expense Transactions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get New Vendors from Google Sheets": {
      "main": [
        [
          {
            "node": "Remove Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get New Vendors from Google Sheets",
            "type": "main",
            "index": 0
          },
          {
            "node": "Set Realm ID for Custom API Call",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Accounts to Google Sheet Template": {
      "main": [
        []
      ]
    },
    "Refresh Vendors in Google Sheet Template": {
      "main": [
        []
      ]
    }
  }
}

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 n8n workflow template automates the process of uploading categorized expenses from Google Sheets into QuickBooks Online. It leverages your Google Sheets data to create expense entries in QuickBooks with minimal manual effort, streamlining the accounting process. QuickBooks…

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

Splitout Code. Uses manualTrigger, httpRequest, stickyNote, splitOut. Event-driven trigger; 46 nodes.

HTTP Request, Execute Workflow Trigger, Gmail +1
Email & Gmail

Automate CSV imports into HubSpot without the mess. Powered by n8n. Supercharged by Pollup AI.

HTTP Request, Execute Workflow Trigger, Gmail +1
Email & Gmail

AICARE Email Blast System. Uses googleDrive, httpRequest, googleSheets, gmail. Event-driven trigger; 39 nodes.

Google Drive, HTTP Request, Google Sheets +2
Email & Gmail

Get notified if the actual data release is positive or negative for the relevant currency. Use the Telegram chat message about the news release as a trigger to open a trading position in MetaTrader 4.

Google Calendar Trigger, Airtop, Telegram +2
Email & Gmail

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

Google Sheets Trigger, Google Sheets, Gmail +1