Documentation Index
Fetch the complete documentation index at: https://docs.launchmystore.io/llms.txt
Use this file to discover all available pages before exploring further.
App Manifest
Every LaunchMyStore app ships a singleapp.json file at the root of the
app package. The manifest declares the app’s identity (handle, name,
version) and every extension surface and function the app contributes.
At install time the platform writes the manifest into
public/extensions/{domainSlug}/{appHandle}/app.json per merchant.
At render time the storefront, checkout, admin, and customer-account
hosts read this file (through the local-manifest cache, 60s TTL) to
discover which extensions and functions to load. If app.json is
missing or unparseable, the app is silently skipped.
All keys under
extensions are camelCase. Fields prefixed with
_ (underscore) at any depth are reserved for tooling and ignored at
install time.Top-level fields
Lowercase machine name for the app, e.g.
product-reviews-pro. Must
match the directory name under public/extensions/{domainSlug}/.
Uniqueness is enforced per merchant.Human-readable name shown in the merchant admin and the marketplace
listing.
Semver version string (e.g.
1.4.2). Used by the versioning system to
reconcile installed vs. published builds.Short marketing copy displayed on the marketplace card and admin
detail page.
Absolute URL to a square icon (PNG/SVG, recommended 256×256). Used by
the customizer block picker and admin sidebar.
Publisher name displayed on the marketplace listing.
Public website URL for the publisher.
Base URL the merchant is redirected to after install completes (the
app’s embedded admin entry point).
OAuth scopes the app requires (e.g.
read_products, write_orders).
See OAuth scopes.Container for every extension/function the app contributes. See the
per-key tables below.
Minimal example
Extensions
Theextensions object groups every extensible surface the app
contributes. Every key is optional; an app can use as few or as many as
it needs.
| Key | Type | Purpose | Page |
|---|---|---|---|
storefrontBlocks | array | Liquid blocks merchants drop into theme sections | Theme Blocks |
storefrontSnippets | array | Reusable Liquid includes ({% render 'foo' %}) | Storefront Snippets |
storefrontEmbeds | array | Overlay/floating scripts injected at <head> or before </body> | Storefront Embeds |
appScripts | array | JS files auto-injected on every storefront page | App Scripts |
checkoutExtensions | array | Sandboxed iframe at a named slot inside the React checkout | Checkout UI |
postPurchaseExtensions | array | Iframe rendered on the order-success page | Post-Purchase |
adminExtensions | array | Iframe embedded on admin resource detail pages | Admin Blocks |
adminActions | array | Button on an admin resource page that opens a modal iframe (install-only — persisted as per-handle schema files) | Admin Actions |
printActions | array | Button that opens a printable view (install-only — persisted as per-handle schema files) | Admin Print Actions |
customerAccountExtensions | array | Iframe blocks on the new customer-account pages | Customer Account |
webPixels | array | Sandboxed customer-event listener scripts | Web Pixels |
posExtensions | array | Iframe extensions for the Point-of-Sale app | POS Extensions |
functions | array | Declarative WASM functions (cart transform, discount, shipping, etc.) | Functions Overview |
orderRoutingRules | array | JSON matchers that pick a fulfillment location at order placement | Order Routing |
emailTemplates | array | Override transactional emails for named events (install-only) | Email Templates |
adminActions, printActions, and emailTemplates are accepted by
the install endpoint but are not stored inline in app.json
after install — they are persisted as per-handle schema files under
admin-actions/, print-actions/, and email-templates/
respectively, and surfaced through the admin-extensions API.storefrontBlocks
Liquid blocks merchants insert into theme sections via the customizer. Each entry produces ablocks/{handle}.aqua template and a
blocks/{handle}.schema.json block schema.
| Field | Type | Purpose |
|---|---|---|
handle | string | Required. Block machine name. Becomes the filename (blocks/{handle}.aqua). |
title | string | Display label in the customizer block picker. |
target | string | Template the block can be inserted into (product, index, collection, …). |
schema | object | Standard Shopify block schema (name, settings[], presets[]). |
storefrontSnippets
Reusable Liquid partials any theme block or section can{% render %}.
Snippet handles share a single global namespace across all installed
apps — the install endpoint logs a warning when two apps register the
same handle and the filesystem-order winner is unpredictable. Prefix
your handles with the app handle to be safe.
| Field | Type | Purpose |
|---|---|---|
handle | string | Required. {% render 'my-app-stars' %} invokes it. |
description | string | Optional documentation displayed in the admin. |
storefrontEmbeds
Overlay/floating scripts (chat widgets, cookie banners, A/B tools) injected at<head>, body, or compliance_head based on the
target field. Merchants toggle each embed on/off in the customizer
“App embeds” tray.
| Field | Type | Purpose |
|---|---|---|
handle | string | Required. Unique per app. |
target | string | head | body | compliance_head. Default body. |
scriptSrc | string | Absolute URL to a JS file (loaded with <script defer>). |
inlineHtml | string | Alternative to scriptSrc — raw HTML/CSS injected directly. |
enabled_on | object | Restrict to specific templates/section groups: { templates: [], groups: [] }. |
disabled_on | object | Same shape as enabled_on; exclusions win on conflict. |
schema | object | Settings schema for the customizer’s “App embeds” panel. |
appScripts
JavaScript files that the platform auto-injects on every storefront page render. Useful for installing pixels and chat widgets without editing the theme. TheloadStrategy controls how the <script> tag
is emitted: async (independent), defer (preserves order, runs after
DOM), or idle (lowest priority via requestIdleCallback).
| Field | Type | Purpose |
|---|---|---|
src | string | Required. Absolute URL to the script. |
loadStrategy | string | async | defer | idle. Default defer. |
position | string | head | body. Default body. |
config | object | Free-form config passed via data-config attribute. |
checkoutExtensions
Sandboxed iframes injected at named slots inside the React checkout. The host communicates with the iframe through App Bridge overpostMessage.
| Field | Type | Purpose |
|---|---|---|
handle | string | Required. Unique per app. |
target | string | Required. Named slot — see Checkout UI targets. |
iframeUrl | string | URL loaded into the sandboxed iframe. |
settings | object | Forwarded to the iframe via query string + App Bridge. |
postPurchaseExtensions
Iframe rendered on the order-success page (e.g. one-click upsells). Smaller wired-action set than checkout — focused on order summary + upsell purchase.| Field | Type | Purpose |
|---|---|---|
handle | string | Required. |
target | string | Default post-purchase. |
iframeUrl | string | Required. Iframe entry URL. |
timeout | number | Maximum render time in ms before the iframe is replaced with a skip. Default 60000. |
adminExtensions
Iframes embedded inline on admin resource detail pages — product, order, customer, collection, discount, etc. The host (<AdminExtensionSlot target="…" />) fetches all extensions for a
target and renders each in a sandboxed iframe.
| Field | Type | Purpose |
|---|---|---|
handle | string | Required. |
target | string | Required. See Admin Block targets. |
title | string | Displayed in the admin panel header. |
url | string | Iframe URL (relative URLs are absolutized to the CustomerLMS origin). |
iconUrl | string | Optional icon for the panel header. |
navigationLabel | string | Sidebar/tab label override. |
permissions | object | Per-target permission flags consumed by the host. |
adminActions
Buttons on admin pages that open a modal iframe on click. Declared in the manifest but persisted to disk asadmin-actions/{handle}.schema.json
during install — the admin-extensions API merges them with
adminExtensions and tags them with type: 'admin_action'.
printActions
Buttons that open a printable view in a new window. Manifest carries either a Liquidtemplate (rendered server-side) or an appUrl
(iframe).
customerAccountExtensions
Iframe blocks rendered on the new customer-account pages (order status, dashboard, profile, order list). Same iframe contract as checkout extensions — bearer-token gated.webPixels
Sandboxed customer-event listener scripts loaded into an isolated iframe. Subscribe to events likepage_viewed, cart_updated,
checkout_completed. The manifest accepts either a remote scriptSrc
URL or an inlineScript string which the installer writes to
web-pixels/{handle}.js.
posExtensions
Iframe extensions for the Point-of-Sale app. Same shape asadminExtensions; targets start with pos.. The admin-extensions API
tags these with type: 'pos_extension' so the POS host can fork
rendering from regular admin blocks.
functions
Declarative WASM functions that fire in the cart → checkout → order-placement pipeline. Each entry maps to one of the nine supported function types. The install endpoint validatestype, handle, inputFields, and
network_access / allowed_hosts and rejects the install on any
violation.
| Field | Type | Purpose |
|---|---|---|
type | string | Required. One of the 9 function types. |
handle | string | Required. Unique per app. |
title | string | Display name shown to the merchant. |
entrypoint | string | Relative path to the compiled WASM module (uploaded separately). |
inputFields | object | Subtree projection of the REST input — see Input fields. |
network_access | boolean | Opt in to outbound fetch_url. Requires allowed_hosts. |
allowed_hosts | string[] | Non-empty list of hostnames the function may call. Validated at install. |
orderRoutingRules
Declarative matchers that select a fulfillment location at order placement. Internally flattened into thefunctions dispatch list as
type fulfillment_location_rule.
emailTemplates
Per-event transactional email overrides. Each entry replaces the default template for one event (order_confirmation,
shipping_confirmation, etc.).
The authoritative copy of the email template is stored in the backend
EmailTemplate table — the install endpoint also writes a debug
preview to email-templates/{event}.json on disk.Validation rules
The install endpoint (POST /api/apps/install-extensions) enforces
the following at install time. Failures return HTTP 400.
Handle uniqueness
Handle uniqueness
Within a single
app.json, every handle inside one extension
array must be unique. Across apps, snippet handles (storefrontSnippets)
share a global namespace per merchant — collisions are logged but
do not fail the install.Function manifest validation
Function manifest validation
Every entry under
functions must have:type∈cart_transform,discount,shipping_rate,payment_customization,delivery_customization,order_validation,fulfillment_constraints,local_pickup_options,pickup_point_options- A non-empty
handlestring - Valid
inputFields(every leaf istrue/false, internal nodes are plain objects) if present - When
network_access: true, a non-emptyallowed_hostsarray of valid hostnames (no scheme, no path)
Function active limits
Function active limits
The backend
installApp() checks the merchant’s currently active
apps for each function type. If installing this app would push the
count over the per-type cap, install fails with HTTP 409. See
Function active limits for the per-type
caps.Target validation
Target validation
target strings on checkoutExtensions, adminExtensions,
posExtensions, customerAccountExtensions, and
adminActions/printActions are not validated against a closed
enum — but unknown targets simply won’t be picked up by any host.
Refer to the target lists on the relevant extension pages.Snippet handle conflicts
Snippet handle conflicts
Snippet handles share one Liquid resolver namespace across all apps
on a merchant. Installation continues on conflict but logs a
warning and render order is filesystem-dependent. Prefix snippet
handles with the app handle to avoid clashes.
Reserved directory names
Reserved directory names
Directories under
public/extensions/{domainSlug}/ whose name
starts with _ (underscore) are ignored at manifest read time and
can be used for scratch / debug data.Full example
See also
Extensions Overview
Every extension surface in one place.
Functions Overview
Declarative WASM functions for cart, shipping, discounts, validation.
App Types & Tiers
Public / private / first-party and the four pricing tiers.
App Lifecycle
Install, update, uninstall, and the version reconciliation pipeline.