App Store Server Notifications without a serverApp Store events, on your lock screen.

App Store Server Notifications need a server to land on. Paste an Acciti URL into App Store Connect instead, and failed renewals and refunds arrive on your phone. No backend, no handler, nothing to deploy.

How do you receive App Store Server Notifications without a server?

Create a connector, copy its ingest URL, and paste it into App Store Connect as your production server URL. Acciti verifies each signed notification, decodes it and sends it to every device you're signed in on.

App Store Connect also takes a sandbox URL. Point it at the same connector and test purchases arrive with (Sandbox) in the title, so an Xcode test never reads as revenue.

How is an App Store notification verified?

Acciti runs two checks before anything reaches your phone.

Apple signed it

Apple signs each notification with a certificate chain, so there's no secret to leak or rotate. The first notification that verifies sets your bundle ID, and everything after it must match.

It's about your app

Every developer's notifications are signed by the same chain, so a valid signature alone doesn't prove the app. Acciti records your bundle ID from the first verified notification and refuses any that don't match, so nobody can replay another app's notifications into your feed.

Which App Store notifications will I hear?

Failed renewals, refunds and Apple's test notification are on from the start, and they don't grow with your sales. New subscribers and renewals arrive as often as people buy, so they start off. Turn on the ones you want to hear.

  • TESTApple's own test notification, sent when you ask for one.QuietOn
  • SUBSCRIBEDA new subscriber.QuietOff
  • SUBSCRIBEDRESUBSCRIBEA lapsed customer subscribed again, or joined through Family Sharing.QuietOff
  • DID_RENEWA subscription renewed. A trial converting to paid also counts.QuietOff
  • DID_RENEWBILLING_RECOVERYA renewal that had been failing went through.QuietOff
  • ONE_TIME_CHARGEA one-off purchase: a consumable, a non-consumable or a non-renewing subscription.QuietOff
  • OFFER_REDEEMEDA customer redeemed a subscription offer.QuietOff
  • DID_FAIL_TO_RENEWA renewal failed with no grace period, so access has stopped.HighOn
  • DID_FAIL_TO_RENEWGRACE_PERIODA renewal failed, and the customer keeps access through the grace period.NormalOn
  • GRACE_PERIOD_EXPIREDA billing grace period ended without a payment.NormalOff
  • EXPIREDA subscription expired.NormalOff
  • REFUNDApple refunded a purchase.HighOn
  • REFUND_REVERSEDApple reversed a refund, so the purchase stands again.NormalOff
  • CONSUMPTION_REQUESTA customer asked Apple for a refund, and Apple wants consumption data.NormalOff
  • DID_CHANGE_RENEWAL_STATUSAUTO_RENEW_DISABLEDAuto-renew went off. The subscription runs to the end of the period.NormalOff
  • DID_CHANGE_RENEWAL_STATUSAUTO_RENEW_ENABLEDAuto-renew went back on.QuietOff
  • DID_CHANGE_RENEWAL_PREFUPGRADEA customer moved to a more expensive plan, in effect immediately.QuietOff
  • DID_CHANGE_RENEWAL_PREFDOWNGRADEA customer moved to a cheaper plan at the next renewal.NormalOff
  • PRICE_INCREASEPENDINGA price increase is waiting for the customer to agree.NormalOff
  • PRICE_INCREASEACCEPTEDA customer agreed to a price increase.QuietOff
  • REVOKEA Family Sharing purchase stopped being shared.QuietOff

Anything else Apple sends is recorded without a notification. The dashboard lists the types your connector received without a rule, so you can add rules for what your app actually sends.

You write the message.

A rule sets the title, body and sound. Apple's formats are translated first: a price reads 9.99 USD instead of 9990, and a refund reason reads as words. Text inside double brackets disappears when Apple didn't send the value, so a free trial never shows 0 USD.

The rule behind the refund notification
{  "eventType": "REFUND",  "priority": 1,  "titleTemplate": "Refunded[[ ({{familySharing}})]][[ ({{sandbox}})]]",  "bodyTemplate": "[[{{transaction.price}} ]]refunded[[ for {{transaction.productId}}]].",  "enabled": true}

A sound for each event

A bright chime for a sale and something duller for a refund, so you know which it was from across the room.

On your wrist

Notifications mirror to Apple Watch, so you feel them with the phone in another room.

Nothing to run

No function, no queue, no certificate to renew. An app without a backend stays without one.

Sandbox kept apart

Test purchases say (Sandbox) in the title. Point the sandbox URL at a second connector to give them their own sender and sound.

Questions

How do I receive App Store Server Notifications without a server?
Paste an Acciti ingest URL into App Store Connect as your production server URL. Acciti verifies each signed notification and sends it to your phone. You don't write or deploy a webhook handler.
How are App Store Server Notifications verified?
Each notification is a JWS whose certificate chain ends at Apple's root CA, so there's no shared secret to rotate. The first notification that verifies records your bundle ID, and every later one must match it.
Which App Store notifications alert me?
Failed renewals, refunds and Apple's test notification are on from the start. New subscribers, renewals, expiries, plan changes, price increases, offers and refund requests are available but off, because they arrive as often as people buy. Types without a rule are recorded, and the dashboard lists them so you can write one.
How do I tell a sandbox notification from a real sale?
Sandbox notifications carry the environment in the title, so a test purchase reads "Renewed (Sandbox)" and a real one reads "Renewed". Point App Store Connect's sandbox URL at the same connector, or at a second one with its own sender and sound.
Why do several renewals arrive at once?
Apple sends a notification for every family member who shares a subscription. Those read "Renewed (Family Sharing)" and name no price, so the one with a price is the sale.
My server already receives these notifications. Can it keep them?
Yes. App Store Connect takes one production URL, so point it at Acciti and turn on forwarding to your server's URL. Every notification that verifies is posted on unchanged and signed, whether or not it alerts you.
Does this replace App Store Connect?
No. Acciti tells you the moment something happens. Revenue reports, trends and payouts stay in App Store Connect.

Stripe, GitHub, Sentry, Grafana and Better Stack connect the same way. See every connector.

The next refund rings your phone.

Create an App Store connector and paste its URL into App Store Connect. Apple's next notification lands on your phone.