> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.qonversion.io/llms.txt
> Use this file to discover all available pages before exploring further.

# How fresh is Apple Ads data in Qonversion, and how do I fill in spend history?

> How current the Apple Ads report in the Qonversion dashboard is, what its data health messages mean, how far back daily spend history goes after you connect, how owners and administrators import older spend history from an Apple Ads console export, when cohort windows close, and why numbers differ from the Apple Ads console.

This page covers data freshness and spend history for the Apple Ads report in the Qonversion dashboard. Qonversion uses UTC days for every date in the report. Qonversion records daily Apple Ads spend history from about the time you connect Apple Ads; older history enters only through a spend import, which only owners and administrators can run, only in the dashboard, and only for dates more than 90 days ago that are earlier than your recorded history. Every page-level data problem on the report is explained in one strip above the table, with the action you can take.

## What does the "Updated …" label mean, and how do I use "Update now"?

The **Updated …** indicator and its **Update now** button are shown only on some projects, not on every Apple Ads report. If your report doesn't show them, nothing is wrong with your connection: the Apple Ads numbers on that report are requested from Apple for the report you open, so there is nothing to refresh.

When the indicator is shown, it sits in the filters row above the table and reads:

| Label | When |
| - | - |
| **Updated just now** | The data was updated under a minute ago |
| **Updated N min ago** | The data was updated under an hour ago |
| **Updated N h ago** | The data was updated an hour or more ago |

When the data is behind, the **Updated …** label is highlighted. Hovering it shows "Apple didn't respond during the last updates. Showing data as of HH:MM UTC." The numbers on screen are then the last successfully synced ones, and **Retry** requests a fresh update.

The button next to the indicator reads **Update now**. It reads **Retry** when the data is already marked as behind, or when your last update attempt failed.

After you press **Update now**, the button stays busy until newer data arrives, and then the table refreshes. If the data was fetched moments ago, the report simply reloads and nothing fails.

If an update doesn't land, a **Couldn't update the data** notification appears and the button changes to **Retry**. The notification text tells you why:

| Notification message | Meaning |
| - | - |
| "The update is taking longer than expected. The data will refresh on its own." | The wait for new data ran out. |
| "Couldn't start the update. Please try again." | The update request failed. Press **Retry**. |
| "On-demand updates are turned off for this environment." | Updates can't be requested at all for this environment; the button then reads **Retry**. |

### Who can press "Update now"?

Anyone who can view the Apple Ads section can press **Update now**. It does not need the campaign-management capability or an owner or administrator role. A user without Apple Ads section access is refused with "Refreshing Apple Ads data requires access to the Apple Ads section."

**Update now** is a dashboard-only action. The Qonversion public REST API and the Qonversion MCP server can't trigger it; they only read the report.

## Why do today's numbers keep changing?

When the selected period includes today (UTC), the period control shows a **live** marker. Its tooltip reads "The selected period includes today — the last day is incomplete and spend syncs with a lag, so today's numbers keep changing".

## What do the data messages above the Apple Ads report table mean?

All page-level data problems on the Apple Ads report show in one strip above the table. With one problem, the strip shows that problem's headline and explanation. With several, it reads "Two things are off with the numbers on this page." (the count is spelled out up to six), or "Two things aren't in yet on this page." when every item is only about spend history that hasn't arrived yet. **What's affected** expands the list, and when every item that offers a button offers the same one, the strip shows a single shared button.

