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.
POS Extensions
POS extensions let your app inject UI into the LaunchMyStore Point-of-Sale (POS) app — the in-person sales surface staff use at a counter. Like admin blocks, POS extensions render as sandboxed iframes at named slots inside the POS UI.POS extensions share the manifest shape and install pipeline with
admin blocks. The only difference is the target prefix
(
pos.<surface>.<placement>.render) and a flag the host uses to
branch rendering between admin and POS surfaces.When to use POS extensions
Use a POS extension when staff at the register need information or actions that aren’t part of the default POS flow:- Look up a loyalty member by phone and apply their tier discount
- Check warehouse stock from a partner system before promising backorder
- Print a custom gift receipt with a per-item warranty card
- Show recent purchases for the current customer
Manifest
POS extensions live underextensions.posExtensions in your app.json.
The install endpoint also accepts entries in this array; the local
manifest helper merges them with adminExtensions and tags POS entries
with type: 'pos_extension'.
Manifest fields
Unique extension handle within this app. Used as the iframe id.
POS injection point — must start with
pos.. The host uses the
pos. prefix to distinguish POS extensions from admin blocks (every
entry whose target starts with pos. is tagged type: 'pos_extension'
on the wire). See Targets below.Tab/panel label shown in the POS UI. Defaults to the extension
name
or app name when omitted.Absolute URL the iframe loads. Relative URLs (e.g.
/extensions/.../tool.html)
are absolutized against the CustomerLMS origin before the response is
sent — POS clients running on a different host resolve them
correctly.Small icon (SVG/PNG) shown next to the title in the POS tab strip.
Override for the tab label when it appears in a list/nav strip. Falls
back to
title when omitted.Free-form permission flags forwarded to the host. Consumers (POS app)
decide which gates to enforce.
Targets
The full target catalog is being finalized as the POS app rolls out.
Targets are validated as “starts with
pos.” at the API layer — any
target your host knows about will work, but unrecognized targets
simply don’t surface. Treat the list below as authoritative for
shipping today; new placements will be added here as the POS app
ships them.| Target | Surface | When it renders |
|---|---|---|
pos.home.block.render | POS home screen | Loaded into a tile on the staff home screen. |
pos.checkout.block.render | Active sale screen | Sidebar block visible during the checkout flow. |
pos.customer.details.block.render | Customer detail card | Block on the in-POS customer view (during a sale). |
pos.product.details.block.render | Product quick view | Block on the product quick-view modal in POS. |
pos.cart.block.render | Cart drawer | Below the line items in the cart drawer. |
pos.order.action.render | Completed order | Action button on a finalized order receipt screen. |
pos. will be
returned by the admin-extensions API. The POS host is free to mount
unknown targets in a generic slot or ignore them.
Iframe contract
POS extensions follow the same iframe contract as Admin Blocks:Host fetches the extension list
The POS host calls
GET /api/apps/admin-extensions?target=pos.checkout.block.render&domainSlug=…
with a bearer token, receives the merged backend + local-manifest
list, and filters by type === 'pos_extension' if it wants to keep
POS UI separate.Host renders an iframe per extension
The host creates a sandboxed
<iframe> for each entry with
src = ext.url (absolutized against the CustomerLMS origin when
relative), extensionId = ext.id in the query string, and the
target-defined permission flags.Iframe initializes App Bridge
Inside the iframe, call
createApp({ apiKey, host }) from
@launchmystore/app-bridge to begin posting APP_BRIDGE_ACTION
messages to the host (dispatch, dispatchAndWait, subscribe,
getSessionToken). See App Bridge.Install pipeline
POS extensions install through the same endpoint as every other extension:- Persists the array into
app.jsonunderextensions.posExtensions. - Invalidates the local manifest cache so the next read picks up the new entries within the 60s TTL.
- Returns
installed.posExtensions = <count>in the response.
Discovery API
POS hosts call the same admin-extensions endpoint with apos. target:
&type=pos_extension.
Security
- All iframes load over HTTPS in production. The POS host disables
allow-same-originso iframes cannot read the host’s cookies. - App Bridge
postMessageis gated by the host’sallowedOriginslist — only registered app origins can dispatch actions. - Relative
urlvalues are absolutized againstPUBLIC_CUSTOMERLMS_ORIGIN(or the request host) before being returned — POS clients calling cross-origin still resolve the iframe correctly.
See also
Admin Blocks
Same iframe contract for merchant admin pages.
App Bridge
Iframe-to-host messaging SDK.
App Manifest
Every field in
app.json.Resource Picker
11 picker types including
customer and product.