# Charts and reporting

Charts answer a specific metric question over an app, period, and filter set. Choose the metric first: time series, current snapshots, retention matrices, and customer cohorts do not have the same meaning or supported controls.

## Configure a report

1. Confirm the project/app.
2. Choose the metric from Revenue, Subscriptions, Trials, Health, Customers, or Activity.
3. Select a relative or custom date range and resolution.
4. Apply the supported store, environment, and product filters.
5. For monetary reports, choose one of the currencies actually present.
6. Select comparison, visualization, or store segmentation where that metric supports it.
7. Inspect both values and the metric's explanatory text before saving or exporting.

Some specialized reports intentionally hide controls that do not apply. Retention is a cohort matrix, for example, rather than a general-purpose line/area/bar report.

## Dates and resolution

Dates use UTC and custom start/end dates are inclusive. Relative ranges are 7, 28, 90, and 365 days. Custom daily ranges are bounded to 366 days; weekly ranges to five years; monthly ranges to ten years. Broader ranges require the coarser supported resolution.

A period-end snapshot is different from a count of things that happened inside a period. Current status/phase/access-by-store views describe current projections, not reconstructed daily historical status. The [metric dictionary](/docs/metrics) distinguishes each series.

For a custom range touching a partial week/month, inspect the labels and bucket boundaries. The preview's movement calculations can include broader calendar buckets at partial-month boundaries; reconcile the source transactions when precise boundary accounting is required.

## Currency and money

Monetary series stay separated by currency. A currency selector changes the series, not an exchange rate. CherrySub does not convert all store value to USD or infer a project reporting currency.

Backend values use milliunits: 1000 milliunits equal one unit of the stated currency. Gross means store-reported purchase value. Net in these reports means gross minus known refunds; it is not developer proceeds after taxes and store commission.

Missing accounting information is distinct from zero. A net-zero result with nonzero gross/refunds is still meaningful data. Use the selected report's data and error state rather than treating an unavailable report as an empty dataset.

## Comparison and visualization

Supported time series can compare with the preceding period and switch line, area, or bar presentation. Store segmentation separates Apple and Google within the chosen metric/currency. These controls do not redefine the metric's denominator or create unsupported dimensions.

Conversion, retention, lifetime-value, refund-review, and cohort reports expose their own windows/maturity controls. Read [Cohorts](/docs/cohorts) before comparing them to ordinary transaction-date totals.

## Freshness and failure

Identical authorized report requests share a bounded 30-second in-process cache. Each interactive report has an eight-second database calculation deadline. A slow/unavailable report is shown as a failure with retry, rather than being silently replaced with a different range or stale-looking substitute.

Overview has its own recent-history limit of 180 UTC days. For long raw history, use a durable export. A chart's aggregate points cannot reconstruct every contributing customer or event.

## Save, share, and export

Save the complete chart configuration for later use. A shared chart URL preserves its app/metric/filter setup but grants no access to a recipient. Members still authenticate and must belong to the project.

Download a chart CSV for the currently loaded aggregate response. Use **Email a data export** for normalized transaction/event rows; that is a separate asynchronous job with its own privacy and size limits. [Saved analyses and exports](/docs/exports-and-saved-views).
