Automate your billing process by generating QuickBooks Online (QBO) invoices directly from your Monday.com orders. This guide explains how the integration maps your Monday parent items and subitems into a complete QBO invoice, including custom business logic for sorting and filtering line items.
flowchart TD
A["Monday.com Order Updated"] --> B["Fetch Order & Subitems"]
B --> C{"Is product Standard Delivery?"}
C -- Yes --> D["Skip Line Item"]
C -- No --> E["Sort & Format Line Items"]
E --> F["Create QBO Invoice"]
F -- Success --> G["Update Monday: 'Delivered' + Invoice Link"]
F -- Failure --> H["Update Monday: 'Invoice Error'"]How the integration works
The workflow listens for specific column changes on your Orders board. Once triggered, it gathers all necessary data from the parent order and its associated subitems, formats it for QuickBooks, and generates the invoice. Finally, it updates the Monday.com order with the new invoice details.
- 1
Trigger the workflow
The process begins automatically when a specific column value (like a status change) is updated on the Monday.com Orders board.
- 2
Fetch and prepare data
A background script retrieves the parent order details and all connected subitems from the Subitems of Orders board. It sorts the items, applies filtering rules, and formats the text.
- 3
Create the QuickBooks invoice
The formatted data is sent to QuickBooks Online. The integration creates a new invoice, attaching the correct customer, billing details, and line items.
- 4
Update Monday.com
Upon success, the Monday.com order is updated with the QBO Invoice Link, the QBO Document Number, and the Deal Stage is changed to Delivered.
If the invoice creation fails, the integration automatically updates the Monday.com Deal Stage to Invoice Error so your team can investigate.
Data mapping reference
To ensure your invoices are generated accurately, your Monday.com boards must contain specific columns. Here is how the data maps from Monday.com to QuickBooks Online.
Parent Order mapping
These fields are pulled from the main item on the Orders board (Board ID: 7932413985).
| Monday.com Column | QuickBooks Online Field | Notes |
|---|---|---|
| Order Number | Invoice Number | |
| Client Email Address | Billing Email | |
| Team Member | Custom Field: Sales Rep | |
| Tax | Total Tax | |
| Scheduled | Transaction Date | |
| Client Type | Ship Via | |
| Site ID | Custom Field: Site ID | |
| Address for Total | Message / Note | The cfAddress field is automatically truncated to 31 characters. |
Subitem mapping
These fields are pulled from the Subitems of Orders board (Board ID: 7932414329) to create the individual line items on the invoice.
| Monday.com Subitem Column | QuickBooks Online Field |
|---|---|
| QBO Product ID | Product/Service |
| Quantity | QTY |
| Price | Rate/Amount |
| Title Sort | Used internally to sort line items |
Standard Delivery Exception
Any subitem with the QBO Product ID 1010000449 (Standard Delivery) is hardcoded to be skipped. It will never be included on the generated invoice.
Advanced: Custom data preparation
For administrators maintaining this integration, the data preparation step uses a custom GraphQL query to Monday.com's API (v2) to fetch parent and subitem data simultaneously.
View the data preparation logic
The integration uses custom JavaScript to flatten the Monday.com column values, filter out skipped products, and sort the line items before sending them to QuickBooks.
// Filter out Standard Delivery and map subitems
const lines = item.subitems
.map(s => flat(s.column_values))
.filter(v => v[COL.product] && !SKIP.includes(v[COL.product]));
// Sort line items based on the 'Title Sort' column
// Blank sort values are pushed to the end
const key = v => (v[COL.sort] === '' ? 1e9 : Number(v[COL.sort]));
lines.sort((a, b) => key(a) - key(b));
// Truncate address for QuickBooks custom field limits
const cfAddress = message.slice(0, 31);