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.