# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Join Reports and Emails in one data flow</strong></td><td>Add both the Emails and Reports entities to the same data flow and use Coupler.io's Join transformation on campaign ID. This gives you a single table with subject lines, send dates, and engagement metrics — far more useful than two separate sheets.</td></tr><tr><td><strong>Use Aggregate to monitor list health</strong></td><td>Pull the Contacts entity and apply an Aggregate transformation to count contacts by subscription status (active, unsubscribed, bounced). This gives you a quick health check on your audience without manual counting.</td></tr><tr><td><strong>Append data from multiple accounts</strong></td><td>If your organization uses more than one Campayn account, add multiple sources in the same data flow and use Append to combine them into a unified dataset for cross-account reporting.</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 send cadence</strong></td><td>If you send campaigns weekly, a daily refresh is more than enough. If you send daily, consider a refresh every few hours. Refreshing more often than your send frequency just pulls duplicate data.</td></tr><tr><td><strong>Refresh Reports shortly after sends</strong></td><td>Open and click data accumulates in the 24–48 hours after a send. Schedule your Reports refresh to run a day or two after your typical send time to capture the bulk of engagement activity.</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>Pull only the entities you need</strong></td><td>Avoid pulling all five entities into a single data flow if you only need reports. Separate data flows for separate purposes keep runs faster and make troubleshooting easier.</td></tr><tr><td><strong>Use AI destinations for quick analysis</strong></td><td>Send your Reports data directly to ChatGPT, Claude, or Gemini to get instant narrative summaries of campaign performance — useful for weekly email briefs without building a full dashboard.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
Do not share or expose your Campayn API key in public documents, shared spreadsheets, or version-controlled code. Anyone with your API key has full read access to your account data. Regenerate it immediately if it's ever compromised.
{% endhint %}

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

* Generate your API key from an admin account to ensure full data access
* Join Reports with Emails so your metrics always have context (subject line, send date)
* Run a manual data flow first to confirm data looks correct before scheduling
  {% endcolumn %}

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

* Use a restricted or read-limited user's API key — it may silently return partial data
* Expect Reports to contain per-recipient data — it's campaign-level only
* Pull Contacts and Lists separately and manually try to reconcile counts — use the Join transformation instead
  {% endcolumn %}
  {% endcolumns %}
