# 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 Trackings</strong></td><td>Trackings is the most actionable entity for reporting. Set it up first and validate your data before adding Courses or Screen types to the same flow.</td></tr><tr><td><strong>Join Courses and Trackings</strong></td><td>Course IDs in the Trackings entity map directly to Courses. Use Coupler.io's Join transformation to enrich tracking records with course names and metadata — this makes your reports far more readable.</td></tr><tr><td><strong>Use Append for multi-org setups</strong></td><td>If you manage multiple Coassemble organizations, create one data flow per organization and use the Append transformation to consolidate all tracking data into a single destination 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>Sync Trackings more frequently than Courses</strong></td><td>Learner progress changes constantly, but your course catalog rarely does. Schedule Trackings to refresh daily or hourly, and Courses weekly — or only on-demand when you publish new content.</td></tr><tr><td><strong>Run Screen types on-demand only</strong></td><td>Screen types are a static reference table. There's no value in scheduling frequent refreshes for this entity — sync it manually when you need it for a content audit.</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>Send high-volume tracking data to BigQuery</strong></td><td>If your organization has thousands of learners, Google Sheets will hit row limits quickly. Route Trackings data to BigQuery or another database destination to handle the volume without issues.</td></tr><tr><td><strong>Use AI destinations for instant insights</strong></td><td>Pipe your Trackings data into ChatGPT or Claude to automatically generate completion summaries, flag overdue learners, or draft manager reports — without building a dashboard from scratch.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
Don't rely solely on the `completed_at` field to measure completion. Learners who are 99% through a course but haven't hit the final screen will have a null value there. Always use `progress` and `status` together for an accurate picture.
{% endhint %}

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

* Join Courses to Trackings so reports show course names, not just IDs
* Validate your data with a manual run before setting up a schedule
* Use separate data flows per Coassemble organization
  {% endcolumn %}

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

* Assume empty Trackings means a connection problem — it may just mean no learner activity yet
* Schedule Trackings and Courses in the same data flow if you're hitting rate limit errors
* Use Screen types as a primary reporting entity — it's a reference table, not a metrics source
  {% endcolumn %}
  {% endcolumns %}
