← All Newsletter & ESP Workflows
BillionVerifyQuickbooks Online

Gmail and QuickBooks Online workflow

Pull contacts, verify each address with BillionVerify, and continue to QuickBooks Online — only deliverable addresses get through.

Why verify before the send

Sending to invalid, risky, catch-all, or disposable addresses spikes your bounce rate and erodes sender reputation. A verification gate before the QuickBooks Online step removes that risk automatically — only deliverable addresses continue, the rest are flagged.

The workflow

BillionVerify — verification sits right before the send.

Node by node

  1. 1
    Every Day at 8 AMTrigger· n8n

    Starts the workflow — on a schedule, a webhook, or manually while you test.

  2. 2
    New Email Receipt ReceivedTrigger· n8n

    Starts the workflow — on a schedule, a webhook, or manually while you test.

  3. 3
    Verify Email (BillionVerify)Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  4. 4
    IF deliverableLogic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  5. 5
    Get New Receipt from EmailSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  6. 6
    Verify Email (BillionVerify) 2Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  7. 7
    IF deliverable 2Logic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  8. 8
    Forward the Receipt to QBOSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  9. 9
    Verify Email (BillionVerify) 3Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  10. 10
    IF deliverable 3Logic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  11. 11
    Remove the Old LabelSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  12. 12
    Verify Email (BillionVerify) 4Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  13. 13
    IF deliverable 4Logic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  14. 14
    Add the "Processed" LabelSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

Workflow JSON

Copy or download this workflow, then import it in n8n (Workflows → Import from File / Paste). Install the BillionVerify community node first, then add your API key credential.

