App Sales Dash FAQ

About App Sales Dash

What is App Sales Dash?

App Sales Dash is a native macOS app that consolidates everything your apps earn on the Apple App Store, Google Play and Stripe into one local dashboard: subscriptions, paid apps and one-time purchases. It prepares monthly statements for accounting and reads sales, download, subscription and payout data straight from the three stores’ own APIs, and everything it reads stays on your Mac.

Who is App Sales Dash for?

Solo developers and small studios who sell apps, one-time unlocks or subscriptions through the stores, have one app or several, and have to reconcile store payouts with bank statements for accounting.

Does it work for paid apps and one-time in-app purchases, or only subscriptions?

Both. Paid apps and one-time purchases are counted beside subscriptions, so all your store income sits in one place, and the Revenue tile shows the two parts.

What makes it different from the stores’ own dashboards?

You can see which numbers are settled and which are still moving. Every figure says whether it is an estimate or a final, a figure with nothing behind it reads No data rather than 0, and a store’s restatement arrives as a notice you can read, so when you hand a total to your accountant you know which parts of it can still change.

Is App Sales Dash a service?

No. It is an app. There is no server behind it: the database, the raw report archive and the exported statements all live on your Mac.

Does App Sales Dash require an account?

No. There is no App Sales Dash account or sign-in. You connect your own store accounts using credentials you create in the stores’ consoles.

Which Macs are supported?

App Sales Dash requires macOS 15 or later and runs on Macs with Apple silicon or an Intel processor.

Is App Sales Dash available on Windows, iPhone, iPad, or the web?

No. It is a native macOS app. There is no web version, no multi-user or sync feature, and no API.

Does App Sales Dash replace the stores’ consoles?

No. It reads from them and writes nothing back: App Store Connect, Play Console and the Stripe Dashboard remain the places where you manage apps, prices and payouts. App Sales Dash is the one place their numbers meet and get reconciled against the bank.

Does the app have to stay running to stay current?

The refresh interval is yours, from Every hour to Only when I ask, and there is a Launch at login toggle. A Mac has to be awake to refresh its own copy, but nothing is lost while it sleeps: each sync catches up from its watermark.

Your data and privacy

Where does my data live?

In a SQLite database and a raw report archive on your Mac. Settings > General shows the location and offers Show in Finder.

What leaves my Mac?

Requests to the three stores’ own APIs and to the European Central Bank’s exchange-rate feed. Nothing else. Your figures are never uploaded anywhere.

Does App Sales Dash collect analytics?

No. Nothing about how you use the app is measured or sent anywhere. The only requests it makes are to the three stores’ APIs and the European Central Bank’s rate feed.

Where are my store credentials kept?

In the macOS Keychain of the Mac where you entered them. As the app itself puts it: they are sent to the stores’ own APIs and nowhere else.

Can the app write to my store accounts?

No. Every store connection is read-only. The Stripe key is created with seven Read permissions and nothing writable, and every request the app makes is a read, including Test and Stripe’s Detect.

Does it store my customers’ personal data?

The database stores none: figures are aggregated at country level, and customer names, emails and addresses are never written to it. The raw report archive keeps each store’s responses verbatim, and a Stripe response can include customer details as Stripe supplied them. Those bytes stay on your Mac and are read only when the app re-parses its own records (see the Privacy Policy).

How do I back it up?

Settings > General > Back up… writes one zip holding the database and every raw report ever downloaded; Restore… puts one back, after telling you exactly what will be replaced and where the current data is kept. Keep the zip somewhere other than this Mac: an external disk or your usual cloud backup. If the Mac’s disk fails, a backup sitting on it goes too.

Why does the raw archive matter?

Apple deletes its daily reports after one year. For days older than that, the copy in your archive is the only one that exists anywhere.

Can I move App Sales Dash to another Mac?

Back up on the old Mac and restore on the new one. Credentials are not in the backup (they live in the macOS Keychain of the Mac where they were entered), so they are entered once more on the new Mac.

Stores and credentials

What does each store need?

  • App Store: an Issuer ID, a Key ID, a .p8 private key file, and the Vendor Number.
  • Google Play: a service-account JSON key, the reports bucket’s Cloud Storage URI, and the package name.
  • Stripe: one restricted, read-only API key.

