26 Events, Two Categories: Every Apple Event Covered

A tour of the 26 Apple events Yeethook supports, from build processing and TestFlight crashes to subscription renewals and refunds. Two webhook sources, one Slack integration.

Cover Image for 26 Events, Two Categories: Every Apple Event Covered

Apple sends webhooks from two completely separate systems. Most teams don't even realize there are two. Yeethook handles both, and together they cover 26 distinct event types.

Here's the full picture.

Source one: App Store Connect webhooks

These cover the development lifecycle. Builds, reviews, TestFlight, crashes. The stuff that happens between writing code and getting it into users' hands.

Apple introduced these webhooks at WWDC 2025. In Quick Start mode, Yeethook configures them automatically.

App version events. APP_STORE_VERSION_APP_VERSION_STATE_UPDATED fires when your app moves through the review pipeline. Submitted, in review, approved, rejected. Your team sees it in Slack the moment it happens. No more refreshing App Store Connect wondering if Apple got to it yet.

Build events. BUILD_UPLOAD_STATE_UPDATED tracks every build from upload through processing. Processing complete? Ready for TestFlight? Invalid? Failed? You'll know.

TestFlight events. BUILD_BETA_DETAIL_EXTERNAL_BUILD_STATE_UPDATED covers external build states: approved for testing, rejected, expired. And the two that matter most for quality: BETA_FEEDBACK_CRASH_SUBMISSION_CREATED and BETA_FEEDBACK_SCREENSHOT_SUBMISSION_CREATED. A tester hits a crash or takes a screenshot with feedback, and your team has it in Slack within seconds.

Background asset events. Four events covering background asset version states, release states, and beta releases. If you use Background Assets, you'll see every state change.

That's 9 event types from App Store Connect.

Source two: App Store Server Notifications V2

These cover the revenue lifecycle. Subscriptions, refunds, offers. The stuff that happens after your app is in users' hands and they're paying for it.

Subscription events. Seven events track the full subscription lifecycle:

  • SUBSCRIBED fires when someone subscribes for the first time or re-subscribes after expiration. Revenue just went up.
  • DID_RENEW means a billing period renewed successfully. Recurring revenue confirmed.
  • DID_CHANGE_RENEWAL_STATUS is the earliest churn signal you'll get. A subscriber just turned off auto-renew. The subscription is still active, but they're planning to leave. This is your window to act.
  • DID_CHANGE_RENEWAL_PREF means someone upgraded or downgraded their plan.
  • DID_FAIL_TO_RENEW means the payment method failed. The subscriber might not even know.
  • GRACE_PERIOD_EXPIRED means the billing grace period ended without successful payment.
  • EXPIRED means it's over. The subscription is no longer active.

Offer events. OFFER_REDEEMED tracks when someone uses an introductory, promotional, or win-back offer. PRICE_INCREASE fires when Apple needs customer consent for a price change.

Refund events. Three events: REFUND (refund granted), REFUND_DECLINED (refund denied), and REFUND_REVERSED (a previously granted refund was reversed, making the original transaction active again). Spot refund spikes after a release before they become a pattern.

Other events. REVOKE fires when a purchase is revoked (typically Family Sharing changes). CONSUMPTION_REQUEST means Apple is asking for usage data to process a refund. RENEWAL_EXTENDED means someone got extra time before their next billing date. EXTERNAL_PURCHASE_TOKEN covers alternative distribution in the EU. And TEST lets you verify your endpoint is working.

That's 17 event types from Server Notifications V2.

26 events, one Slack integration

9 + 17 = 26. The development lifecycle and the revenue lifecycle, both in one service.

Most tools pick a side. Crash monitoring tools don't track subscriptions. Subscription analytics don't surface TestFlight feedback. You end up stitching together three or four services and still have blind spots.

Yeethook covers both sides. One setup, one dashboard, one Slack integration. Your build got approved, your beta tester hit a crash, and a subscriber just churned? All three show up in the right Slack channels with full context.

That's the point. One service, both sides of the App Store.