I’m implementing Shopify’s Web Pixels Extension and tracking the checkout_contact_info_submitted event. However, the email and phone fields in the checkout object are always empty/undefined, even though users have just submitted this information on the checkout form.
Since the event is specifically checkout_contact_info_submitted, I expected the checkout object to contain the contact information (email, phone) that was just submitted.
Questions
Is this expected behavior from Shopify’s Web Pixels Extension API?
Are these fields supposed to be available at a different time or location in the checkout object?
Is there a different approach to capture customer email and phone during checkout?
Are there any plans to expose these fields in the checkout object for this event?
This is expected behavior following the Protected Customer Data policy enforcement that went into effect on December 10, 2025. That lines up with the timeline you mentioned — things were unredacted until around February, which is when you would have started seeing the impact.
Since that date, personally identifiable information (PII) in web pixel event payloads — including email, phone, first_name, and address fields — is filtered at runtime based on the app’s approved protected customer data scopes. If your app hasn’t been approved for the corresponding scope, those fields will be null.
The scopes relevant to your use case:
read_customer_email — required to receive email
read_customer_phone — required to receive phone
read_customer_personal_data — broader scope covering general PII
Hope you are having a wonderful day. Thanks for the update, this is really helpful context.
I have four quick questions for clarification:
To confirm, the request I need to submit is the Protected Customer Data access request, correct?
Will I still be able to access the customer ID even without Protected Customer Data scope approval?
Is there a way to access the customer ID before checkout (for example earlier in the customer journey)? I know this may be slightly separate from the current topic, but it would be very helpful for us.
If possible, could you share code snippets for getting the customer ID in both cases you mentioned (init.data.customer.id and checkout_completed event)?
Thanks again for the guidance.
Best,
Joseph
Thanks for the kind words! Happy to help clarify. Here are your answers:
1. Yes, the request you need to submit is the Protected Customer Data access request. You’ll select which specific scopes you need (e.g. read_customer_email, read_customer_phone, etc.) as part of that process.
2. Yes, customer ID is not gated behind Protected Customer Data scopes. It is not considered PII, so it will be available regardless of your app’s approval status.
3. You can access the customer ID earlier in the journey via the pixel’s init data — specifically init.data.customer.id. However, this is only populated for authenticated (logged-in) customers. For guest checkouts, the customer ID won’t be available until the checkout_completed event.
4. Here are code snippets for both approaches:
From init data (available at pixel initialization, authenticated customers only):
shopify.extend('WebPixel::Render', (api) => {
const customerId = api.init.data.customer?.id;
if (customerId) {
// Customer is logged in — use the ID
}
});
From the checkout_completed event (available for both authenticated and guest checkouts):
api.analytics.subscribe('checkout_completed', (event) => {
const customerId = event.data.checkout.order?.customer?.id;
if (customerId) {
// Use the customer ID
}
});