Mismatch between App Store Server API `expiresDate` (July 23) and iOS UI “Expires on” date (July 22) for 1-month subscription

Hi everyone,
I’m seeing a consistent one-day discrepancy between the expiresDate returned by the App Store Server API and the “Expires on” date shown in the iOS Settings / App Store subscription list. I’d like to confirm whether this behavior is expected or if I’m misunderstanding the way Apple rounds dates.

Reproduction steps

StepActionResult
1Purchase a 1-month auto-renewable subscription on 23 June 2025 14:00 JST (UTC+9)Transaction succeeds
2Immediately fetch the transaction with GET /inApps/v1/subscriptions/{transactionId}Response contains "expiresDate": "2025-07-23T05:00:00Z" (= 23 July 2025 14:00 JST)
3On the same device open Settings › Apple ID › Subscriptions (or App Store › Account › Subscriptions)UI shows Expires on: 22 July 2025

The same happens for every monthly renewal and on multiple devices. Region is Japan, device time zone Asia/Tokyo.

What I understand so far (and my hypothesis)

  • Apple’s docs say a monthly subscription renews “on the same calendar date” of the next month, so renewal in this example is 23 July.
  • If the renewal is scheduled for 23 July at 14:00 JST, the subscription is fully usable until the end of 22 July in calendar terms, because the new billing period starts the moment the 23rd begins in Apple’s canonical time zone.
  • Therefore, it might be intentional for the UI to display 22 July—i.e., “you can keep using it through the 22nd; on the 23rd it renews.”

This hypothesis makes sense internally, yet it still looks confusing to end users who read “Expires on 22 July” and assume access ends at 00:00 on the 22nd, a whole day earlier than in reality.

Questions

Is showing the day before the renewal date the official/expected behavior? If so, could Apple clarify that the “Expires on” label represents the last full calendar day rather than the exact expiry timestamp? Which value should we surface in-app when telling users “Your subscription is valid until …”?

  • The server’s expiresDate (precise to the second, converted to user time zone), or
  • A UI-style date that’s one day earlier, matching Settings / App Store?
  • Does Apple have a public document describing this rounding/visual convention?
  • Have other developers encountered user confusion about the apparent 1-day “shortening” and, if so, how did you word your in-app messaging?

Any insight from Apple engineers or fellow developers would be greatly appreciated.

Thank you!

Mismatch between App Store Server API `expiresDate` (July 23) and iOS UI “Expires on” date (July 22) for 1-month subscription
 
 
Q