verify-emails-in-quickbooks-online.json
{
  "name": "Gmail and QuickBooks Online workflow + BillionVerify",
  "nodes": [
    {
      "id": "030584dd-ad50-49e3-a12e-49ccd867ae8c",
      "name": "Every Day at 8 AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -80,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "6b5f5472-b602-4775-b010-5b5a0fe77be5",
      "name": "New Email Receipt Received",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -80,
        -192
      ],
      "parameters": {
        "filters": {
          "labelIds": [
            "Label_1709246557347095595"
          ]
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "bbd5cdaf-905a-4f5d-abb8-ff736e4b5aa9",
      "name": "Get New Receipt from Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        176,
        -96
      ],
      "webhookId": "449f7eea-0be5-4d86-a254-ef047b9f8d67",
      "parameters": {
        "simple": false,
        "filters": {
          "labelIds": [
            "Label_1709246557347095595"
          ]
        },
        "options": {},
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "6f5e3ebf-fef1-4508-be4e-0e7d9f106c01",
      "name": "Forward the Receipt to QBO",
      "type": "n8n-nodes-base.gmail",
      "position": [
        416,
        -96
      ],
      "webhookId": "0a979bd8-edd5-468e-8eab-4a914e2f80c3",
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.html }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "Email Receipt"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "2c05914d-8b61-4449-b55f-fe280939446c",
      "name": "Remove the Old Label",
      "type": "n8n-nodes-base.gmail",
      "position": [
        656,
        -96
      ],
      "webhookId": "722818d7-391e-428b-b173-fe5bb744f54c",
      "parameters": {
        "labelIds": [
          "Label_1709246557347095595"
        ],
        "messageId": "={{ $('Get New Receipt from Email').item.json.id }}",
        "operation": "removeLabels"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "1cab2ebf-4f27-401c-a65e-d98486d367e7",
      "name": "Add the \"Processed\" Label",
      "type": "n8n-nodes-base.gmail",
      "position": [
        864,
        -96
      ],
      "webhookId": "0bf6f5ce-90be-4789-9e1f-415988c600c3",
      "parameters": {
        "labelIds": [
          "Label_3375203355533515697"
        ],
        "messageId": "={{ $('Get New Receipt from Email').item.json.id }}",
        "operation": "addLabels"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "5645be8e-7cfc-47be-b492-9901877fb0d5",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -928,
        -752
      ],
      "parameters": {
        "width": 736,
        "height": 1328,
        "content": "## Automatically Forward Email Receipts to QuickBooks Online\n\n## What It Does  \nAre you tired of manually uploading email receipts to QuickBooks Online (QBO)? Are your email forwarding rules difficult to set up or unreliable? This n8n workflow automatically forwards your email receipts to QuickBooks Online with minimal configuration.\n\n## Example Use Cases  \n- Online purchase and subscription receipts  \n- E-transfer confirmations  \n- Bills and invoices received from suppliers  \n- Expense reports sent by vendors  \n- Payment confirmation emails\n- Send other people's emails to QBO, bypassing the forwarding restrictions\n\n## Prerequisites  \nTo use this workflow, you'll need:  \n- A Gmail account with credentials configured in n8n  \n- QuickBooks Online account with receipt forwarding enabled  \n\n## How to Set Up Gmail  \n1. Search for emails that contain receipts (e.g., subject contains \"Interac E-transfer\")  \n2. Create a Gmail filter that automatically applies a specific label to those emails (e.g., \"New E-Transfer\")  \n3. Create another label for processed emails to prevent duplicate processing (e.g., \"Processed\")  \n\n## How It Works  \n1. **Trigger:** The workflow runs when a new receipt is received; a scheduled trigger acts as a failsafe to catch missed emails.  \n2. The first Gmail node retrieves emails with the \"new receipt\" label.  \n3. The second Gmail node forwards the exact email contents to QuickBooks Online, mimicking a forwarded email.  \n4. The workflow removes the original \"new receipt\" label and applies the \"processed\" label to avoid duplicate forwarding.  \n\n## How to Use  \n- Configure each Gmail node with your Gmail credentials in n8n.  \n- Enter your QuickBooks Online receipt forwarding email address in the second Gmail node (e.g., example@qbdocs.com).  \n- Set up the appropriate labels in each Gmail node to match your Gmail filter and workflow logic.  \n\n## Customization Options  \n- Modify the Gmail nodes to download and forward attachments if necessary.  \n- Create separate workflows for different types of emails; for example, include vendor information in the subject line (e.g., \"Your Instacart Order Receipt\") to help QuickBooks categorize expenses.  \n- Add error handling and notifications to monitor workflow execution.  \n\n## Why It's Useful  \n- Saves time by automating manual forwarding of receipts to QuickBooks Online.  \n- Reduces errors and missed receipts that can occur with manual processing.  \n- Keeps your QuickBooks records up-to-date automatically.  \n- Provides a scalable solution for handling various receipt types and vendors.  \n- Easily customizable to fit your specific email and accounting workflows.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "214f3e76-bad5-485e-a093-e302642c7adf",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 288,
        "content": "This node will look for emails with the label you've selected"
      },
      "typeVersion": 1
    },
    {
      "id": "813e7187-18e0-4d52-b39c-142de6041603",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        352,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 288,
        "content": "Please setup your QBO forwarding address here"
      },
      "typeVersion": 1
    },
    {
      "id": "a50aac4a-8fb7-457b-a3dc-55879f50c547",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 448,
        "height": 288,
        "content": "This process prevents duplicate emails from being sent to QBO"
      },
      "typeVersion": 1
    },
    {
      "id": "3d24c1e3-e40d-4f05-baff-7b5e34bec23b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        -352
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 512,
        "content": "The workflow executes when a new email with the matching label is received.\n\nA failsafe checks for emails that may have been missed"
      },
      "typeVersion": 1
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        -184,
        -96
      ],
      "name": "Verify Email (BillionVerify)",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        -4,
        -96
      ],
      "name": "IF deliverable"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        56,
        -96
      ],
      "name": "Verify Email (BillionVerify) 2",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        236,
        -96
      ],
      "name": "IF deliverable 2"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        296,
        -96
      ],
      "name": "Verify Email (BillionVerify) 3",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        476,
        -96
      ],
      "name": "IF deliverable 3"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        504,
        -96
      ],
      "name": "Verify Email (BillionVerify) 4",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        684,
        -96
      ],
      "name": "IF deliverable 4"
    }
  ],
  "connections": {
    "Every Day at 8 AM": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove the Old Label": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Forward the Receipt to QBO": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get New Receipt from Email": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New Email Receipt Received": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Email (BillionVerify)": {
      "main": [
        [
          {
            "node": "IF deliverable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable": {
      "main": [
        [
          {
            "node": "Get New Receipt from Email",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 2": {
      "main": [
        [
          {
            "node": "IF deliverable 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 2": {
      "main": [
        [
          {
            "node": "Forward the Receipt to QBO",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 3": {
      "main": [
        [
          {
            "node": "IF deliverable 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 3": {
      "main": [
        [
          {
            "node": "Remove the Old Label",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 4": {
      "main": [
        [
          {
            "node": "IF deliverable 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 4": {
      "main": [
        [
          {
            "node": "Add the \"Processed\" Label",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {}
}

When to use this

  • Cleaning a list before a QuickBooks Online send or sync.
  • Protecting QuickBooks Online deliverability and sender reputation.
  • Keeping bounce rates low so your sending is never throttled.

FAQ

Why verify before sending in QuickBooks Online?

Verifying first keeps your bounce rate low, which protects your sender reputation and your results.

How do I import this workflow?

Download the JSON, then in n8n go to Workflows → Import from File (or paste it). Install the BillionVerify community node and add your API key credential.

What happens to risky or catch-all addresses?

They are routed to the false branch and excluded from the send. You decide whether to retry, review, or drop them.

Add verification to your workflow

Create a free account, grab your API key, and stop bounces before they happen.

Get started free