Logged-in VIP offer
Customer tag is "VIP" and Cart subtotal at least $75 → Free shipping
Your code sends no customer ID. A logged-in VIP gets the free-shipping facts; a guest or untagged customer does not.
Tab Promo's Storefront promotion API is called from your theme's browser JavaScript through your store's Shopify App Proxy, so there is no API key, no secret in theme code and no server or middleware for you to host. Shopify signs every proxied request, Tab Promo rejects any request without a valid signature, and it works out the shop and the logged-in customer itself. The browser only receives display facts, which can include the campaign title and checkout label the merchant already shows at checkout; the price is decided by Shopify checkout.
See it work

theme/assets/promo.js
const facts = await promo.resolve({
surface: 'cart',
})
// no API key, no token, no serverThrough your store’s domain
POST solene.com/apps/tab-promo/promos
solene.myshopify.comadded by Shopify7310added by Shopify1790851200added by Shopify3f9a…c41eadded by Shopify200 · signature verified
progress $28.00 to 10% off
Shop and customer come from Shopify, not from your code.
Response
Your theme posts the cart to a path on your own domain. Shopify forwards it through the App Proxy and appends the shop, the logged-in customer and a signature. Your code never holds a key.
// Your theme (browser)
POST /apps/tab-promo/promos
{
"v": 1,
"context": { "surface": "cart" },
"cart": { "currency": "USD", "total_price": 7200, "item_count": 2, "items": [ ... ] }
}
// Shopify App Proxy appends, then forwards
?shop=solene.myshopify.com&logged_in_customer_id=7310×tamp=...&signature=...
// Tab Promo verifies the signature and answers
{ "v": 1, "promos": [ { "primitive": "progress", "current": 7200, "target": 10000, ...,
"display": { "message": "10% off orders over $100" } } ] } Examples
Customer tag is "VIP" and Cart subtotal at least $75 → Free shipping
Your code sends no customer ID. A logged-in VIP gets the free-shipping facts; a guest or untagged customer does not.
A script calls Tab Promo's server directly instead of going through the store's /apps/ path
It has no Shopify signature, so it is refused with 401 invalid_signature and gets no promotion data.
Browser code marks a $40 scarf as a free gift without the cart qualifying
Shopify checkout re-checks eligibility, variant and quantity, finds the claim invalid, and the scarf stays $40.
init({ proxyBase: "https://example.com/api" })
The SDK refuses to start with invalid_proxy_base. Only a relative /apps/... path on your own store domain is accepted.
Setup
Good to know
Plan: Pro — $99/month. Compare plans
FAQ
No. Shopify's App Proxy signs every request made through your store's /apps/ path, and that signature is what Tab Promo checks. Nothing secret lives in theme code, and there is no backend for you to run.
Yes. Install the SDK in your theme build and create a client with your relative App Proxy path. The SDK handles the request format, cart data and timeouts.
Shopify adds the logged-in customer to the signed proxy request. Tab Promo reads tags, order count and spend on its side, so your theme never sends customer data.
There is nothing secret to expose. The API only describes offers, and any campaign text it returns is the published wording checkout already shows shoppers, never internal notes or unpublished edits. Unsigned requests are refused, and every discount is calculated inside Shopify checkout, which re-checks the cart.
No. Requests must arrive through Shopify's App Proxy on the Online Store domain, and the SDK only accepts a relative /apps/... path.
More with Tab Promo