Webhook Events

Juice Machine supports two types of Apple webhooks. Both are accepted on the same per-app webhook URL — the format of each incoming webhook is detected automatically.

Two Webhook Systems

App Store Connect Webhooks: Build uploads, app review status, TestFlight events. Configure at Users and Access → Integrations → Webhooks.

App Store Server Notifications: Subscription lifecycle, in-app purchases, refunds. Configure per-app at App Information → App Store Server Notifications.

App Store Connect Events

Events from App Store Connect webhooks (build/review/TestFlight):

App Review Events

Event Type Description
appStoreVersionStateCreated A new app version was created
appStoreVersionStateUpdated App version state changed (submitted, approved, rejected, released)

Build Events

Event Type Description
buildUploadStateCreated A new build upload started
buildUploadStateUpdated Build upload processing state changed
buildStateCreated A new build was uploaded
buildStateUpdated Build processing state changed
buildBetaStateCreated Build submitted for TestFlight
buildBetaStateUpdated TestFlight build state changed

TestFlight Events

Event Type Description
betaFeedbackCreated Beta tester submitted feedback or screenshot

Other Events

Event Type Description
webhookPingCreated Test ping from App Store Connect
assetPackVersionStateCreated On-demand resource asset pack created
assetPackVersionStateUpdated Asset pack state changed

App Store Server Notification Events

Events from App Store Server Notifications V2 (subscriptions/IAP). Many of these carry a subtype (e.g. SUBSCRIBED:INITIAL_BUY vs SUBSCRIBED:RESUBSCRIBE), which Juice Machine preserves and uses for titles, filtering, and severity. Apple retries undelivered notifications; Juice Machine deduplicates retries by Apple's notificationUUID so you never receive the same event twice.

Subscription Lifecycle

Event Type Description
SUBSCRIBED New subscription or resubscription
DID_RENEW Subscription successfully renewed
DID_CHANGE_RENEWAL_STATUS Auto-renewal enabled or disabled
DID_CHANGE_RENEWAL_PREF User changed subscription plan
DID_FAIL_TO_RENEW Renewal failed (billing issue)
EXPIRED Subscription expired
GRACE_PERIOD_EXPIRED Billing grace period ended

Offers & Promotions

Event Type Description
OFFER_REDEEMED Promotional or offer code redeemed
PRICE_INCREASE Price increase notification sent

Refunds & Revocations

Event Type Description
REFUND Refund was issued
REFUND_DECLINED Refund request was declined
REFUND_REVERSED Refund was reversed
REVOKE Access revoked (family sharing removed)
CONSUMPTION_REQUEST Apple requesting consumption info for refund

Other

Event Type Description
ONE_TIME_CHARGE One-time in-app purchase (consumable, non-consumable, or non-renewing)
TEST Test notification from Apple
RENEWAL_EXTENDED Subscription period extended
EXTERNAL_PURCHASE_TOKEN External purchase token event

Linking events back to your users (appAccountToken)

Apple's App Store Server Notifications carry an appAccountToken field on the transaction whenever your app set one at purchase time via StoreKit. It's a UUID identifying the user in your system — opaque to Apple, meaningful to you. Juice Machine extracts it during enrichment and exposes it in two places: directly in notifications (gated by the Include appAccountToken in notifications opt-in on the app), and as the key it uses to look up customer fields via your user lookup URL. The second option is usually what you want — it surfaces the customer's name and plan rather than just their UUID.

Filtering Events

In the Events dashboard, you can filter by:

  • Event type: Show only specific event types
  • Delivery status: Filter by pending, delivered, or failed
  • Date range: View events within a specific time period
  • Search: Search within event payloads

Event Retention

Events and their delivery records are retained indefinitely on every plan, so you can audit history at any time. Contact us if you'd like events older than a given date purged.