App Proxy

How storefront widgets fetch campaigns, products, discounts, and other runtime data through Shopify's App Proxy, so they always reflect the current admin configuration.

Storefront widgets and the Llama Cart don't read your campaign, discount, or cart settings from data baked into the theme at build time. Instead, they fetch that data at runtime from the app's backend through Shopify's App Proxy — the mechanism Shopify uses to let a storefront call an app's server under your own store's domain, without exposing the app's real host. This page describes what a theme developer observes and can rely on from those calls; it's not a route-by-route API reference.

You'll see these requests in your browser's network tab under your theme's configured app proxy subpath (set on the app's App proxy configuration). The exact path differs per install — what matters here is what each call returns.

What the proxy serves

The proxy exposes several runtime data domains. Each is read by a specific part of the widgets or the Llama Cart, and every response reflects whatever is currently configured in the admin — there's no separate "publish" step.

  • Campaigns — the active campaign(s) for a given widget and funnel (pre-purchase, gift-with-purchase, post-purchase, auto-add, and so on), including their conditions and offers.
  • Products — product and collection lookups used to render recommendation widgets and offer details.
  • Discounts — the discount data tied to campaign offers, so a widget can show the discounted price before the shopper ever reaches checkout.
  • Cart settings — your Llama Cart and cart-page configuration, such as drawer behavior and upsell placement.
  • Promo codes — resolves and validates promo-code-triggered campaigns against the codes currently applied to the cart.
  • Customer — the signed-in shopper's tags, fetched live for campaigns and discounts gated by customer eligibility. The app doesn't keep its own copy of this data — see Webhooks for how the app handles customer data requests.
  • Subscriptions — your current plan and feature limits, used to decide what the widgets are allowed to show (for example, whether Checkout Upsells or additional active campaigns are available).

These endpoints are meant to be called by the app's own widgets and Llama Cart, not built against directly as a stable public API — field shapes can change between app versions. For supported integration points, use the global API and JavaScript events instead.

Why it's fetched at runtime

Because every widget reads through the proxy instead of from theme-baked data, a change you make in the admin — activating a campaign, editing a discount, updating cart settings — reaches the storefront without a theme deploy or a cache-busting reload of your Liquid templates. The trade-off is that the proxy sits in front of a cache for performance, so there can be a short delay between saving a change and seeing it live on the storefront.

Caching and timing

The proxy keeps an in-memory cache of campaign data to stay fast under load, and is rate-limited per shop to protect the backend from traffic spikes. Both can occasionally make the storefront look a beat behind the admin. The full breakdown of what causes a delay, how long it typically takes, and how to force an immediate refresh lives on Why changes take time to appear — read that page if you're chasing a "why isn't this updated yet" issue.

On this page