Blog / Monitoring

App Store sale notification: know the moment someone buys your app

There are four honest ways to learn that someone bought your app, and they are not equally fast.

  • The dashboard is the slow way. App Store Connect's Sales and Trends lags — often a day or more — and proceeds report monthly. It is the last place to learn a sale happened, not the first.
  • Apple's real-time signal already exists. StoreKit 2 gives your app the verified transaction on device; App Store Server Notifications v2 post to your server in near-real-time for buys, renewals, and refunds.
  • DIY works, and it stops at "a purchase happened." You can stand up an endpoint to catch the notifications and ping yourself. It confirms the event — nothing about the person.
  • The shared ceiling is the same as Stripe's. Every route above is triggered by a transaction, so it can only report the transaction. It can't name the buyer, their plan, or their lifetime value.
  • The fix is identity, not another channel. Crossdeck verifies Apple's signal and joins it to the customer, so the alert names who bought, which plan, and their lifetime value — read from your live data, never estimated.
  • Live to Telegram, before Connect catches up. The alert lands in a private chat as soon as the verified purchase does, and with a model connected in the Prism tab you can ask "is this a new install or a resubscribe?" off your live numbers.

Definitions used in this guide

App Store sale notification

An alert raised when an App Store purchase or subscription is bought. In its basic form it reports that a transaction happened — a product and a price, not the person behind it.

App Store Connect (Sales and Trends)

Apple's reporting dashboard for downloads and revenue. Accurate, but delayed — commonly a day or more — with proceeds reported monthly. A ledger, not a live feed.

StoreKit 2 transaction

The verified purchase record your app receives on device the moment a buy completes. The earliest signal you own, and cryptographically checkable.

App Store Server Notifications v2

Apple's near-real-time, server-to-server messages for the purchase and subscription lifecycle — buy, renewal, failed renewal, refund, cancellation — signed so you can verify they came from Apple.

The cross-match

Crossdeck joining revenue, entitlements, analytics and errors by identity across Apple, Google Play and Stripe, so a purchase resolves to a customer and lands on that customer's one timeline.

Verified subscription / entitlement

What a customer is actually entitled to — the plan or tier behind the transaction, confirmed against Apple's signal. Naming it in an alert requires joining the purchase to the entitlement record.

Lifetime value (LTV)

What a customer has paid you across their whole relationship, on every rail. It lives in revenue history, not in any single transaction — so a raw purchase event can't show it.

Prism

Crossdeck's plain-English question tool in the Telegram bot. It answers off your live numbers using your own connected AI model and key — once you connect one in the Prism tab.

How to find out someone bought your app: the short answer

There are four honest ways to learn that someone bought your app, and they are not equally fast. The one most founders reach for — App Store Connect's Sales and Trends dashboard — is the slowest, because it lags a day or more and reports proceeds monthly. The three faster routes all use a signal Apple already emits in near-real-time: StoreKit 2 transactions in your app, App Store Server Notifications v2 to your server, and a DIY endpoint you build to catch those and ping you. Any of them will tell you, within moments, that a purchase happened.

So this guide is careful to be accurate about Apple: the internet is full of the claim that "Apple gives you nothing real-time," which is simply not true. The Connect dashboard is delayed; the purchase signal is not. But it is also honest about the one thing every route stops short of. Each is triggered by a transaction, so each can only ever tell you about the transaction — not who that was, or whether they are a brand-new customer or someone resubscribing. That gap, and how an identity-joined alert closes it, is the back half of the article. It is the same argument we make for the other rail in the Stripe sale notification guide; here it is pointed at Apple.

App Store Connect: the report you keep refreshing

Start with the honest truth about the dashboard, because it is the frustration that brought most people to this search. App Store Connect's Sales and Trends is where you go to see downloads and revenue, and it is accurate. It is also delayed: sales data typically shows up around a day after the fact — sometimes longer — and your actual proceeds are reported on a monthly cycle. If you shipped something this morning and want to know whether it is selling this afternoon, the dashboard is the wrong instrument. It is a ledger you reconcile, not a feed you watch.

