lukas_b is very likely right, and you can confirm it instead of guessing. The Expo push API answers with a ticket right away, and a ticket saying ok only means Expo accepted the message. Whether Apple accepted it is in the receipt, which you fetch a few minutes later with the ticket id:
const receipts = await expo.getPushNotificationReceiptsAsync([ticketId]);
// { status: 'error', details: { error: 'InvalidCredentials' } }InvalidCredentials means no or a wrong APNs key. Fix it with eas credentials → iOS → Push Notifications, then send again. No new build needed for the key itself.
If receipts come back ok and the phone still shows nothing, check that the app actually asked for permission on iOS. Android 12 and older grant notifications without asking; iOS never does.
InvalidCredentials. So it's the APNs key. Didn't know about receipts at all, setting up the key tonight. ben_mobile