# 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 Posts as your anchor entity</strong></td><td>The Posts entity contains the most joined-up data — vote count, status, board, author, tags, and score in a single table. Build your first analysis here before adding other entities.</td></tr><tr><td><strong>Join Posts with Companies to weight by revenue</strong></td><td>Use Coupler.io's Join transformation to combine Posts and Votes with Companies on company_id. This lets you see which features matter most to your highest-value customers, especially if you pass monthly_spend to Canny.</td></tr><tr><td><strong>Use Status changes for pipeline reporting</strong></td><td>The Status changes entity gives you a full audit trail of how posts moved through your workflow. Join it with Posts to calculate average time-in-status and surface where requests stall.</td></tr><tr><td><strong>Append data from multiple Canny workspaces</strong></td><td>If your organization has more than one Canny workspace (e.g., separate boards per product line), use Coupler.io's Append transformation to combine Posts or Votes from all workspaces into a single dataset.</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 syncs are enough for most teams</strong></td><td>Canny feedback doesn't change by the minute. A daily refresh keeps your dashboards current without hammering the API. Reserve more frequent syncs for active launch periods when post status changes rapidly.</td></tr><tr><td><strong>Sync Status changes separately from Posts</strong></td><td>Status changes is a high-volume entity on active boards. Running it in its own data flow lets you control its refresh cadence independently and keeps run times predictable.</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>Each entity is a separate API call. If you only need post-level analysis, don't add Comments or Votes to the same data flow — keep the scope tight to stay within rate limits.</td></tr><tr><td><strong>Use BigQuery for large Canny datasets</strong></td><td>If you have thousands of posts, votes, or comments, send data to BigQuery rather than Google Sheets. Sheets has row limits and slows down with large datasets, while BigQuery handles joins across entities at scale.</td></tr></tbody></table>

## Common pitfalls

{% hint style="danger" %}
Don't rely on the `score` field for straightforward vote-based ranking. Canny's score is a proprietary weighted value — if your stakeholders expect "most votes = highest score," use `vote_count` instead to avoid confusion in reports.
{% endhint %}

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

* Join Posts with Companies to segment feedback by customer tier
* Use Status changes to measure how long requests sit in each stage
* Test your API key with the Posts entity first to confirm access before building complex data flows
* Send Posts data to an AI destination like Claude or ChatGPT to generate a prioritized feature summary
  {% endcolumn %}

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

* Assume empty fields like `monthly_spend` are a Coupler.io issue — check whether the data exists in Canny first
* Export all 10 entities in a single data flow if your board is large — split by entity to avoid rate limit errors
* Use the Votes entity as your only signal — one power user voting on everything skews raw vote counts
  {% endcolumn %}
  {% endcolumns %}