| Message | What it means | What to do |
| - | - | - |
| "Spend is undercounted — Apple didn't return data for N of M campaigns." | Apple didn't answer for part of the account in this request. ROAS looks better and cost metrics look cheaper than they really are; revenue and cohort counts are unaffected. | Press **Request again** to re-run the request. |
| "N rows don't show whether they're running." | Apple didn't return those rows' state. They show a dash in the Status column, and filtering by Status or Delivery hides them even if they're active. | Press **Request again**. |
| "Some spend and return metrics are unavailable." | Qonversion couldn't confirm which Apple campaigns belong to this app, or Apple's campaign data for the period is incomplete. Affected totals, ROAS and acquisition costs are withheld; confirmed per-campaign values stay available. | Press **Request again**. |
| "Closed-window ROAS and CAC aren't available yet." | No daily spend history has been recorded for this project yet. Its detail names how many days of history the shortest and longest selected windows need, for example with D3 and D30 selected: "We only recently started recording daily spend for this project — D3 needs 8 days of it, D30 needs 35 days. They'll appear on their own." | Wait for the values to appear. Owners and administrators can press **Import spend history…** instead. |
| "This period is older than our spend history." | The selected period ends before daily spend recording started. The detail gives the start date: "Daily spend recording starts \[date], so closed-window ROAS and CAC can't be computed for these dates." | Owners and administrators can press **Import spend history…** to bring in the older history. |
| "N days of spend history are missing from this period." | Daily spend was never recorded for some dates in the range; the strip names those dates or some of them. Closed-window ROAS and CAC over those dates stay provisional and read higher than reality. | There is no button: waiting or retrying won't fill those days. |
| "Closed-window ROAS and CAC are unavailable right now." | The daily spend history couldn't be read for this request. Everything else on the page is unaffected. | Press **Try again**. |
| "The CSV didn't download." (on a campaign's page: "The ad groups CSV didn't download." or "The keywords CSV didn't download.") | A CSV export failed. The strip adds "Nothing on screen changed." | Press **Retry**. |

The "aren't available yet" item is not shown while the Apple Ads setup checklist is on screen, because the checklist tells the same story, or while the Apple Ads credentials are rejected.

The four spend-history items ("aren't available yet", "older than our spend history", "days of spend history are missing" and "unavailable right now") appear in both the Growing and the Mature reading of cohort windows. Only Mature window values depend on daily spend history; in the Growing reading the window cells still show values.

## How far back does Apple Ads spend history go after I connect?

Qonversion records daily Apple Ads spend history from about the time you connect, and that first collection covers only the most recent days. Earlier history is not backfilled automatically. You can add older days with a spend import, but only for dates more than 90 days ago. Right after you connect, there can therefore be a stretch of recent dates that is neither recorded nor importable yet.

Closed (Mature) cohort window values need daily spend history. With the default settings, a cohort window Dn needs n + 5 days of daily spend history before it can show closed values: n days, a 4-day maturation buffer and 1 more day, and never fewer than 7 days.

| Window | Days of daily spend history needed |
| - | - |
| D0 | 7 |
| D3 | 8 |
| D7 | 12 |
| D14 | 19 |
| D30 | 35 |

## How do I import older Apple Ads spend history?

Spend import exists for spend history from before Qonversion started recording it. You export that history from the Apple Ads console, which keeps up to 24 months, and history older than what Qonversion records automatically can enter Qonversion only this way. Import is available only in the Qonversion dashboard: there is no MCP tool or REST endpoint for it.

### Who can import spend history?

Only the owner and administrator roles (the "Manage Apple Search Ads" permission) can import spend history. That covers opening the import dialog, the list of previous imports and downloading skipped rows. Other roles don't see the import entry points, and the dashboard refuses them with "Importing Apple Ads spend history requires the owner or administrator role." The "Manage Apple Ads campaigns" capability does not include importing spend history.

### Where do I start an import?

Open the report's **⋯** menu (**Report actions**) and choose **Spend history…**, or press **Import spend history…** in the data strip above the table when the history is still building or the selected period predates it.

<Steps>
  <Step title="Export a campaign report from the Apple Ads console">
    In the Apple Ads console, open **Reports → Custom reports → Create report**. Use the dimensions **Day**, **Campaign** and **Country or Region** with the metrics **Spend**, **Impressions**, **Taps** and **Installs**. Set the date range to anything before the date your recorded history starts, then download the report.
  </Step>

  <Step title="Upload the file">
    Upload the file as .xlsx or .csv, up to 8 MB and up to 150,000 rows. A larger file is rejected with an instruction to split the report into shorter date ranges. Nothing is written when you upload.
  </Step>

  <Step title="Check the review">
    Qonversion checks the file against your recorded history and shows you a review before anything is written. See "What does the import review show?" below.
  </Step>

  <Step title="Confirm the import">
    Press **Import N days**. While the import applies you can close the dialog: the import keeps running, and reopening the dialog picks it back up. When it finishes, the dialog shows **N days imported** and **Spend history now starts \[date]**, and closed-window ROAS and CAC for the imported dates appear the next time the report loads.
  </Step>
</Steps>

### What file does the spend import accept?

| Requirement | Rule |
| - | - |
| Format | .xlsx or .csv |
| Size | Up to 8 MB and up to 150,000 rows |
| Header row | Must be within the first 25 rows of the file |
| Date column | **Day** (or **Date**) |
| Spend column | **Spend** |
| Campaign column | **Campaign** — either the campaign name or its **Campaign ID** |
| Report level | Campaign-level reports only |

A file without such a header is rejected with "No header row found…". A header without a campaign column is rejected with "Required column missing: Campaign…".

The import accepts campaign-level reports only. A file with Ad Group, Keyword, Search Term, Match Type, Ad or Creative Set columns is rejected, because summing sub-campaign rows loses search-match spend and would undercount campaign totals.

Each row has to be tied to a campaign:

* A **Campaign ID** column is used when present. A campaign Qonversion doesn't know is still accepted when the project has a single Apple Ads organization.
* Otherwise the campaign name must match exactly one known campaign, case-insensitively. An unknown or ambiguous name is skipped, with advice to add the Campaign ID dimension.

Imported spend is never currency-converted. A row whose currency differs from the Apple Ads organization's currency is skipped as unreadable ("currency X does not match the organization's Y"). If the file has no currency column, its spend is taken to be in the Apple Ads organization's currency.

### Which dates does the import add, and which rows are skipped?

Recorded data always wins. An import only adds days that were never recorded, and never overwrites or updates an existing row. Imported days must be earlier than the date your recorded spend history starts, so an import can't fill gaps inside recorded history; it can only extend history backwards.

| Rows | What happens |
| - | - |
| Dated on or after the start of your recorded spend history | Skipped as "inside recorded history" |
| From the last 90 days (UTC) | Always skipped as "still being recorded from the API"; the review shows the cutoff date |
| Already recorded | Listed as "already recorded — skipped" |
| Campaign not matched | Skipped; the review lists unmatched campaigns |
| Zero spend, taps and installs | Skipped and never written |
| Currency differs from the organization's currency | Skipped as unreadable |

The 90-day cutoff is checked again when you confirm, so an import confirmed later can only skip more rows, never add more.

### What does the import review show?

| Review item | What it shows |
| - | - |
| **Days** | How many days will be added, with the date range the file covers |
| **Rows** | All rows in the file (campaign × country × day) |
| **Unmatched** | Campaigns skipped, when there are any |
| **Spend** | The spend that will be added, with its currency |

A plan follows, listing every skipped group with its count. **Download skipped rows** exports every skipped row of the import with its reason as CSV: already recorded, last 90 days, unmatched, zero and unreadable rows alike. The **Import N days** button is disabled when there's nothing to add ("Nothing to import — every row is already recorded or skipped.").

### How do I cancel an import or come back to it later?

Pressing **Cancel** on the review discards the staged import, and nothing is written. Closing the import dialog with X or Escape does not discard a staged import: it stays **Ready to review**, and reopening the dialog resumes it. Only Cancel on the review discards it.

The upload screen lists **Previous imports**: at most the 5 most recent imports that weren't discarded. Each has the status **Imported**, **Processing**, **Ready to review** or **Failed**. Discarded imports are hidden, an import still waiting for review can be reopened, and a failed import shows its reason on hover. **Skipped rows** in Previous imports exports that import's skipped rows with their reasons.

## When is a date closed for cohort windows?

Cohort windows (ROAS Dn and CAC Dn) have two readings, chosen in the **Cohort windows** control of the Apple Ads report:

* **Growing** is the default reading. For every install in the period, each window Dn counts what that install has earned within n days of installing so far, divided by the period's Apple spend. Whether a date is closed is informational only in this reading.
* **Mature** uses only closed install dates and takes spend from daily spend history.

Your choice in the **Cohort windows** control is remembered. Over the API, you request the Mature reading with `windows_mode=mature`. For the full explanation of both readings and the window metrics, see [Read the Apple Ads report](/docs/apple-ads-report).

In the Mature reading, a window uses only install dates that are closed: at least n + 5 full UTC days old (window length + a 4-day maturation buffer + the boundary day) and never fewer than 7 days. With the default settings, D0 needs 7 days, D3 8, D7 12 and D30 35. For example, for installs on October 1 (UTC), D7 is closed from October 13 (UTC).

* While a selected window has no closed install day yet, the Mature reading gives its columns a second header row with **final values** and the UTC date its first final values are expected.
* The ROAS Dn and CAC Dn summary cards can show **recalculated through** with a date (as the card's sub line while the window isn't closed yet, and in its hints): the UTC date by which the whole period's cohort set for that window is settled. It is an upper bound taken from the period's last day, so rows can settle earlier.
* Lifetime has no such date: it never closes.

## Can a closed cohort window still change after a late refund?

Yes. A refund is counted in the window of the purchase it cancels, whenever it arrives. A refund that comes in after a window closed still lowers that window's revenue and ROAS, so even closed windows can be restated. What settles at closing is which installs belong to the window.

Revenue (Gross or Net) is already net of refunds. Gross is what customers paid, and Net is store proceeds after commission and, where the store reports it, tax. Trial-period transactions are excluded. Refunds are also reported separately as an absolute amount; don't subtract them from Revenue again.

## Why don't Qonversion's Apple Ads numbers match the Apple Ads console?

Qonversion's report differs from the Apple Ads console by design:

| Reason | Details |
| - | - |
| Different population for subscriber metrics | Spend, impressions, taps and installs come from Apple. Subscriber metrics (trials, payers, revenue, ROAS) cover only installs that Qonversion attributes to Apple Ads with a known campaign, grouped by install date. |
| Revenue is cumulative to date | Subscriber revenue keeps growing after the selected period ends. |
| UTC days | Qonversion uses UTC days for every date: periods, cohort install dates, window boundaries and the "Updated" timestamps. |
| Currency conversion | Apple spend in the organization's currency is converted to USD (by each spend date's rate where daily spend is available), and then into the report currency at a single rate. When a needed rate is missing, the affected money and ratios are withheld rather than shown as zero. If no rate exists for the report currency, the report falls back to USD and says so. |

