# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Use one data flow for Calls, another for Conversations</strong></td><td>Calls and Conversations have different structures and update cadences. Keeping them in separate data flows makes it easier to troubleshoot and schedule them independently.</td></tr><tr><td><strong>Join Calls with ad platform data</strong></td><td>Use Coupler.io's Join transformation to merge CallRail call records with Google Ads or Facebook Ads data on campaign name or UTM parameters. This gives you a true cost-per-call metric without manual spreadsheet work.</td></tr><tr><td><strong>Append data from multiple CallRail accounts</strong></td><td>If you manage several accounts (e.g., for different clients or locations), add multiple sources to one data flow and use the Append transformation to combine them into a single table.</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>Match refresh frequency to your reporting needs</strong></td><td>For daily call volume dashboards, a once-per-day refresh is usually enough. If you're monitoring missed calls or open conversations in near real-time, consider hourly refreshes — but only for the entities that need it.</td></tr><tr><td><strong>Set a fixed start date for historical loads</strong></td><td>Use the date picker to set a specific start date when first loading data. Once historical data is in your destination, you can narrow the start date for subsequent runs to avoid re-pulling the same records unnecessarily.</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>Filter in your destination, not at the source</strong></td><td>CallRail's API doesn't support granular filtering — pull all data and apply filters (by source, tag, campaign, or call status) in Google Sheets, Looker Studio, or BigQuery instead.</td></tr><tr><td><strong>Use BigQuery for large call volumes</strong></td><td>If your account logs thousands of calls per day, Google Sheets will hit row limits quickly. Load to BigQuery and query from Looker Studio for scalable, high-volume reporting.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
**Don't use a restricted user's API key for shared data flows.** If the key owner has limited account access, every data flow using that key will silently return incomplete data. Always use an admin-level API key for data flows that need full account visibility.
{% endhint %}

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

* Use an admin account's API key for full data access
* Convert duration (seconds) to minutes in your destination
* Use the Aggregate transformation to roll up call counts by campaign or source before loading to a dashboard
  {% endcolumn %}

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

* Pull the full historical date range on every scheduled run — it's slow and redundant
* Rely on the `keywords` field without confirming keyword-level tracking is enabled
* Run simultaneous data flows on the same CallRail account — stagger them to avoid rate limit errors
  {% endcolumn %}
  {% endcolumns %}