Do I need to be a programmer to set this up?

No. Nothing in the setup needs programming knowledge, but each store requires a fairly senior account role: Apple’s key needs the Account Holder or an Admin, Google Play needs the developer-account owner or an admin, and Stripe needs an administrator.

Are the in-app guides enough, or do I need separate instructions?

The in-app guides are the instructions. Each store’s row in Settings > Stores offers Setup guide… in its ··· menu: who can do it, what you end up with, roughly how long it takes, and, most usefully, the one step per store where a plausible wrong choice produces a credential that authenticates perfectly and reads nothing. The guides also tell you that stores redesign their consoles from time to time, so if a screen does not look exactly like the walkthrough, follow the setting it names rather than the picture.

What kind of Apple key do I need?

A Team key (created on the Team Keys tab of App Store Connect’s API page, not the Individual Keys tab) with Access set to Finance. An Individual key belongs to one person, signs in perfectly, and is refused every report; the guide calls this out because it is the most common way the setup fails.

Why Finance and not a narrower Apple role?

Finance covers both the monthly financial reports and the daily Sales and Trends data. A Sales key reads the daily reports only, and the financial reports are what your payouts reconcile against.

What permissions does the Google service account need?

Two, both granted on Play Console’s Account permissions tab: “View app information and download bulk reports (read-only)” and “View financial data, orders, and cancellation survey responses”. They must be account-wide. Granting the same two for a single app produces a service account that looks perfectly configured and is refused every request.

I connected Google Play and nothing appears. Is something broken?

Usually not. Play access can take up to 36 hours to take effect after the invitation, though it usually takes minutes. Google Play’s reports also begin only once the Play account has financial activity, so an account that has not yet had its first sale has nothing to fetch.

What exactly does the Stripe key need?

Seven resources set to Read and everything else left at None: Balance, Charges and Refunds, Payouts, Invoices, Subscriptions, Prices, and Credit notes. The key never writes anything to your Stripe account.

Why does the app insist on the Credit notes permission?

Credit notes are the only source for credits that never move money. Without that permission your revenue would read higher than it really is, so the app stops the Stripe source outright instead of carrying on with a piece missing. Permissions on an existing key can be edited without re-creating it.

What is the Detect button beside API version in the Stripe sheet?

Stripe no longer shows an account’s default API version on most dashboards, so the app reads it from the account itself: paste the restricted key, leave API version empty, and press Detect. Detect makes one read-only request, pins the version it finds, and proves the key works while it is there. A version sitting in the field is evidence of a real authenticated call.

How do I know a credential works?

Use the store’s Test button in Settings > Stores. It makes exactly one cheap read and writes nothing, and it keeps its verdicts apart. A key the store refused, a key that authenticates but is not allowed to read reports, and a test that simply got no answer are three different problems with three different fixes.

How long does the first import take?

Apple’s first history download takes roughly ten minutes. Quitting is safe. The download resumes where it stopped and nothing is downloaded twice.

I have several apps. Can I look at one on its own?

Yes, for all three stores: each credential covers the whole account, so everything sold under it is imported. The same app on the App Store and Google Play is recognised as one app. A picker beside the timeframe shows All apps, one app or Unassigned, every screen follows it, and the choice is remembered. Settings > Apps lets you rename, merge and split apps and assign Stripe prices to them.

Is my app on the App Store and Google Play counted as one app?

Yes, when its bundle id and package name match. If they do not, merge the two in Settings > Apps.

Can I rename, merge or split apps, or say which Stripe prices belong to which app?

Yes, all in Settings > Apps. Prices you have not assigned show under Unassigned, and the app tells you when a figure includes unassigned rows.

What happens if I only connect one or two stores?

The missing store simply contributes no figures, and each affected screen names the store that is missing, so you can tell a slow month from an unconnected store at a glance. Stores can be set up in any order.

What happens if a credential stops working later?

The store’s health chip reads Needs attention, and the app says plainly that retrying will not clear it. The credential has to be re-issued or re-granted in Settings. A failing store never blocks the other two.

Numbers, estimates and finals

Why did a figure change after I first saw it?

