# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Split entities into separate sources within one data flow</strong></td><td>Rather than creating separate data flows for each entity, add Leads, Contacts, and Opportunities as multiple sources in a single data flow. Use Join transformations to connect them on shared fields like lead_id.</td></tr><tr><td><strong>Always sync the Users entity alongside activity data</strong></td><td>Almost every activity entity (calls, emails, tasks) references users by ID only. Include Users as a source and join on user_id so your reports show rep names instead of opaque identifiers.</td></tr><tr><td><strong>Use Append to unify task types</strong></td><td>Close.com splits tasks across many entities (lead tasks, missed call tasks, voicemail tasks, etc.). Use the Append transformation to combine them into a single unified task list for follow-up dashboards.</td></tr><tr><td><strong>Pull custom field definitions alongside record data</strong></td><td>Sync Lead custom fields, Contact custom fields, and Opportunity custom fields alongside your core entities. Join on field IDs to replace cryptic column names with human-readable labels in your destination.</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>Set a start date for high-volume entities</strong></td><td>The Events, Call activities, and Email activities entities can contain millions of rows for active teams. Use the date picker to set a rolling start date and avoid pulling your entire history on every run.</td></tr><tr><td><strong>Schedule activity syncs more frequently than configuration syncs</strong></td><td>Entities like Leads, Opportunities, and Call activities change daily — schedule these at higher frequency. Configuration entities like Pipelines, Roles, and Email templates change rarely and can sync weekly.</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>Use BigQuery for large activity datasets</strong></td><td>If you're syncing Call activities, Email activities, or Events for a large team, route the data to BigQuery rather than Google Sheets. Sheets struggles with tens of thousands of rows, while BigQuery handles it cleanly.</td></tr><tr><td><strong>Aggregate opportunity data before sending to dashboards</strong></td><td>Use Coupler.io's Aggregate transformation to pre-calculate pipeline totals, win rates, and average deal values. This keeps your destination lean and your Looker Studio or ChatGPT queries fast.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
Opportunity values are stored in cents. If you report on deal value without dividing by 100, your pipeline totals will be off by a factor of 100.
{% endhint %}

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

* Divide the `value` field by 100 when using opportunity amounts in reports
* Join Users to any activity entity before sharing reports with stakeholders
* Set a start date when syncing Events or high-volume activity entities
* Add multiple entities as sources within one data flow rather than building separate flows
  {% endcolumn %}

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

* Use the Smart views entity expecting it to return the leads inside that view — it only returns the view definition
* Sync bulk action entities (email bulk actions, delete bulk actions) unless you specifically need audit logs — they add volume without much reporting value for most teams
* Generate an API key from a restricted user account and expect it to access all entities
  {% endcolumn %}
  {% endcolumns %}
