# Best Practices

## Recommended setup

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Choose the right entity for your goal</strong></td><td>Use <strong>Orders</strong> for order-level summaries (revenue, AOV). Use <strong>Orders with line items</strong> for product-level analysis (which SKUs sell most). Use <strong>Orders refunds transactions</strong> for financial reconciliation. Use <strong>Products with variants</strong> for catalog and pricing data. Start with one entity and add more data flows as your reporting needs grow.</td></tr><tr><td><strong>Use column selection for order entities</strong></td><td>The GraphQL source lets you choose exactly which columns to include for order-related entities. Select only the fields you actually need — this speeds up data flow execution significantly and keeps your destination clean. You can always add more columns later.</td></tr><tr><td><strong>Use date filters from day one</strong></td><td>Even for initial setup, set <strong>Created after</strong> to a reasonable start date rather than pulling your entire order history. Stores with years of data can have hundreds of thousands of orders. Start with the last 90 days, verify the data, then expand the range if needed.</td></tr><tr><td><strong>Use status filters to exclude noise</strong></td><td>Set <strong>Financial status</strong> to <code>Paid</code> if you only care about completed sales. Set <strong>Status</strong> to <code>Closed</code> for finalized orders only. This reduces data volume and avoids confusion from draft, cancelled, or pending orders appearing 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>Daily refresh for most stores</strong></td><td>Orders typically come in throughout the day, so a morning refresh captures the previous day's sales. Daily is the right frequency for most e-commerce reporting — it balances data freshness with API usage.</td></tr><tr><td><strong>Hourly refresh during peak periods</strong></td><td>During sales events (Black Friday, product launches), switch to hourly refresh for near-real-time dashboards. Switch back to daily after the event to conserve API quota.</td></tr><tr><td><strong>Use date filters to scope your exports</strong></td><td>Set <strong>Created after</strong> to the start of your desired window (e.g., 30 or 90 days ago) to pull only the records you need. For monthly reports, set Created after to the first of the month and Created before to the last day. Update the dates periodically or use auto-refresh to keep data flowing.</td></tr><tr><td><strong>Use Changed after for incremental updates</strong></td><td>Instead of re-pulling all orders every time, set <strong>Changed after</strong> to a date 7 days ago to pull only recently modified records. This is especially useful for large stores — it reduces processing time and API load while still catching order status changes and refunds.</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>Select fewer columns</strong></td><td>Column selection is the single biggest performance lever. If you only need order totals and dates, don't include customer journey, billing address, and shipping line columns. Each additional column group adds processing time.</td></tr><tr><td><strong>Split large exports by date range</strong></td><td>For stores with 50,000+ orders, create separate data flows for different time periods (e.g., 2024, 2025, 2026). Use Coupler.io's Append transformation to combine them in the destination. This avoids timeout errors entirely.</td></tr><tr><td><strong>Use Products instead of Products with variants</strong></td><td>If you don't need variant-level detail, use the <strong>Products</strong> entity instead of <strong>Products with variants</strong>. A store with 1,000 products and 10 variants each produces 10,000 rows with the variants entity vs. 1,000 rows without.</td></tr><tr><td><strong>Stagger multiple data flows</strong></td><td>If you have several Shopify data flows against the same store, stagger their refresh schedules by at least 15 minutes. Running them simultaneously increases the chance of hitting Shopify's API rate limits.</td></tr></tbody></table>

## Dashboard accuracy

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Understand Shopify's sales metrics</strong></td><td>Coupler.io exports raw order data, not Shopify's calculated report metrics. <strong>Current order total</strong> is the latest total after adjustments. <strong>Net payment</strong> is total minus refunds. For "Gross sales" as Shopify defines it, you'll need to sum line item original totals before discounts and returns.</td></tr><tr><td><strong>Account for timezone differences</strong></td><td>Coupler.io date filters use your browser's timezone, while Shopify reports use your store's timezone. If your browser and store are in different timezones, order counts for a specific day may differ. For precise daily reports, always compare using the same timezone reference.</td></tr><tr><td><strong>Exclude test orders</strong></td><td>Shopify's Bogus Gateway test orders are included by default. Filter them out in your destination or transformation step using the "Is Test Order?" field, or by excluding orders with the test tag. Failing to do this inflates revenue and order count metrics.</td></tr><tr><td><strong>Use the right entity for refund analysis</strong></td><td>Don't try to calculate refunds from the Orders entity — use <strong>Orders refunds transactions</strong> instead. This entity gives you per-refund detail with transaction amounts, gateway info, and dates. The Orders entity only shows the current net total.</td></tr></tbody></table>

## Common pitfalls to avoid

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

* Use date filters to limit export scope, especially for large stores
* Use column selection to speed up order-related exports
* Use date filters to scope exports to the period you need
* Use Orders refunds transactions for refund analysis
* Check for test orders in your data and exclude them
  {% endcolumn %}

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

* Don't expect Shopify reports, analytics, or session data — only raw entity data is available
* Don't pull entire order history without date filters — this causes timeouts for large stores
* Don't assume Coupler.io totals match Shopify report totals — they use different calculations
* Don't ignore timezone differences between your browser and Shopify store
* Don't use legacy (REST-based) Shopify sources for new data flows — use the current GraphQL source
  {% endcolumn %}
  {% endcolumns %}

{% hint style="danger" %}
**Shopify reports and analytics are not supported.** Coupler.io pulls raw entity data (orders, products, customers, inventory) via the Shopify API. Built-in Shopify reports (Sales reports, Finance reports), analytics dashboards, conversion rates, and session data are not accessible via the API. To build equivalent reports, export raw order and product data and calculate metrics in your destination.
{% endhint %}