Daily figures start as the stores’ own estimates. When a store publishes its final report for a period, the totals switch to those finals, and the notes behind the Revenue chart’s (i) name the restated period (“Finalised on <date>. The estimates for this period have been superseded.”) instead of the change being applied quietly.

When does a month become final?

Per store: Apple’s final figures arrive about a week after its own settlement period closes, Google’s around the third of the following month, and Stripe’s figures are final as they happen. The app also states the date each period’s finals are due, and says plainly when a store is overdue. A month with no sales becomes final too: for Stripe once the app has read the whole month, for the App Store once Apple confirms there is no financial report and the month’s estimates come to zero. A missing Google Play report never counts as an empty month.

What do Final, Allocated, Estimate, Part estimate and No figure mean?

Every figure carries one of five bases:

  • Final: the store’s own settled figure. It will not change.
  • Allocated: a settlement total spread across its days: exact for the period, an inference for the individual day, and never restated.
  • Estimate: no finals have landed yet; the figure will be restated when they do. Charts draw finals and settled days solid; only estimates are drawn lighter.
  • Part estimate: the span covers settled and unsettled periods, so part of the figure will still change.
  • No figure: nothing was reported, so the amount reads No data. See “Why does a figure say No data instead of 0?” below.

Why is part of a chart lighter?

Only estimates are lighter. Finals and settled days are solid, so you see at a glance what can still change.

Why are Apple’s calendar months so often Allocated?

Apple settles by its own fiscal months: four or five weeks that start and end mid-month. So a calendar view of Apple is nearly always an allocation of settled totals across calendar days. App Sales Dash shows each fiscal month as a settlement period in real dates beside the calendar month, on screen and on statements.

What is a caveat?

A note explaining a limit on the figures, such as rows without an exchange rate or subscriptions without a measured rate. Open the panel’s (i) to read its notes and any steps you can take. Missing figures stay visible as No data.

Why can a month be negative?

Refunds. Refund rows carry negative amounts because they reduce what the period earned, and a period in which refunds outweigh sales sums below zero. The app reports that sum as it stands rather than clamping it at zero. You can see where refunds sit: the Overview shows revenue including refunds, the Revenue screen has a Refunds column per store, and the Sales screen shows refunded units.

Does it show refunds?

Yes. The Overview, Revenue and Sales charts draw refunds below zero in red, in the period the store reported them.

Does it show how many people downloaded my app?

Yes. Downloads counts first installs: free and paid from the App Store, paid from Google Play. Refunds do not lower it; updates and re-downloads are excluded. Google Play does not report free installs, and Stripe has no installs. Net units sold and Sales revenue cover paid apps and one-time purchases. Free downloads earn nothing.

Can I see sales and downloads by country or by app version?

Yes. The Sales screen has By version and By country tables under its charts, with refunded units and amounts beside them.

Can I split revenue into subscriptions and one-time sales?

Yes. The Revenue tile shows both, and the Revenue chart can split by Type. Stripe’s account-level fees and refunds appear as Other.

What are Proceeds and Customer spend?

The Amounts toggle switches between two bases: Proceeds is what the stores pay out, before your own VAT; Customer spend is what customers paid, including store commission and tax. Apple’s customer price is read too, as an estimate from the daily report and finally from the monthly report, so all three stores show customer spend. Apple’s commission and tax are not broken out, because Apple does not split them.

Does it include what App Store customers paid, not just my proceeds?

Yes, as an estimate from the daily report and finally from the monthly report. Apple’s commission and tax are not broken out, because Apple does not split them.

What currency are the figures in?

In your consolidation currency, converted with the European Central Bank’s daily reference rates. You choose it in Settings; where you have not, the app uses the currency your stores say they pay you in, and where two stores disagree and you have chosen nothing, cross-store totals show a dash rather than a figure in a currency nobody picked. If no store states one, as with an App Store-only account, it uses your Mac’s region, and Settings says so. In the payout ledger, Stripe payouts stay in the currency Stripe pays you in, and expected App Store and Google Play payouts are shown in your consolidation currency, which makes them estimates of what the bank will receive. A row whose currency has no published rate for its day is left out of the total and counted (the chart says how many rows the total is short by) rather than converted at a guess.

