| digest | No | **What the customer was last mailed** — the weekly digest, sent Wednesdays, that leads with the measured week and at most three moves. Null when none has gone out yet. Anything here is breakfast reading, not news: say "as your digest said" rather than presenting it as a discovery, and lead with what happened since `sent_at`. | |
| window | Yes | The window actually read, which is not always the one asked for: an inverted range is swapped, a range past three years is shortened, and first-party figures are pulled back to the last day App Store Connect reported. Quote these dates, not the requested ones. | |
| app_ids | Yes | The apps this covers. | |
| caveats | Yes | Everything the reader has to hear before this reads as a complete picture: apps with no connection, a window shortened to the last day Apple reported, a corpus larger than the movers shown. **Pass these on.** A composed answer that drops them is the confident-and-wrong failure this tool exists to avoid. | |
| reviews | Yes | Review arrivals — a flow, counted over the period. Not the backlog of unanswered reviews, which has no window and is on the console's reviews screen. | |
| signals | Yes | What the product itself detected. A stored record, not a reconstruction — quote these sentences rather than re-deriving them from the numbers. | |
| headline | Yes | The two or three sentences a person would open with, each carrying its own figures. Lead with these; everything below is the evidence for them. | |
| keywords | No | The keyword half. Null when the account tracks no apps. | |
| performance | No | The measured half. **Null when the account has no apps at all**, and present with null figures when it has apps but no App Store Connect connection — those are different answers, and the caveats say which. | |
| comparison_window | No | What everything here is read against. Null when `compare` was `none`. | |