{
  "id": "HryakGwRjy2LO1wa",
  "name": "Real-Time QuickBooks Invoice Sync to Slack",
  "tags": [],
  "nodes": [
    {
      "id": "4cbf005e-2368-4c6d-b3ab-e3530953ad40",
      "name": "QuickBooks Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        120,
        900
      ],
      "parameters": {
        "path": "quickbooks-invoice",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1
    },
    {
      "id": "0537ea5b-7013-4190-97ae-6e54501049bc",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        1300,
        900
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  return {\n    json: {\n      ID: item.json.Id,\n      Domain: item.json.domain,\n      \"Customer Name\": item.json.CustomerRef?.name || \"\",\n      \"Due Date\": item.json.DueDate || \"\"\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "edb8d672-8327-4218-810e-17fc6a24d35f",
      "name": "Get an invoice",
      "type": "n8n-nodes-base.quickbooks",
      "position": [
        740,
        900
      ],
      "parameters": {
        "resource": "invoice",
        "invoiceId": "={{ $json.body.eventNotifications[0].dataChangeEvent.entities[0].id }}"
      },
      "typeVersion": 1
    },
    {
      "id": "75b72ba9-98a1-4369-a930-2189e3cead72",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -40
      ],
      "parameters": {
        "color": 3,
        "width": 480,
        "height": 360,
        "content": "## \ud83d\udee0\ufe0f Prerequisites\n\nBefore running this workflow, make sure the following are set up:\n\n1. **QuickBooks Webhook Configuration**  \n   - Connect the **production URL** of your webhook to the **Intuit Developer Portal** for your specific company.  \n   - Ensure **Invoice** events are subscribed and activated (e.g., create, update, delete).\n\n2. **Slack account Integration**  \n   - Connect your **Slack client credentials**.  \n\n\nOnce these are in place, your workflow will seamlessly capture and log every invoice change in real time. \ud83d\ude80\ud83d\udcca\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ca26318b-5b28-4f13-b46e-ec7c6e055579",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -60,
        1040
      ],
      "parameters": {
        "width": 380,
        "height": 360,
        "content": "### Step 1: Webhook Trigger Activated! \ud83e\ude9d\ud83d\udce2\n\nThis node is the **starting point** of the workflow.\n\nIt listens for **invoice changes in QuickBooks**\n\nWhat it does:\n\n- \ud83d\udce1 Captures the event in real time from QuickBooks.\n- \ud83d\udce6 Passes the invoice data into the workflow instantly.\n- \ud83d\udd04 Eliminates the need for manual checks or periodic polling.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "de869e01-8b5d-40f6-a441-367ed61d32cd",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        480
      ],
      "parameters": {
        "color": 5,
        "width": 460,
        "height": 400,
        "content": "### Step 2: Invoice Data Fetcher \ud83d\udcc4\ud83d\udd0d\n\nThis node uses the **Get an Invoice** operation to pull full details of the invoice from QuickBooks.\n\nWhy this step is important:\n\n- \u2705 Retrieves complete and up-to-date invoice information.\n- \ud83d\udcca Captures fields like invoice number, date, customer.\n- \ud83e\uddfe Ensures the Google Sheet reflects the exact state of the invoice at the moment of the event.\n\nIt\u2019s the step that turns a simple event notification into a fully detailed record. \ud83d\udce5\u2728\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9e919726-2e33-4d1a-90af-ce811a5435c0",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1140,
        1040
      ],
      "parameters": {
        "color": 3,
        "width": 420,
        "height": 320,
        "content": "### Step 3: JSON Formatter \ud83d\udee0\ufe0f\ud83d\udce6\n\nThis **Code** node takes the raw invoice data from QuickBooks and formats it into a clean, structured JSON object\u2014ready to be sent to Slack channel\n\nWhat it does:\n\n- \ud83e\uddf9 Extracts only the necessary fields (e.g., id, domain, Customer Name, Due Date).\n- \ud83d\udd04 Converts the data into the correct order and structure for the message.\n- \ud83d\udcd0 Ensures consistent formatting so every message in the channel stays organized.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7e01de38-6b16-48fa-b125-dd0da09472de",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1700,
        440
      ],
      "parameters": {
        "color": 6,
        "width": 540,
        "height": 440,
        "content": "### Step 4: Slack Message Generator \ud83d\udcac\u26a1\n\nThis node creates a **custom message** to notify your Slack channel about the new or updated invoice.\n\n**Sample message format**:  \n> Invoice having ID: `160` having the Domain: `QBO` for the customer `Rondonuwu Fruit and Vegi` which is due on `2025-09-07` has been generated successfully.\n\nWhat it does:\n\n- \ud83e\udde0 Dynamically fills in invoice details (ID, Domain, Customer Name, Due Date).\n- \ud83d\udce2 Prepares a human-readable message for instant team updates.\n- \u2705 Keeps everyone in the loop without having to check QuickBooks manually.\n\nClear, concise, and delivered straight to your Slack workspace. \ud83d\udce1\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0bd08387-d175-44f4-8f83-d37792c76de0",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        1960,
        900
      ],
      "parameters": {
        "text": "=Invoice having ID: {{ $json.ID }} having the Domain: {{ $json.Domain }} for the customer {{ $json[\"Customer Name\"] }} which is due on {{ $json[\"Due Date\"] }} has been generated successfully\n",
        "select": "channel",
        "blocksUi": "=[\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": \"Invoice having ID: {{ $json.ID }} having the Domain: {{ $json.Domain }} for the customer {{ $json['Customer Name'] }} which is due on {{ $json['Due Date'] }} has been generated successfully\"\n    }\n  }\n]\n",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "{YOUR_SLACK_CHANNEL_ID}",
          "cachedResultName": "n8nmessages"
        },
        "messageType": "block",
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.3
    },
    {
      "id": "33917945-18e9-4a9a-8bf2-9bb131838de5",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1880,
        1120
      ],
      "parameters": {
        "color": 3,
        "width": 420,
        "height": 320,
        "content": "### Get in Touch\n\nPlease feel free to reachout to us, if you need any help in settin up this workflow.\n\nWe can also help customize workflow pet the use-case. \n\nReach out us at: getstarted@intuz.com\n\nWebsite: https://www.intuz.com/\n\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "51ee5907-ffb1-46fe-8ea9-cda24f3190a9",
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get an invoice": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "QuickBooks Webhook": {
      "main": [
        [
          {
            "node": "Get an invoice",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}