# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Separate Sales from Sale lists</strong></td><td>Use Sales for revenue and margin reporting, and Sale lists for product-level order analysis. Mixing them up leads to double-counting or mismatched totals.</td></tr><tr><td><strong>Join entities on shared IDs</strong></td><td>Most Cin7 entities share common identifiers (product ID, customer ID, supplier ID). Use Coupler.io's Join transformation to combine Sales + Products or Customers + Sale lists instead of exporting everything separately and stitching it in a spreadsheet.</td></tr><tr><td><strong>Use Append for multi-account setups</strong></td><td>If your business runs multiple Cin7 accounts (e.g., by region or brand), add each as a separate source block and use the Append transformation to consolidate all records into one destination.</td></tr><tr><td><strong>Start with a focused entity set</strong></td><td>Don't pull all 20 entities on day one. Start with the 3-4 most business-critical ones (typically Sales, Products, Product availabilities, and Customers), validate the data, then expand.</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>Sync Product availabilities frequently</strong></td><td>Stock levels change throughout the day. If you rely on availability data for decisions, schedule this entity to refresh every hour or every few hours rather than once daily.</td></tr><tr><td><strong>Store historical snapshots for inventory</strong></td><td>The Cin7 API returns current stock levels, not historical ones. If you need trend data, configure Coupler.io to append new runs rather than overwrite, so each sync adds a dated row to your history.</td></tr><tr><td><strong>Sync CRM entities less often</strong></td><td>Leads, Deals, and Opportunities change slowly. A daily or twice-daily refresh is usually enough and keeps you well within Cin7's API rate limits.</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>Split high-volume entities into their own data flows</strong></td><td>Sales and Purchase transaction tables can get large. Running them as standalone data flows prevents timeouts and makes it easier to debug issues independently of your other entities.</td></tr><tr><td><strong>Send large datasets to BigQuery, not Sheets</strong></td><td>If you're pulling years of sales or purchase history, Google Sheets will hit row limits quickly. Route high-volume Cin7 entities to BigQuery or another warehouse destination instead.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
Don't use Purchase lists and Purchases interchangeably. Purchase lists are line-item records; Purchases are transaction summaries. Aggregating the wrong one will give you inflated or incomplete cost figures.
{% endhint %}

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

* Validate totals against Cin7's own reports after the first run
* Use the Join transformation to enrich Sales data with product and customer details
* Check that your API user role has access to every module you're syncing
* Store dated inventory snapshots using append mode
  {% endcolumn %}

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

* Pull all entities at once without checking which ones your Cin7 plan supports
* Rely on a single daily sync for inventory data if stock accuracy is critical
* Overwrite historical sales data — use append mode to preserve transaction history
* Assume CRM entities will have data if you haven't enabled Cin7's CRM module
  {% endcolumn %}
  {% endcolumns %}
