# 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 monthly counts for dashboards, activities for analysis</strong></td><td>Customer monthly counts are pre-aggregated and load fast — ideal for KPI dashboards. Use the Activities entity when you need event-level detail for churn analysis or cohort work.</td></tr><tr><td><strong>Join Activities with Customers for richer segmentation</strong></td><td>The Activities entity alone doesn't include plan, country, or LTV. Use Coupler.io's Join transformation on <code>customer_uuid</code> to enrich events with customer metadata before building reports.</td></tr><tr><td><strong>Convert cents to currency in your destination</strong></td><td>MRR, ARR, and LTV fields are in cents. Add a calculated column in Google Sheets or a transformation in BigQuery to divide by 100 — do this once at the destination level rather than correcting it repeatedly.</td></tr><tr><td><strong>Set your start date to match your billing history</strong></td><td>ChartMogul can return data from the day your first subscription was recorded. Set the start date to your earliest billing date to capture full historical trends, especially for LTV and cohort analysis.</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>Daily counts need daily syncs</strong></td><td>If you're using the Customer daily count entity for operational monitoring, schedule your data flow to run daily so each day's count is captured. Daily counts aren't backfilled retroactively if you miss a run.</td></tr><tr><td><strong>Monthly and quarterly entities don't need frequent refreshes</strong></td><td>For board or investor reports using monthly or quarterly counts, a weekly or even monthly sync is sufficient. Over-syncing these entities wastes API calls without adding value.</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>Narrow the date range for Activities</strong></td><td>The Activities entity can grow large quickly for high-volume businesses. If you only need recent events, set the start date to the last 90 or 180 days rather than pulling all-time history every sync.</td></tr><tr><td><strong>Use separate data flows per entity</strong></td><td>Splitting Customers and Activities into separate data flows makes it easier to debug sync issues and control refresh frequency independently for each entity.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
Don't build revenue reports directly from raw MRR fields without converting from cents. A customer showing $1,200 MRR in ChartMogul will appear as 120000 in the raw export — always divide by 100 before displaying or aggregating these values.
{% endhint %}

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

* Use the `external_id` field to join ChartMogul customers with your CRM or Stripe records
* Filter Activities by `type` to isolate specific events like churn or expansion before aggregating
* Use Append to combine customer count data from multiple ChartMogul accounts if you run multiple products
  {% endcolumn %}

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

* Pull all-time Activities history on every scheduled sync — use an incremental start date instead
* Mix customer count cadences (e.g., daily and monthly) in the same chart without normalizing the time axis
* Assume ChartMogul counts include trial users — counts reflect paying subscribers unless your integration is configured otherwise
  {% endcolumn %}
  {% endcolumns %}