It is worth stating this carefully, without the usual Apple-bashing, because the nuance is the whole point. The delay is a property of the reporting dashboard, not of Apple's platform as a whole. Apple finalises reported figures on a schedule for good reasons — reconciliation, refunds, currency, tax — the way any global marketplace closes its books. That simply means Sales and Trends answers "how did last period go" far better than "did I just make a sale." For the second question you want a different signal — and Apple already emits one. We go deeper on living with the reporting delay in seeing app revenue in real time before App Store Connect catches up.

StoreKit 2: the signal already in your own code

The earliest place a purchase becomes knowable is inside your own app. With StoreKit 2, when a customer completes a buy, your app receives a verified Transaction right then — on device, the moment it happens, cryptographically signed so you can check it is genuine. This is the signal you use to actually deliver the goods — grant the content, mark the subscription active — and it is real-time by construction.

The reason StoreKit alone is not a complete answer to "notify me of sales" is where the signal lives. A StoreKit transaction fires on the buyer's device — exactly right for granting access, but awkward as a notification source: you would be relying on the client to phone home, and a purchase that completes while your backend is unaware is a familiar source of grief. That is why serious setups pair the on-device transaction with a server-side confirmation, so the sale is known to your systems, not just to one phone. Handling and verifying those transactions well, without standing up a full billing backend, is its own topic; we cover it in validating App Store purchases without building subscription infrastructure and, for the analytics angle, in StoreKit 2 subscription analytics.

Server Notifications v2: Apple's real-time hook

Here is the piece most "Apple is a black box" complaints miss. Apple provides a proper, near-real-time, server-to-server signal: App Store Server Notifications v2. You configure a URL in App Store Connect, and from then on Apple posts a signed message to that endpoint whenever something happens against a transaction — an initial purchase, a renewal, a failed renewal, a refund, a cancellation. It arrives within moments, and because it is signed, you can verify it genuinely came from Apple rather than trust a client.

This is the real-time hook to build on. It is server-side, so it does not depend on a device checking in; it covers the whole subscription lifecycle, not just the first buy; and it is the same class of signal a payment processor's webhook gives you on the card rail. If you want to understand the notification types and how to consume them, we wrote a founder-level walkthrough: App Store Server Notifications v2, explained for founders. For this guide, the important thing is what the notification is and is not. It is a fast, trustworthy purchase event — not a customer view. It tells you a transaction changed state, not who the buyer is across your other rails, which plan they hold in your own terms, or what they have paid you to date. Those answers live in layers the notification never touches.

The DIY endpoint: build it yourself

Given that Apple sends the notification, the obvious move is to catch it yourself. Stand up a small endpoint, point App Store Server Notifications v2 at it, verify the signature, and have it push you a message — into Slack, email, or your phone — whenever a purchase lands. Plenty of teams do exactly this, and for a solo developer who just wants a buzz on the first sale, it is a reasonable afternoon's work.

Be clear-eyed about what you are signing up for, though, because the endpoint is the easy 20%. To keep it trustworthy you have to verify Apple's signatures, handle every notification type and subtype, deal with retries and out-of-order delivery, and reconcile against the App Store Server API when you need fuller history. And when you are done, you have a reliable pipe that still only carries a purchase event. The DIY route gets Apple's real-time signal into a channel you like; it does not, by itself, get you the customer behind the sale — the same instinct that makes a raw error log frustrating, which we wrote about in what plain-English summaries are and why founders need them.

Every route to an App Store sale notification, compared

Here is the honest comparison of the routes above. The columns move together until the last one — because they are all reading the same transaction layer, just at different speeds and in different places.

Ways to find out someone bought your app
RouteSpeedWhere it livesWhat the signal can carry
App Store Connect (Sales & Trends)Delayed — ~a day; proceeds monthlyApple's dashboardAggregated units and revenue, after the fact
StoreKit 2 transactionInstant, on deviceInside your appThe verified purchase, on one device
Server Notifications v2Near-real-timeYour server endpointThe lifecycle event, signed
DIY endpoint → Slack / emailNear-real-timeYour channelThe transaction, formatted by you
Identity-joined alert (Crossdeck)Near-real-time, verifiedTelegram, private chatWho bought, which plan, lifetime value

