We run a public Shopify app that uses the Storefront API to read product, collection, and variant metafield data.
For each merchant store, our app creates a Storefront API token using storefrontAccessTokenCreate. Because Storefront API tokens are public by design, this token is exposed on the storefront and used by our frontend script.
Our script only performs read operations. It does not create carts, modify checkouts, or place orders.
The only unauthenticated Storefront API scopes requested by our app are:
-
unauthenticated_read_content -
unauthenticated_read_product_listings
We do not request unauthenticated_write_checkouts.
However, some merchants have reported orders that they do not recognize. When we inspect these orders, we see that:
-
The Sales Channel is shown as our app.
-
The order’s
sourceNameis our app ID. -
The checkout went through the merchant’s real payment gateway.
-
The payment authorization later expired.
-
The client IP address changes between orders.
Our current assumption is that a bot may be:
-
Extracting the public Storefront API token from the storefront.
-
Using that token to create a cart or start a checkout through Shopify’s Storefront API.
-
Completing the checkout through the merchant’s actual checkout/payment flow.
Because the Storefront API token belongs to our app, Shopify appears to attribute the resulting order to our app’s sales channel, even though our application never created the cart, checkout, or order itself.
We have also been able to reproduce similar behavior on our development store, as shown in the attached image.
We would like to understand:
-
Is this expected behavior for public Storefront API access tokens?
-
How can a cart or checkout be created using this token if our app does not have
unauthenticated_write_checkouts? -
Does this behavior have any impact or risk for the merchant’s store, such as payments, order data, analytics, or fraud metrics?
-
Does it have any impact or risk for our app, especially regarding sales-channel attribution, Shopify App Store review, or potential policy violations?
-
Is there a recommended way to prevent third parties from using our Storefront API token in this way while still allowing our storefront script to perform public read queries?
