migration

Learn about the MIGRATION App Store Server Notification V2. Fired when you migrate a subscription to the Advanced Commerce API.

App Store Server Notifications V2Advanced Commerce
migration

The MIGRATION notification fires when you migrate a subscription to the Advanced Commerce API. Apple's changelog sometimes calls this MIGRATE; the notification type value is MIGRATION.


When does it fire?


This notification triggers after you call the Migrate Subscription to Advanced Commerce API endpoint for a subscriber. It does not fire for apps that are not using Advanced Commerce.


Payload highlights


The signed transaction and renewal info identify the migrated subscription, including the product ID and auto-renew status after the move.


How Yeethook helps


Migrations are one-way operational events. Yeethook delivers them as formatted Slack or Discord messages so you can confirm each subscriber landed in Advanced Commerce without decoding the JWS yourself.


Common use cases


  • Track subscribers migrated to Advanced Commerce
  • Confirm a migration job is progressing
  • Investigate a subscriber whose catalog did not change as expected

Example payload

The decoded body confirming one subscription moved onto Advanced Commerce, sent with no subtype. The transaction retains its existing expiresDate, so the migration is visible in the notification type rather than in any field value.

{
  "notificationType": "MIGRATION",
  "notificationUUID": "5d0e83a1-c264-4f97-b108-3a7e56c2019f",
  "version": "2.0",
  "signedDate": 1791013283000,
  "data": {
    "appAppleId": 1234567890,
    "bundleId": "com.example.app",
    "bundleVersion": "142",
    "environment": "Production",
    "signedTransactionInfo": "eyJhbGciOiJFUzI1NiIsIng1YyI6...",
    "signedRenewalInfo": "eyJhbGciOiJFUzI1NiIsIng1YyI6...",
    "status": 1
  }
}

What it looks like in Slack

Info

Subscription migrated to Advanced Commerce

Product
com.example.app.pro.monthly
Transaction
2000000798765432
Expires
2026-11-12T09:34:13.000Z
Auto-renew
On
Subscription status
Active
Environment
Production

Questions about migration

Does migrating interrupt the subscriber's access?

No. The subscription keeps its expiresDate and its autoRenewStatus, so status stays 1 and the customer notices nothing. The next billing period still arrives as an ordinary DID_RENEW.

How do I confirm which subscriber migrated?

Match originalTransactionId from the decoded transaction against your own records, since the payload has no customer identifier. Running a migration job across many subscribers means one of these notifications per subscription, not one per job.

Do Advanced Commerce subscriptions still send the standard lifecycle events?

Yes. DID_RENEW, DID_FAIL_TO_RENEW, EXPIRED and the refund types all continue to arrive as before. MIGRATION, METADATA_UPDATE and PRICE_CHANGE are additions for server-managed catalogues, not replacements for the existing stream.

Get this event in Slack or Discord

Connect Yeethook to receive migration notifications in your team's Slack or Discord channels.

Get Started Free