The first four rows are the right answer to "how do I know when someone buys my app." If that is all you needed — a fast, trustworthy heads-up that a sale happened — pick the route that matches your appetite for building and set it up. The last row is a different kind of answer, because it is built on a different layer, and the rest of this guide is about why that last column matters the day a bare purchase event stops being enough.

The wall: a purchase event says "new subscription" and nothing else

Here is the moment every growing app hits. A notification fires. It says, in effect, new subscription — Pro, $9.99. And your very next thought is a question the event cannot answer: who was that? A brand-new customer, or someone who churned in March and just resubscribed? Is "Pro" the monthly or the annual? What have they paid you before across every rail — someone worth $9.99, or someone worth $214 who just came back? The purchase event is silent on all of it, and it is silent for a structural reason worth understanding.

A transaction is a single-layer fact. A product identifier, a price, a timestamp, a signed confirmation that it is real. That is the entire content of the event — whether it reaches you through StoreKit, through Server Notifications v2, or through the DIY endpoint you built to catch them. Everything you actually want to know lives in other layers: which plan the product maps to lives in your entitlements; whether this is a new or returning buyer lives in your customer records; the lifetime value lives in your revenue history, across every rail; the past errors live in your error monitoring. Apple's signal is genuinely real-time, but it has no join to those layers, so it reports the purchase and only the purchase. The signal is not underbuilt — it describes one event, and the answer lives across several.

This is the same shape of problem behind a lot of "why can't my tools just tell me" frustration — revenue on one rail, customers in another system, errors in a third, no thread connecting them. We wrote about the broader version in the complete guide to app revenue intelligence, and the whole real-time cluster starts at the hub, real-time business monitoring. The sale alert is where the gap gets personal — the moment you have a name-shaped hole in front of you and nothing to fill it with.

An alert that names the customer, their plan, and their value

The fix is not another notification channel, and it is not asking Apple to speed up a report it finalises for good reasons. It is a different foundation under the alert. Crossdeck ingests and verifies Apple's own signal — StoreKit 2 transactions and Server Notifications v2 — and joins the verified purchase to the customer by identity, the cross-match, so the sale lands on that customer's one timeline across Apple, Google Play and Stripe. The transaction becomes one event on a person's history — and because that history is right there, the alert carries what a raw purchase event never could.

Concretely, instead of "new subscription — Pro, $9.99," an identity-joined alert reads more like: New App Store subscription — $9.99. Alex (returning customer) started Pro (annual) after churning in March. Lifetime value now $214. No open errors. Every field comes from a different layer, joined to one identity: the amount and product from the Apple rail, the plan from entitlements, "returning customer" and the lifetime value from revenue history, the error status from error monitoring. None of it is estimated — every figure is read from your live Crossdeck data. (The name and numbers are illustrative; the shape of the alert is the real thing.)

Two points of accuracy, because they matter. First, this arrives before App Store Connect's Sales and Trends would show the sale — not because Crossdeck outruns Apple, but because it reads the real-time signal Apple already emits, which the reporting dashboard lags behind. Second, none of this touches Apple's payouts: your proceeds still land on Apple's schedule. What changes is your awareness — that when the sale surfaces, it surfaces with the customer attached. It is the same instinct behind knowing when a paying customer hit a checkout error.

A raw purchase event vs an identity-joined sale alert
The alert answers…Purchase event (StoreKit / ASSN v2 / DIY)Identity-joined alert (Crossdeck)
What was bought, and when?Yes — product and timeYes — product and time
Is it verified as genuine?Yes — signed by AppleYes — verified, then joined
Who bought?NoYes — the named customer
New customer or a resubscribe?NoYes — resolved from their history
Which plan, in your own terms?No — a product ID onlyYes — from entitlements
What are they now worth, across rails?NoYes — lifetime value to date
Have they hit errors before?NoYes — joined from error monitoring
Built on…The transaction, one layerThe customer's identity, all layers

