# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Choose the right data source</strong></td><td>Use <strong>QuickBooks</strong> (entities) when you need raw transactional data like invoices, customers, or bills. Use <strong>QuickBooks Reports</strong> when you need formatted financial summaries like P&#x26;L, Balance Sheet, or General Ledger. Many teams use both — entities for granular data and reports for high-level dashboards.</td></tr><tr><td><strong>Set the accounting method explicitly</strong></td><td>Don't rely on the QuickBooks default. Add <code>accounting_method: Accrual</code> or <code>accounting_method: Cash</code> in the Query parameters to ensure consistency. This prevents confusion when your company default changes or when different team members set up data flows.</td></tr><tr><td><strong>Use Split by for line-item data</strong></td><td>When exporting Invoices, Bills, or other entities with multiple line items, set the <strong>Split by</strong> parameter to <code>Line</code>. This gives you one row per line item — essential for product-level analysis and accurate revenue breakdowns.</td></tr><tr><td><strong>Choose Flat structure for analytics destinations</strong></td><td>For detail reports (General Ledger, Profit and Loss Detail, Transaction List), select <strong>Flat structure</strong> instead of QuickBooks-style format. Flat structure gives you one row per transaction with all fields filled — much easier to filter, pivot, and use in BI tools.</td></tr></tbody></table>

## Data refresh and scheduling

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Daily refresh for most data</strong></td><td>Transactions in QuickBooks are typically entered during business hours, so a morning refresh captures the previous day's entries. Daily is the sweet spot for most accounting workflows.</td></tr><tr><td><strong>Hourly refresh for busy teams</strong></td><td>If multiple people are entering data throughout the day and you need near-real-time dashboards, switch to hourly refresh. This is especially useful during month-end close.</td></tr><tr><td><strong>Use date filters to limit scope</strong></td><td>Set the Where parameter to a fixed date range (e.g., <code>MetaData.CreateTime >= '2025-01-01'</code>) to pull only records from the period you need. For reports, use the Start and End date pickers to define your reporting window.</td></tr><tr><td><strong>Use incremental pulls for large datasets</strong></td><td>Avoid full historical pulls on every run. Use the Where parameter with <code>MetaData.LastUpdatedTime >= '2025-02-22'</code> (set to yesterday's date) to pull only recently modified records and append them to your destination.</td></tr></tbody></table>

## Performance optimization

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Stay under the 400,000-cell limit</strong></td><td>If a report is too large, split it into monthly data flows instead of pulling an entire year. Reduce columns by selecting only the ones you need, and filter by class, department, or customer to narrow the dataset.</td></tr><tr><td><strong>Filter at the API level</strong></td><td>Use the Where parameter to pre-filter entity data before it reaches your destination. This is much more efficient than pulling everything and filtering downstream.</td></tr><tr><td><strong>Select specific columns for detail reports</strong></td><td>Don't include multicurrency or location-tracking columns unless you actually need them — they add to the cell count and can slow down processing.</td></tr></tbody></table>

## Dashboard accuracy

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Keep accounting method consistent</strong></td><td>Make sure all data flows feeding the same dashboard use the same accounting method (Cash or Accrual). Mixing methods produces misleading totals. Add <code>accounting_method: Accrual</code> (or <code>Cash</code>) explicitly in Query parameters.</td></tr><tr><td><strong>Use Class and Department IDs, not names</strong></td><td>When filtering reports by class or department, use the entity IDs (numbers), not the display names. First export the Class or Department entity to get the ID-to-name mapping.</td></tr><tr><td><strong>Align report periods when combining data</strong></td><td>When combining data from multiple reports (e.g., P&#x26;L Summary + Balance Sheet), ensure the date ranges match exactly. A one-day mismatch can cause reconciliation issues.</td></tr><tr><td><strong>Budget vs. actual comparisons</strong></td><td>Combine the Budget entity (for budget figures) with the Profit and Loss Summary report (for actuals). Note that budget line items may need additional processing due to their nested format.</td></tr></tbody></table>

## Common pitfalls to avoid

{% columns %}
{% column %}
**Do**

* Set `accounting_method` explicitly in Query parameters
* Use `Active IN (false, true)` when you need inactive records
* Use `Split by = Line` for invoice line-item exports
* Choose Flat structure for BI tool destinations
* Split large reports into monthly data flows
  {% endcolumn %}

{% column %}
**Don't**

* Don't assume QuickBooks returns inactive records — it doesn't by default
* Don't expect custom QBO reports to appear in Coupler.io — only the predefined report types are available
* Don't use Display columns by Class and Month simultaneously — the API only supports one grouping dimension at a time
* Don't ignore the 400,000-cell limit — your data will be silently truncated
* Don't use OR in the Where parameter — only AND is supported
  {% endcolumn %}
  {% endcolumns %}

{% hint style="danger" %}
**Custom reports are not supported.** Coupler.io pulls from QuickBooks' predefined report types via the API. Custom reports you've created in the QuickBooks UI won't appear in the report dropdown. Instead, use the closest predefined report and apply query parameters (class, department, customer, date filters) to get equivalent results.
{% endhint %}
