Apple sends webhooks from two completely separate systems. Most teams don't even realize there are two. Yeethook handles both: App Store Connect operational events and App Store Server Notifications V2.
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.
Alternative distribution events. Three events cover EU alternative-marketplace packages: a new package version, package availability, and territory availability.
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:
SUBSCRIBEDfires when someone subscribes for the first time or re-subscribes after expiration. Revenue just went up.DID_RENEWmeans a billing period renewed successfully. Recurring revenue confirmed.DID_CHANGE_RENEWAL_STATUSis 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_PREFmeans someone upgraded or downgraded their plan.DID_FAIL_TO_RENEWmeans the payment method failed. The subscriber might not even know.GRACE_PERIOD_EXPIREDmeans the billing grace period ended without successful payment.EXPIREDmeans 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.
Purchases and consent. ONE_TIME_CHARGE covers consumables, non-consumables, and non-renewing subscriptions. RESCIND_CONSENT fires when a parent or guardian withdraws consent for a child's use of your app, after which Apple stops the app launching for that child.
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. RENEWAL_EXTENSION reports the result of a batch extension. EXTERNAL_PURCHASE_TOKEN covers alternative payments in the EU. And TEST lets you verify your endpoint is working.
Advanced Commerce events. METADATA_UPDATE, MIGRATION, and PRICE_CHANGE fire only for apps that use Apple's Advanced Commerce API. They are available in Yeethook but not selected by default.
Two categories, one Slack integration
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.