The last row is the whole argument. A raw purchase event is built on the transaction, so it can only ever show you the transaction — however fast and however well-verified it arrives. An identity-joined alert is built on the customer, so the sale arrives with its context attached. Same trigger — a verified App Store purchase — but a different foundation, and a completely different alert.

Ask a follow-up: "is this a new install or a resubscribe?"

There is one more thing an identity-joined alert can do that a purchase event structurally cannot: hold a conversation. With a StoreKit hook, a Server Notification, or your own DIY ping, the message is the end of the exchange. Crossdeck delivers its sale alerts through a Telegram bot, live today in a private chat with you, and the chat is two-way.

When a sale lands, you can do more than read it. You can open a Mini App dashboard for the fuller picture — Home, Revenue, Errors and People, with a project switcher if you ship more than one app — or run hard-data commands right in the chat: /revenue for this month's recognised revenue, /people for latest customers, /status for a health check. And if you want to just ask, that is what Prism is for: with /prism you type a plain-English question — "is this a new install or a resubscribe?", "what has this customer paid us across Apple and web?" — and get an answer off your live numbers.

Two things matter about how Prism works, and both are the point. First, it runs on your own connected AI model, with your own key — you connect a model in the Prism tab first, and from then on the questions are answered by your model, not by anything Crossdeck runs on your data. Crossdeck never trains on your data; the model and the key are yours. Second, the answer is grounded in your live Crossdeck data — not a guess or a generic estimate, but your real history, read at the moment you ask. You can see how that works on the Prism page. A sale alert you can interrogate is a different tool than one you can only read.

One honest note on scope: today the bot runs in your private chat, one-to-one. Shared team and group chats — where your whole team gets the alerts and asks Prism together — are on the roadmap, not shipped. For now, think of it as your own line to your numbers, not a team channel yet.

How to choose

None of this means ripping out what works. The right choice depends on what you want the alert to do — and for many teams the answer is more than one thing.

  • If you just want the period totals: App Store Connect's Sales and Trends is the system of record. Read it as the ledger it is, a day or more behind.
  • If you want to grant access the instant a buy completes: handle the StoreKit 2 transaction on device — that is what it is for, and it is already in your code.
  • If you want a fast, trustworthy server-side signal: consume App Store Server Notifications v2, or build an endpoint to catch them. This is Apple's own real-time hook.
  • If you want the alert to answer the next question — who, which plan, worth how much: you need an alert built on the customer's identity, not the transaction. That is the join Crossdeck makes on top of Apple's verified signal, delivered to Telegram, with a follow-up you can ask.

The test is simple. Read your next purchase notification and notice your very next thought. If it is "good," a raw purchase event is doing its job. If it is "wait — who was that?", that is the moment an identity-joined alert earns its place. This post is part of a wider set on watching your business in real time — the hub is real-time business monitoring, and the closest neighbour is the same idea on the card rail, the Stripe sale notification.

If you want to see the alert with the customer attached rather than described, start free or look at how the cross-match works on cross-deck.com.

Frequently asked questions

How do I find out when someone buys my app?

There are four honest routes. The one most founders check first is App Store Connect's Sales and Trends dashboard, but it lags — usually a day or more — and proceeds are reported monthly, so it is the slowest way to learn a sale happened. Faster is the signal your own code already sees: StoreKit 2 hands your app the verified transaction the moment a purchase completes on device. Faster still for server-side awareness is App Store Server Notifications v2 — Apple posts a near-real-time message to your server for purchases, renewals, refunds, and cancellations. Finally, you can build a small endpoint yourself to receive those notifications and ping you. All four tell you a purchase occurred; none of them, on their own, tell you who bought or what they are now worth.

How long does App Store Connect take to show a sale?