Why does a figure say No data instead of 0?

No data means nothing was reported for that figure. The bar is absent and the figure reads No data rather than 0. 0 means a quiet day inside a period the store did report, so you can tell the two apart.

Why does a count say “as of” an earlier day?

Because the count is measured on the newest day every connected store has reported. If one store is a few days behind, the whole count is dated to that day, and the app shows you the date so you know how current the number actually is.

How far back does the history go?

Download available history… in Settings > General fetches each store’s available history. Apple keeps daily reports for one year only; older days cannot be recovered anywhere. Your archive keeps everything downloaded.

What happens when an update improves a report reader?

The archived raw reports are re-read locally (nothing is re-downloaded), and any figure that changes as a result is announced in Notifications. The raw bytes of every report are kept verbatim precisely so that a better reader can be applied to history.

Subscriptions and MRR

What subscription figures does the app track?

Active paid subscriptions, active trials, new subscriptions, cancellations, churn, trial conversion, and MRR with its movements: New, Expansion, Contraction, Churned, Reactivation. Where a store cannot report one of these, the app says so instead of showing a zero. A free trial that ends before its first payment counts as a trial ending, not a cancellation.

Is a cancelled free trial counted as a cancellation?

No. A trial that ends before its first payment is a trial ending, so it does not inflate churn. Churn is measured against everyone who paid in the period, and All time shows a value.

How is MRR measured?

MRR is a rate times a count. The rate is measured from what each store actually paid per subscription over a trailing window, never read off a price tag, because Apple’s proceeds move with the commission tier and the buyer’s tax treatment, so a list price would be wrong even where one exists.

What happens to a plan without a measured rate?

Its subscriptions are counted but left out of MRR entirely, and the app says how many (“left out of MRR”) rather than pricing them at zero. So you know how much of your MRR is unmeasured before you quote it to anyone. The subscriptions are still counted, and the figure beside MRR tells you how many are missing from it.

Can I leave a plan out of MRR?

Yes. In Plans and rates, choose Disregard plan from the plan’s ··· menu. The plan leaves Plan names, Rates, By plan and MRR; revenue, sales and counts stay as they are. Regard again brings it back, and Notifications tells you if a disregarded plan earns money again.

Can I override a measured rate?

Yes. Rates, in Plans and rates at the foot of the Subscriptions screen, has an Override box per plan; a figure typed there replaces the measured rate until the box is emptied again, and is marked as yours wherever it appears. Enter what one billing period earns after the store’s commission and tax, not the store-listing price.

Where do plan names come from?

From the stores where they state one (Stripe names its prices), from a linked plan on another store, or from you. Plan names, in Plans and rates at the foot of the Subscriptions screen, shows the store’s own name in grey and takes your name beside it.

Can I rename a plan?

Yes. A name typed under Your name is used everywhere in the app; leave the field empty to fall back to what the store itself calls the plan.

Why does the app ask me for billing periods on Google Play plans?

Google Play publishes no billing period (neither its earnings report nor its sales report carries one), and without the period a payment cannot be spread over months. You set it once per base plan in Rates, in Plans and rates at the foot of the Subscriptions screen; Apple states its periods in the daily reports and Stripe’s catalogue states them outright, so those are read rather than set.

Do trials count toward MRR?

No. MRR covers paid subscriptions; trials are counted separately as Trials, and the trial funnel tracks started versus converted. A free trial that ends before its first payment counts as a trial ending, not a cancellation.

Why does a cancelled yearly subscription appear a year after the customer opted out?

Apple reports a cancellation when the paid period ends, not when the customer opted out, so a cancelled yearly subscription appears on its expiry date. The app says this on the chart rather than leaving the timing to look broken.

Why do the most recent subscription figures keep shifting?

Google Play’s subscription statistics lag 3 to 7 days. Figures for the trailing days are marked provisional, and the app names the date from which they will still change.

Reconciliation and statements

What is the payout ledger?

One row per expected store payout: the settlement period, the store, the expected amount, the bank credit recorded against it, the difference between the two, and a status. It is the bridge between what the stores say they will send and what your bank statement shows arrived. Expected App Store and Google Play payouts appear by themselves once the stores’ final reports arrive. When Stripe reports a payout paid, its row arrives with the amount received and the arrival date, marked Matched. Payouts are reconciled per store account; the app picker does not apply here, and the screen says so.

