# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Export Contacts attributes alongside Contacts</strong></td><td>The Contacts entity alone won't tell you what your custom fields mean. Always add Contacts attributes as a second source in the same data flow so you have field definitions handy.</td></tr><tr><td><strong>Use multiple sources in one data flow for list-level contact exports</strong></td><td>If you need contacts from several lists, add each list as a separate Contacts lists contacts source and use the Append transformation to combine them into one output table.</td></tr><tr><td><strong>Join CRM deals with pipeline stages</strong></td><td>CRM deals contain a stage ID, not a stage name. Add CRM pipeline stages as a second source and Join on stage ID to get human-readable stage names in your reports.</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>Wait a few hours after a campaign send before syncing</strong></td><td>Open and click metrics continue updating after a send. Scheduling a sync several hours post-send gives you more settled engagement data rather than preliminary counts.</td></tr><tr><td><strong>Use a fixed start date for campaign history</strong></td><td>Set your start date to the earliest campaign you care about and leave it fixed. This avoids re-pulling the same historical data unnecessarily on every sync.</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>Separate high-volume contact exports from CRM syncs</strong></td><td>If you have a large contact database, running it in the same data flow as CRM entities can slow things down or trigger rate limits. Keep contact-heavy and CRM-heavy flows separate.</td></tr><tr><td><strong>Use Aggregate for campaign reporting</strong></td><td>Instead of exporting every campaign row to a spreadsheet, use the Aggregate transformation to summarize metrics (e.g., total sends, average open rate by month) before writing to the destination.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
Do not share or commit your Brevo API key to public repositories or spreadsheets. If exposed, regenerate it immediately in Brevo under Account settings → SMTP & API → API Keys, then update the key in your Coupler.io data flow.
{% endhint %}

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

* Add Contacts attributes as a companion source when exporting Contacts
* Join CRM deals with pipeline stages for readable stage names
* Verify an entity has data in Brevo before troubleshooting a missing-data issue in Coupler.io
* Use Append to merge email and SMS campaign data into a single performance table
  {% endcolumn %}

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

* Use a restricted API key if you need access to CRM or account-level entities
* Expect real-time accuracy on open/click rates immediately after a campaign send
* Pull Contacts lists contacts without first confirming the target list has subscribers
  {% endcolumn %}
  {% endcolumns %}
