Hi all — I’m trying to understand how phone-number validation works in the Admin GraphQL draftOrderCreate mutation.
Context
We programmatically create draft orders as part of a fulfillment-related flow.
The draft order is created from an existing Shopify order. We copy the original order’s shipping address into draftOrderCreate.shippingAddress, including:
- countryCode: JP
- provinceCode
- zip
- city
- address1
- phone
Error
For one specific Japanese mobile number, draftOrderCreate returns:
{
“userErrors”: [
{
“field”: null,
“message”: “Phone number in shipping address is invalid”
}
]
}
The phone number is in Japanese local mobile format:
text 090xxxxxxxx
It has 11 digits, no hyphens, and no +81 country prefix.
Why this is confusing
This does not appear to be a general formatting issue.
- The same store successfully creates draft orders with other Japanese mobile numbers in the same local format.
- The issue seems isolated to one specific number.
- countryCode: JP is included.
- The number is valid according to common phone-number validation libraries such as libphonenumber.
- The original Shopify order went through Checkout successfully with this exact phone number.
- On another test/development store, draftOrderCreate with the same local-format number succeeds.
So the issue appears to be specific to one Japanese mobile number in one store context, while the same number is accepted by Checkout and by another store.
Questions
- What validation does draftOrderCreate apply to shippingAddress.phone?
- Is the validation based on libphonenumber, or does it check anything beyond format?
- Are there any store-level settings that can affect phone validation for draft orders?
- Why might a phone number accepted by Checkout later be rejected by Admin GraphQL draftOrderCreate?
- Is Japanese local format supported when countryCode: JP is provided, or should we always normalize to E.164 format before calling draftOrderCreate?
Environment
- Admin API version: 2025-07
- Mutation: draftOrderCreate
- Country code: JP
Any insight into the validation logic or possible differences between Checkout and Admin GraphQL validation would be greatly appreciated. Thank you!