# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Start with a single account and report type</strong></td><td>Create your first data flow with one Microsoft Ads account and one report type (e.g., Campaign performance). Once you've verified the data looks correct, add more accounts or reports. This reduces troubleshooting complexity.</td></tr><tr><td><strong>Use predefined reports first</strong></td><td>Predefined reports (Campaign performance, Keyword performance, etc.) are faster and more reliable than custom reports. Start there; only build custom reports if you need unusual metric or dimension combinations.</td></tr><tr><td><strong>Pull 2–3 days of history instead of today's data</strong></td><td>Microsoft Ads takes 24–48 hours to finalize reporting data. Schedule imports for early morning (7–8 AM) and pull data from 2–3 days ago to ensure you have complete, accurate data.</td></tr><tr><td><strong>Set Split data by period to Daily for trend analysis</strong></td><td>If you're building charts or dashboards, use **Split data by period = Daily** to get daily granularity. This lets you spot trends and sudden performance drops in Looker Studio or other dashboards.</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>Schedule imports early morning (7–8 AM)</strong></td><td>Microsoft's reporting API processes data overnight. Scheduling a 7–8 AM import ensures yesterday's complete data is available. Avoid imports during business hours when the API is busier.</td></tr><tr><td><strong>Use weekly or biweekly reports for large accounts</strong></td><td>If you're importing 90+ days of data or have 100+ campaigns, use weekly refreshes instead of daily. This reduces API strain and memory usage. Append multiple weeks together in your destination for a rolling view.</td></tr><tr><td><strong>Enable date picker for dynamic ranges</strong></td><td>Instead of hardcoding a date range, use Coupler.io's date picker or macros (if supported) to automatically pull the last 30 days. This keeps your report always fresh without manual updates.</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 advanced filters to reduce data size</strong></td><td>If you only care about search campaigns, add a filter for device type or network. Filtering down reduces the API payload and speeds up the import. Don't pull data you won't use.</td></tr><tr><td><strong>Aggregate daily data to weekly/monthly in your dashboard</strong></td><td>If you pull daily data, aggregate it in Looker Studio or BigQuery using SUM(Spend), SUM(Conversions), etc. Don't let the destination accumulate thousands of rows — roll up to the appropriate time grain for your use case.</td></tr><tr><td><strong>Append multiple accounts in one data flow</strong></td><td>Instead of creating separate data flows for each Microsoft Ads account, select all accounts in one flow. This is more efficient than running 5 individual imports.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
**Don't pull data for today or yesterday.** Microsoft Ads data takes 24–48 hours to fully process. If you import today's data, you'll get incomplete metrics and may have to reimport tomorrow. Always pull from 2+ days ago.
{% endhint %}

{% hint style="danger" %}
**Don't use "Custom" report period for automated scheduling.** If you set a custom date range (e.g., Jan 1–30) and schedule the import, it will pull the same date range every month, not a rolling window. Use preset periods (Last 30 days, Last 7 days) or manually update the date range each month.
{% endhint %}

{% hint style="danger" %}
**Don't mix split granularities across reports.** If one data flow pulls Campaign performance with **Split = Daily** and another pulls Keyword performance with **Split = Monthly**, your destination will have rows at different time grains, making aggregation harder. Keep the split setting consistent across related reports.
{% endhint %}

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

* Test with a single account and report type first
* Pull data 2–3 days after it was generated
* Use predefined reports for standard metrics
* Schedule imports during early morning (7–8 AM)
* Apply advanced filters to reduce data size
* Append data from multiple accounts in one flow
  {% endcolumn %}

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

* Pull data for today or yesterday
* Use custom date ranges in scheduled flows
* Mix split periods across related reports
* Run multiple data flows simultaneously if your account is large
* Import every single metric if you only need a few
* Leave data in your destination without aggregation (roll up to appropriate time grain)
  {% endcolumn %}
  {% endcolumns %}