App Store Connect's Sales and Trends reporting is delayed — commonly around a day, sometimes longer — and financial proceeds are reported on a monthly cycle. That delay is real and it is the reason founders feel blind to same-day sales, but it is a property of the reporting dashboard, not of Apple's whole platform. Apple emits a separate, near-real-time signal for the events themselves through StoreKit 2 transactions on device and App Store Server Notifications v2 to your server. So the honest statement is narrow: the Connect dashboard lags; the underlying purchase signal does not have to.

What is the fastest way to get an in-app purchase notification?

The fastest signal is the one Apple already sends in near-real-time: App Store Server Notifications v2, a server-to-server message Apple posts to an endpoint you own whenever a purchase, renewal, refund, or cancellation happens. Paired with StoreKit 2 transactions in the app itself, it means you can know about a sale within moments of it completing — well before App Store Connect's dashboard reflects it. The catch is that the raw notification is a purchase event: it confirms that something was bought, but it does not carry the customer's plan, history, or lifetime value. To get those into the alert, the purchase has to be joined to the person behind it.

What are App Store Server Notifications v2?

App Store Server Notifications version 2 are messages Apple sends server-to-server, in near-real-time, to a URL you configure in App Store Connect. They cover the in-app purchase and subscription lifecycle — an initial buy, a renewal, a failed renewal, a refund, a cancellation, a billing retry — so your backend can react without waiting on a reporting dashboard. Each notification is signed so you can verify it genuinely came from Apple. They are the real-time hook Apple provides; what they are not is a customer view. A notification tells you an event occurred against a transaction, not who the buyer is across your other rails or what they have paid you to date.

Can I get an alert before App Store Connect shows the sale?

Yes, because the real-time signal exists independently of the dashboard. Crossdeck ingests and verifies Apple's own signal — StoreKit 2 transactions and App Store Server Notifications v2 — so it knows about a purchase in near-real-time and can deliver an alert to Telegram before App Store Connect's Sales and Trends catches up. To be precise about what that does and does not do: Crossdeck surfaces a purchase Apple has already confirmed sooner than the reporting dashboard would show it. It does not change Apple's reporting cadence or speed up when Apple pays you out; it reads and verifies the signal that already exists.

How do I get an App Store sale alert that shows customer lifetime value?

You need an alert built on the customer, not on the transaction. Crossdeck joins revenue, entitlements, analytics and errors by identity — the cross-match — across Apple, Google Play and Stripe, so when an App Store purchase is verified, the alert can name the customer, the plan they took, and their lifetime value to date, because all of that already sits on one timeline keyed to that person. The lifetime value is not estimated; it is read from the customer's real history in your live Crossdeck data. The alert is delivered to Telegram, in private chat, as soon as the verified purchase lands.

Can I get App Store purchase notifications in Telegram?

Yes. Crossdeck delivers App Store sale alerts to Telegram through its bot, live today in a private chat with you. Beyond the alert, you can open a Mini App dashboard, run hard-data commands like /revenue, /people and /status, and — once you have connected a model in the Prism tab — ask questions in plain English with /prism. Every figure comes from your live Crossdeck data, never an estimate. Group and team chats are on the roadmap; today the bot runs in your own private chat.

Does Crossdeck change how fast Apple pays out?

No. Crossdeck reads and verifies Apple's real-time purchase signal and surfaces it to you sooner than the App Store Connect dashboard would — but it has no effect on Apple's financial reporting cycle or on when Apple actually pays your proceeds. Those are Apple's, and they run on Apple's schedule. What Crossdeck changes is your awareness: instead of waiting a day or more to see a sale in Sales and Trends, you get a verified, identity-joined alert in Telegram the moment the purchase is confirmed. The money moves on Apple's timeline; your knowledge of it does not have to.

Crossdeck Editorial Team

Crossdeck publishes practical guides about subscription infrastructure, entitlements, revenue analytics, and error reporting for paid apps. Every guide is reviewed against Crossdeck docs, SDK behaviour, and implementation details before publication.

See it live on your own numbers

Connect your rails and get real-time alerts that name the customer, the plan, and the money — plus a Mini App and plain-English answers, live in Telegram. Free to start.