## What is not supported?

* **Update now** can't be triggered from the Qonversion REST API or the MCP server; it is dashboard-only.
* Spend import is dashboard-only; there is no MCP tool or REST endpoint for it.
* Spend history from before you connected is not backfilled automatically.
* A spend import can't add dates from the last 90 days (UTC), can't fill gaps inside recorded history, and never overwrites or updates recorded rows.
* A spend import can't use ad group, keyword, search term, match type, ad or creative set reports; only campaign-level reports are accepted.
* Imported spend is never currency-converted.
* Roles other than owner and administrator can't import spend history.

## Related pages

* [Read the Apple Ads report](/docs/apple-ads-report) explains every report column, the Growing and Mature readings, and cohort window metrics.
* [What does the Budget usage column show for Apple Ads campaigns?](/docs/apple-ads-budget-usage) explains the 7-day budget usage reading, its bands and why a reading can be unavailable.
* [Connect Apple Ads](/docs/apple-search-ads) explains how to connect your Apple Ads account to Qonversion, which starts spend history recording.
* [Apple Ads via MCP](/docs/mcp-apple-ads) explains which Apple Ads report data AI agents can read through the Qonversion MCP server.
* [Apple Ads](/docs/apple-ads) gives an overview of the Apple Ads integration in Qonversion and where you read Apple Ads data: the dashboard, the REST API or MCP.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.