Does the app picker apply to reconciliation?

No. Payouts go to the store account, not to an app, so the ledger always shows the whole account and says so.

When does a payout appear in the ledger?

An App Store row appears once Apple’s monthly financial report arrives and shows proceeds, with an estimated amount and the day Apple usually pays: about 33 days after the end of Apple’s fiscal month. Apple commits only to paying within 45 days. Google Play’s rows appear the same way once it has earnings, with payment expected around the 15th of the following month. Stripe’s rows come from Stripe itself, with each payout’s own arrival date. The expected amounts and days are estimates, not promises from the stores.

What do the ledger statuses mean?

  • Expected: the store has quoted a payout; no bank credit is matched to it yet.
  • Matched: a recorded credit agrees with the expected amount within tolerance.
  • Mismatch: a credit is recorded and differs beyond tolerance; the difference stays on the row.
  • Carried forward: a status you set when a store holds an amount over to a later payment.
  • Ignored: left out of reconciliation and hidden until you turn on Show ignored; periods downloaded with the history from before the ledger start arrive this way.

How do I record a bank credit?

Select the payout’s row and press Record bank credit: the amount credited, its value date, and an optional bank reference. Stripe payouts usually need nothing: Stripe reports the credit itself, and you correct it only if your bank shows a different amount. If Stripe later reports a payout failed, the credit it reported is taken back. A credit you entered is never changed when reports are refreshed. Stripe writes its payout trace id into the bank reference, which is the fastest way to find the line on the bank statement again.

What if the bank credited a different amount than expected?

The difference is recorded, not reconciled away. Expected App Store and Google Play payouts are converted at ECB reference rates while the stores pay at their own, so a small gap is normal; intermediary bank charges show up there too. Within the tolerance the row reads Matched; outside it the row reads Mismatch and keeps the difference on it.

What if a payout is settled in a currency with no exchange rate?

A Stripe payout needs no rate: the expected amount, the credit and the difference are all in the currency Stripe pays you in. An App Store or Google Play payout without a rate is shown in the currency the store reported, if the whole month was in one currency; if it was spread over several, no row appears for it. Record a credit in the row’s currency. The only other cost of a missing rate is that row’s place in a cross-store total, and the ledger says so.

Why do old periods arrive marked Ignored?

The ledger starts with the first full month after installation. Periods downloaded with the history from before that arrive Ignored and hidden. Turn on Show ignored, then Select before and Mark selected mark a run of them in one action, so nobody has to hand-match a year of old bank statements.

Can statements carry my company’s branding?

Yes, and all of it is optional: a company and address letterhead, a logo, typefaces chosen from the fonts installed on your Mac, and a wordmark that prefixes every exported filename. Whatever you supply is what prints; leave the fields empty and the statement comes out plain. The app never adds branding of its own.

What formats do statements export in?

PDF, CSV, or both, per store and consolidated across all three, for all your apps or for one app. One-time sales have their own lines, the CSV says which kind of product each line is, and when a period has refunds the totals read Gross sales, Refunds, Net proceeds with every refund listed. They are written into a folder you choose, and nothing already in it is overwritten. A name that is taken gets a copy written beside it.

Can I give my accountant a statement for one app?

Yes. Choose one app when you export. The statement lists that app’s lines and totals and leaves out the payout, because stores pay the account, not the app, and it says so.

How do refunds appear on a statement?

The totals read Gross sales, Refunds, Net proceeds, and a Refunds section lists each refund with date, store, product, country, units and amount.

What language are the statements in?

English.

Availability

Where can I get App Sales Dash, and what does it cost?

On the Mac App Store, as a one-time purchase: USD 24.99 until 31 December 2026, then USD 49.99. The App Store shows your local price. There is no subscription and no in-app purchase.

How do updates arrive?

Through the Mac App Store. When an update improves how a report is read, your archived reports are re-read locally and any changed figures are announced (see “What happens when an update improves a report reader?” above).

Where do I ask a question this page does not answer?

Through the contact form on this site.

Last updated