Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget
Installing the Lua app on a Shopify store creates an agent that searches the store’s products by text or SKU, shows product details and variant stock, builds a basket, and hands the end user a Shopify checkout link, on the storefront widget and every other channel. This is the catalog app; the Unified.to shopify integration type is a separate connection made with lua integrations connect (lua integrations info shopify lists OAuth and token), described under Raw API access.Verified against lua-cli 3.33.0.Before you begin
A Shopify store where you can install apps and edit the theme.
The grants the app requests: read and write products, read inventory, write checkouts, draft orders, and orders, read content, and read and write themes (the theme grants install the widget).
1
Shopify admin: install the app
Open Lua AI Shopping Assistant in the Shopify App Store, select Install, and accept the access request.
The access request lists the product, checkout, content, and theme grants.
Shopify then opens the admin dashboard inside Shopify admin; the agent, its organization, and the first catalog sync are created in this step, and a persona is drafted in the background.
The admin dashboard inside Shopify admin after installation.
2
Shopify admin: switch on the storefront widget
In Sales channels › Online Store › Themes, select Customize, open App embeds, switch LuaPop Chat on, set position, theme, button text, and colors, then select Save.
LuaPop Chat in the theme editor's app embeds.
The embed’s settings cover position, theme, button text, icon, and color, chat title, window size, link previews, and custom CSS for the button and header; the full option set is on Style the web widget.
3
Storefront: try it
Open the store, open the widget, and ask for a product, for example “Show me black pouches under $50”. The agent searches the synced catalog, sends product cards, and can add a variant to the basket and return a checkout link.
Search products by description (raising the result limit for products sold as many color variants), find products by SKU, get one product’s details, and send product cards.
Check whether a variant is in stock.
Add to, remove from, show, and clear the end user’s basket, and check out: the agent creates a Shopify draft order, returns its checkout URL for the end user, and records the order as pending.
The app doesn’t look up existing orders or shipments; add a tool for that (see Raw API access).
A full refresh runs every hour: products whose Shopify status is ACTIVE are searchable, others are marked inactive, and products no longer in Shopify are removed.
Product create, update, and delete webhooks, registered at install, refresh a single product immediately.
A store with no conversation for 30 days stops refreshing until the next message arrives; a newly installed store always gets its first sync.
A 401, 402, 403, or 404 from Shopify pauses the sync for 24 hours; three in a row stop it until support restores it.
Your own tools read the same catalog through Products, and the baskets and checkouts through Baskets and Orders. To add your own tools to this agent, run lua init --agent-id <id> in a new folder (find the ID with lua agents --json --ci), then follow Add a tool.
src/skills/tools/FindGiftTool.ts
import type { LuaTool } from 'lua-cli';import { Products } from 'lua-cli';import { z } from 'zod';export default class FindGiftTool implements LuaTool { name = 'find_gift'; description = 'Suggest products from the synced store catalog for a gift brief'; inputSchema = z.object({ brief: z.string().describe('Who the gift is for and the budget') }); async execute(input: z.infer<typeof this.inputSchema>) { const result = await Products.search(input.brief); return result.map((product) => product.data); }}
lua test runs the tool against the store’s synced catalog.
lua test skill --name find_gift --input '{"brief":"a coffee lover, under $40"}' --ci
lua integrations connect --integration shopify --auth-method token connects a store through Unified.to with an Admin API access token and the Store ID, independently of the app: it provisions Unified.to’s commerce tools, the events lua integrations info shopify lists (products, variants, inventory, collections, customers, orders, and invoices), and Integrations.passthrough('shopify', …) for any Admin API endpoint. It doesn’t sync the catalog, fill Products or Baskets, or install the widget.
Only products with status ACTIVE are searchable, and the first sync starts at install and takes a while for a large catalog. Check the product’s status in Shopify, then try an exact product name.
Products stopped updating
The store was idle for 30 days, or Shopify refused the sync (a 401, 402, 403, or 404 pauses it for 24 hours; three in a row stop it). A message to the agent re-arms an idle store; for a stopped sync, write to [email protected].
The widget doesn't show on the storefront
The embed is off, the theme wasn’t saved, or you’re viewing a preview. In the theme editor confirm LuaPop Chat is on, select Save, and open the published theme.
Position, colors, and text for the storefront widget.
Products reference
Search and read the synced catalog from your tools.
Channels
Sell on WhatsApp, Instagram, and Messenger with the same agent.
E-commerce example
A complete shopping agent built on the same APIs.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Lua CLI","colors":{"primary":"#ff173a","light":"#fe1052","dark":"#fe1052"},"logo":{"light":"https://mintcdn.com/luaglobal/UOJyCcnsFnLhTG7C/logo/light.png?fit=max\u0026auto=format\u0026n=UOJyCcnsFnLhTG7C\u0026q=85\u0026s=69c56f899e0ed6e1baf7e8af2844aeda","dark":"https://mintcdn.com/luaglobal/UOJyCcnsFnLhTG7C/logo/dark.png?fit=max\u0026auto=format\u0026n=UOJyCcnsFnLhTG7C\u0026q=85\u0026s=cd36baf234c6b37e1fe2a2018ba0a46c"},"favicon":"https://mintcdn.com/luaglobal/UOJyCcnsFnLhTG7C/favicon.png?fit=max\u0026auto=format\u0026n=UOJyCcnsFnLhTG7C\u0026q=85\u0026s=8e869fe65763f56356c86d09dcaaf9a6","navbar":{"links":[{"href":"mailto:[email protected]","label":"Support"}],"primary":{"type":"button","label":"Platform","href":"https://heylua.ai"}},"footer":{"socials":{"discord":"https://discord.gg/SRPEuwCzaD"}},"integrations":{"gtm":{"tagId":"GTM-P43XVQLH"}},"contextual":{"options":["copy","view","chatgpt","claude","cursor"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"luaglobal","hasAudioNarration":false,"actualSubdomain":"luaglobal","customDomains":["docs.heylua.ai"],"gitSource":{"type":"github","owner":"lua-ai-global","repo":"lua-dev-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae461b581cc57ac631e8572","collectionId":"299034ac-7832-4815-a6ba-2ec3899a53bc","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae461b581cc57ac631e8572"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6ae461b581cc57ac631e8572","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Docs","count":178},{"language":"default","tag":"Reference","count":105},{"language":"default","tag":"CLI","count":42},{"language":"default","tag":"SDK","count":39},{"language":"default","tag":"Channels","count":38},{"language":"default","tag":"Build","count":30},{"language":"default","tag":"Concepts","count":26},{"language":"default","tag":"Primitives","count":25},{"language":"default","tag":"Ship logs to your stack","count":24},{"language":"default","tag":"REST API","count":24}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"integrations/shopify","slug":"/integrations/shopify","pageMetadata":{"title":"Shopify","description":"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget","type":"how-to","href":"/integrations/shopify"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CodeBlock,Columns,Frame,Heading,OptimizedImage,Step,Steps}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Columns)_missingMdxReference(`Columns`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Installing the Lua app on a Shopify store creates an agent that searches the store’s products by text or SKU, shows product details and variant stock, builds a basket, and hands the end user a Shopify checkout link, on the storefront widget and every other `,_jsx(_components.a,{href:`/channels/overview`,children:`channel`}),`. This is the catalog app; the Unified.to `,_jsx(_components.code,{children:`shopify`}),` integration type is a separate connection made with `,_jsx(_components.code,{children:`lua integrations connect`}),` (`,_jsx(_components.code,{children:`lua integrations info shopify`}),` lists OAuth and token), described under `,_jsx(_components.a,{href:`#raw-api-access`,children:`Raw API access`}),`.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`Verified against lua-cli 3.33.0.`})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Before you begin`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A Shopify store where you can install apps and edit the theme.`}),`\n`,_jsx(_components.li,{children:`The grants the app requests: read and write products, read inventory, write checkouts, draft orders, and orders, read content, and read and write themes (the theme grants install the widget).`}),`\n`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Shopify admin: install the app`,children:[_jsxs(_components.p,{children:[`Open `,_jsx(_components.a,{href:`https://apps.shopify.com/lua-shopping-assistant`,children:`Lua AI Shopping Assistant`}),` in the Shopify App Store, select `,_jsx(_components.strong,{children:`Install`}),`, and accept the access request.`]}),_jsx(Frame,{caption:`The access request lists the product, checkout, content, and theme grants.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-accept-permissions.png?fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=a638e6e8c652d40dca044d591716aad2`,alt:`Shopify access request for the Lua app`,\"data-og-width\":`645`,width:`645`,\"data-og-height\":`451`,height:`451`,\"data-path\":`images/integrations/shopify-accept-permissions.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-accept-permissions.png?w=280\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=0e04378bb4d395ab920d1526c236f5ba 280w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-accept-permissions.png?w=560\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=0e142b50c3fea3f07955ab6e1c0a3bc8 560w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-accept-permissions.png?w=840\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=290220127188ec3c315f1a3fd6866be1 840w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-accept-permissions.png?w=1100\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=df1bcf5d4c0f392418efadacbfcc404d 1100w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-accept-permissions.png?w=1650\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=e9e20d3c7935d93e8d16a9a14fd5b9d1 1650w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-accept-permissions.png?w=2500\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=ce79e6b9a7594164a21eb25c685405b8 2500w`})}),_jsx(_components.p,{children:`Shopify then opens the admin dashboard inside Shopify admin; the agent, its organization, and the first catalog sync are created in this step, and a persona is drafted in the background.`}),_jsx(Frame,{caption:`The admin dashboard inside Shopify admin after installation.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-admin-loaded.png?fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=f6363d0c327e0ed76b604e441789502b`,alt:`Lua admin dashboard loaded within Shopify admin`,\"data-og-width\":`1856`,width:`1856`,\"data-og-height\":`705`,height:`705`,\"data-path\":`images/integrations/shopify-admin-loaded.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-admin-loaded.png?w=280\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=5bbd3059ffb95f4377d8a0a30ccdedf5 280w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-admin-loaded.png?w=560\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=f9f6ad735f45491c3afea5f25c05185c 560w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-admin-loaded.png?w=840\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=866d358a2dbfbf63ecc305e16825d541 840w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-admin-loaded.png?w=1100\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=02054ad4ae2ca6c503bd5783f15a1c98 1100w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-admin-loaded.png?w=1650\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=df24914d4b3a0e97d35ff7cf14516b54 1650w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-admin-loaded.png?w=2500\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=a8471220161913ce5ea29611026f357d 2500w`})})]}),_jsxs(Step,{title:`Shopify admin: switch on the storefront widget`,children:[_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Sales channels`}),` › `,_jsx(_components.strong,{children:`Online Store`}),` › `,_jsx(_components.strong,{children:`Themes`}),`, select `,_jsx(_components.strong,{children:`Customize`}),`, open `,_jsx(_components.strong,{children:`App embeds`}),`, switch `,_jsx(_components.strong,{children:`LuaPop Chat`}),` on, set position, theme, button text, and colors, then select `,_jsx(_components.strong,{children:`Save`}),`.`]}),_jsx(Frame,{caption:`LuaPop Chat in the theme editor's app embeds.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-luapop-app-embed.png?fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=d0c48ebe8cd18d6bab4069714e57d2f9`,alt:`LuaPop Chat in the app embeds list`,\"data-og-width\":`359`,width:`359`,\"data-og-height\":`271`,height:`271`,\"data-path\":`images/integrations/shopify-luapop-app-embed.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-luapop-app-embed.png?w=280\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=e946e1d9313005cc5030f812cd0afef3 280w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-luapop-app-embed.png?w=560\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=bf636075f182bad5e0e2f25bc446ae01 560w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-luapop-app-embed.png?w=840\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=ed51af1834b30e65ae9defb67269a81c 840w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-luapop-app-embed.png?w=1100\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=4f55a906b1587b8968f25f02ccb35fce 1100w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-luapop-app-embed.png?w=1650\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=142c6b0fc6b89e97cc8731bb28ff5b06 1650w, https://mintcdn.com/luaglobal/9voTmYGj2sNBYqpY/images/integrations/shopify-luapop-app-embed.png?w=2500\u0026fit=max\u0026auto=format\u0026n=9voTmYGj2sNBYqpY\u0026q=85\u0026s=bfbe1d8a9dabb80df21e958e3e8f8012 2500w`})}),_jsxs(_components.p,{children:[`The embed’s settings cover position, theme, button text, icon, and color, chat title, window size, link previews, and custom CSS for the button and header; the full option set is on `,_jsx(_components.a,{href:`/channels/web-widget/styling`,children:`Style the web widget`}),`.`]})]}),_jsx(Step,{title:`Storefront: try it`,children:_jsx(_components.p,{children:`Open the store, open the widget, and ask for a product, for example “Show me black pouches under $50”. The agent searches the synced catalog, sends product cards, and can add a variant to the basket and return a checkout link.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`what-the-agent-can-do`,children:`What the agent can do`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Search products by description (raising the result limit for products sold as many color variants), find products by SKU, get one product’s details, and send product cards.`}),`\n`,_jsx(_components.li,{children:`Check whether a variant is in stock.`}),`\n`,_jsx(_components.li,{children:`Add to, remove from, show, and clear the end user’s basket, and check out: the agent creates a Shopify draft order, returns its checkout URL for the end user, and records the order as pending.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The app doesn’t look up existing orders or shipments; add a tool for that (see `,_jsx(_components.a,{href:`#raw-api-access`,children:`Raw API access`}),`).`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-the-catalog-stays-in-sync`,children:`How the catalog stays in sync`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A full refresh runs every hour: products whose Shopify status is `,_jsx(_components.code,{children:`ACTIVE`}),` are searchable, others are marked inactive, and products no longer in Shopify are removed.`]}),`\n`,_jsx(_components.li,{children:`Product create, update, and delete webhooks, registered at install, refresh a single product immediately.`}),`\n`,_jsx(_components.li,{children:`A store with no conversation for 30 days stops refreshing until the next message arrives; a newly installed store always gets its first sync.`}),`\n`,_jsx(_components.li,{children:`A 401, 402, 403, or 404 from Shopify pauses the sync for 24 hours; three in a row stop it until support restores it.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Your own tools read the same catalog through `,_jsx(_components.a,{href:`/reference/sdk/products`,children:_jsx(_components.code,{children:`Products`})}),`, and the baskets and checkouts through `,_jsx(_components.a,{href:`/reference/sdk/baskets`,children:_jsx(_components.code,{children:`Baskets`})}),` and `,_jsx(_components.a,{href:`/reference/sdk/orders`,children:_jsx(_components.code,{children:`Orders`})}),`. To add your own tools to this agent, run `,_jsx(_components.code,{children:`lua init --agent-id \u003cid>`}),` in a new folder (find the ID with `,_jsx(_components.code,{children:`lua agents --json --ci`}),`), then follow `,_jsx(_components.a,{href:`/build/add-a-tool`,children:`Add a tool`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:`src/skills/tools/FindGiftTool.ts`,numberOfLines:`14`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`LuaTool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'lua-cli'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Products`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'lua-cli'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`z`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'zod'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` default`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` FindGiftTool`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` implements`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` LuaTool`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'find_gift'`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` description`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Suggest products from the synced store catalog for a gift brief'`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` inputSchema`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` z`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`object`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`brief:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` z`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`().`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`describe`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Who the gift is for and the budget'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`});`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` execute`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`input`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` z`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:`infer`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`typeof`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` this`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`inputSchema`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`>) `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` result`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Products`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`search`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`input`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`brief`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` result`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`map`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`product`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` product`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`lua test`}),` runs the tool against the store’s synced catalog.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`lua`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` test`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` skill`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` find_gift`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --input`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{\"brief\":\"a coffee lover, under $40\"}'`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --ci`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`raw-api-access`,children:`Raw API access`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`lua integrations connect --integration shopify --auth-method token`}),` connects a store through Unified.to with an Admin API access token and the Store ID, independently of the app: it provisions Unified.to’s commerce tools, the events `,_jsx(_components.code,{children:`lua integrations info shopify`}),` lists (products, variants, inventory, collections, customers, orders, and invoices), and `,_jsx(_components.a,{href:`/integrations/passthrough`,children:_jsx(_components.code,{children:`Integrations.passthrough('shopify', …)`})}),` for any Admin API endpoint. It doesn’t sync the catalog, fill `,_jsx(_components.code,{children:`Products`}),` or `,_jsx(_components.code,{children:`Baskets`}),`, or install the widget.`]}),`\n`,_jsx(Heading,{level:`2`,id:`limits`,children:`Limits`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`One store per agent; install the app on each store that needs an agent.`}),`\n`,_jsx(_components.li,{children:`No order lookup, and no inventory levels beyond the variant stock check.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`if-it-isn’t-working`,children:`If it isn’t working`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Products don't appear in chat`,id:`products-dont-appear-in-chat`,children:_jsxs(_components.p,{children:[`Only products with status `,_jsx(_components.code,{children:`ACTIVE`}),` are searchable, and the first sync starts at install and takes a while for a large catalog. Check the product’s status in Shopify, then try an exact product name.`]})}),_jsx(Accordion,{title:`Products stopped updating`,id:`products-stopped-updating`,children:_jsxs(_components.p,{children:[`The store was idle for 30 days, or Shopify refused the sync (a 401, 402, 403, or 404 pauses it for 24 hours; three in a row stop it). A message to the agent re-arms an idle store; for a stopped sync, write to `,_jsx(_components.a,{href:`mailto:[email protected]`,children:`[email protected]`}),`.`]})}),_jsx(Accordion,{title:`The widget doesn't show on the storefront`,id:`the-widget-doesnt-show-on-the-storefront`,children:_jsxs(_components.p,{children:[`The embed is off, the theme wasn’t saved, or you’re viewing a preview. In the theme editor confirm `,_jsx(_components.strong,{children:`LuaPop Chat`}),` is on, select `,_jsx(_components.strong,{children:`Save`}),`, and open the published theme.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(Columns,{cols:2,children:[_jsx(Card,{title:`Style the web widget`,href:`/channels/web-widget/styling`,children:`Position, colors, and text for the storefront widget.`}),_jsx(Card,{title:`Products reference`,href:`/reference/sdk/products`,children:`Search and read the synced catalog from your tools.`}),_jsx(Card,{title:`Channels`,href:`/channels/overview`,children:`Sell on WhatsApp, Instagram, and Messenger with the same agent.`}),_jsx(Card,{title:`E-commerce example`,href:`/examples/ecommerce-assistant`,children:`A complete shopping agent built on the same APIs.`})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Shopify","description":"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget","type":"how-to","href":"/integrations/shopify"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What the agent can do","slug":"what-the-agent-can-do","depth":2,"children":[]},{"title":"How the catalog stays in sync","slug":"how-the-catalog-stays-in-sync","depth":2,"children":[]},{"title":"Raw API access","slug":"raw-api-access","depth":2,"children":[]},{"title":"Limits","slug":"limits","depth":2,"children":[]},{"title":"If it isn’t working","slug":"if-it-isn’t-working","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"luaglobal","siteName":"Lua CLI","title":"Shopify - Lua CLI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-13T08:09:43.294Z","originalFileLocation":"integrations/shopify.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget\">\u003cmeta data-mint-head name=\"application-name\" content=\"Lua CLI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Shopify - Lua CLI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Lua CLI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.heylua.ai/integrations/shopify\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://luaglobal.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=Shopify\u0026amp;description=Install+the+Lua+app+from+the+Shopify+App+Store+to+give+your+agent+a+synced+catalog%2C+baskets%2C+checkout+links%2C+and+a+storefront+widget\u0026amp;theme=a3f5381ffcff7cb3f7370a15\u0026amp;signature=45c70252fb46f1c807671930b0036f4870a44b9ad074b1cefb64fba2bf7351be\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Shopify - Lua CLI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://luaglobal.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=Shopify\u0026amp;description=Install+the+Lua+app+from+the+Shopify+App+Store+to+give+your+agent+a+synced+catalog%2C+baskets%2C+checkout+links%2C+and+a+storefront+widget\u0026amp;theme=a3f5381ffcff7cb3f7370a15\u0026amp;signature=45c70252fb46f1c807671930b0036f4870a44b9ad074b1cefb64fba2bf7351be\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/luaglobal/J64lPDADMxYATwfp/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Lua CLI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#ff173a\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.heylua.ai/integrations/shopify\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/shopify.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.heylua.ai/#organization\",\"name\":\"Lua CLI\",\"url\":\"https://docs.heylua.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/luaglobal/UOJyCcnsFnLhTG7C/logo/light.png?fit=max\u0026auto=format\u0026n=UOJyCcnsFnLhTG7C\u0026q=85\u0026s=69c56f899e0ed6e1baf7e8af2844aeda\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.heylua.ai#website\",\"name\":\"Lua CLI\",\"url\":\"https://docs.heylua.ai\",\"publisher\":{\"@id\":\"https://docs.heylua.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.heylua.ai/integrations/shopify#webpage\",\"url\":\"https://docs.heylua.ai/integrations/shopify\",\"name\":\"Shopify\",\"description\":\"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget\",\"dateModified\":\"2026-09-13T08:09:43.294Z\",\"isPartOf\":{\"@id\":\"https://docs.heylua.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.heylua.ai/integrations/shopify#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.heylua.ai/integrations/shopify#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Integrations\",\"item\":\"https://docs.heylua.ai/integrations/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Shopify\",\"item\":\"https://docs.heylua.ai/integrations/shopify\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.heylua.ai/integrations/shopify#article\",\"headline\":\"Shopify\",\"name\":\"Shopify\",\"description\":\"Install the Lua app from the Shopify App Store to give your agent a synced catalog, baskets, checkout links, and a storefront widget\",\"url\":\"https://docs.heylua.ai/integrations/shopify\",\"mainEntityOfPage\":{\"@id\":\"https://docs.heylua.ai/integrations/shopify#webpage\"},\"dateModified\":\"2026-09-13T08:09:43.294Z\",\"publisher\":{\"@id\":\"https://docs.heylua.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.heylua.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Lua CLI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Lua CLI","nav":{"global":null,"tabs":[{"tab":"Docs","groups":[{"group":"Get started","pages":[{"title":"Lua documentation","href":""},{"title":"Install the CLI and sign in","href":"/get-started/install"},{"title":"Build and release your first agent","sidebarTitle":"Quickstart","href":"/get-started/quickstart"},{"title":"Build a support agent","href":"/get-started/build-an-agent"},{"title":"Project structure","href":"/get-started/project-structure"},{"title":"Choose a primitive","href":"/get-started/choose-a-primitive"},{"title":"For operators","href":"/get-started/for-operators"},{"title":"Glossary","href":"/get-started/glossary"}]},{"group":"Concepts","pages":[{"title":"Agents","href":"/concepts/agents"},{"title":"Skills and tools","href":"/concepts/skills-and-tools"},{"title":"Persona","href":"/concepts/persona"},{"title":"Models","href":"/concepts/models"},{"title":"Environments","href":"/concepts/environments"},{"title":"Releases and versions","href":"/concepts/releases-and-versions"},{"title":"Execution contexts","href":"/concepts/execution-contexts"},{"title":"Credentials","href":"/concepts/credentials"},{"title":"Organizations and roles","href":"/concepts/organizations-and-roles"},{"title":"Approvers and notifications for shared agents","href":"/concepts/shared-agent-approvers"},{"title":"Channels","href":"/concepts/channels"},{"title":"Webhooks","href":"/concepts/webhooks"},{"title":"Triggers","href":"/concepts/triggers"},{"title":"Jobs","href":"/concepts/jobs"},{"title":"Workflows","href":"/concepts/workflows"},{"title":"Web apps","href":"/concepts/apps"},{"title":"Processors","href":"/concepts/processors"},{"title":"MCP servers","href":"/concepts/mcp-servers"},{"title":"Knowledge and features","href":"/concepts/knowledge-and-features"},{"title":"Integrations","href":"/concepts/integrations"},{"title":"Devices","href":"/concepts/devices"},{"title":"Voice","href":"/concepts/voice"},{"title":"Spaces","href":"/concepts/spaces"},{"title":"Governance","href":"/concepts/governance"},{"title":"Security and data","href":"/concepts/security-and-data"},{"title":"Agent templates","href":"/concepts/agent-templates"}]},{"group":"Build","pages":[{"title":"Add a tool to a skill","href":"/build/add-a-tool"},{"title":"Write skill context","href":"/build/write-skill-context"},{"title":"Call your API from a tool","href":"/build/call-your-api"},{"title":"Let your agent handle OAuth","href":"/build/handle-oauth"},{"title":"Store and search data","href":"/build/store-and-search-data"},{"title":"Identify users","href":"/build/identify-users"},{"title":"Handle a webhook","href":"/build/handle-a-webhook"},{"title":"Create a trigger","href":"/build/create-a-trigger"},{"title":"Schedule a recurring job","href":"/build/schedule-a-job"},{"title":"Send proactive messages","href":"/build/send-proactive-messages"},{"title":"Add human handoff","href":"/build/add-human-handoff"},{"title":"Add knowledge","href":"/build/add-knowledge"},{"title":"Use an MCP server","href":"/build/use-an-mcp-server"},{"title":"Use the browser","href":"/build/use-the-browser"},{"title":"Add a processor","href":"/build/add-a-processor"},{"title":"Compose agents","href":"/build/compose-agents"},{"title":"Supervise another agent","href":"/build/supervise-agents"},{"group":"Workflows","pages":[{"title":"Build and run your first workflow","href":"/build/workflows/quickstart"},{"title":"Author a workflow","href":"/build/workflows/authoring"},{"title":"Add approvals and signals","href":"/build/workflows/approvals-and-signals"},{"title":"Operate workflow runs","href":"/build/workflows/operate-runs"},{"title":"Use the Job tier","href":"/build/workflows/job-tier"},{"title":"Stage agent changes from a coding step","href":"/build/workflows/stage-agent-changes"},{"title":"Declare connections in a workflow","href":"/build/workflows/connections"},{"title":"Schedule a workflow and set goals","href":"/build/workflows/goals-and-schedules"},{"title":"Watch schedule health","href":"/build/workflows/schedule-health"},{"title":"Test a workflow offline","href":"/build/workflows/test-offline"}]},{"group":"Apps","pages":[{"title":"Build and open your first web app","href":"/build/apps/quickstart"},{"title":"Write routes and pages for a web app","href":"/build/apps/routes-and-pages"},{"title":"Talk to the agent from your app","href":"/build/apps/agent-pane"}]}]},{"group":"Channels","pages":[{"title":"Channels","href":"/channels/overview"},{"title":"Test an agent on Lua's channels","href":"/channels/quick-testing"},{"title":"Connect WhatsApp","href":"/channels/whatsapp"},{"title":"Connect Facebook Messenger","href":"/channels/messenger"},{"title":"Connect Instagram","href":"/channels/instagram"},{"title":"Connect Slack","href":"/channels/slack"},{"title":"Slack permissions","href":"/channels/slack-permissions"},{"title":"Connect Microsoft Teams","href":"/channels/teams"},{"title":"Bring your own Azure Bot to Teams","href":"/channels/teams-byo-azure-bot"},{"title":"Teams permissions","href":"/channels/teams-permissions"},{"title":"Connect email","href":"/channels/email"},{"title":"SMS and phone numbers","href":"/channels/sms-and-phone-numbers"},{"title":"Voice calls","href":"/channels/voice-calls"},{"title":"RCS","href":"/channels/rcs"},{"title":"iMessage","href":"/channels/imessage"},{"title":"Front","href":"/channels/front"},{"title":"MessageBird","href":"/channels/messagebird"},{"title":"Meetings","href":"/channels/meetings"},{"group":"Web widget","pages":[{"title":"Add the chat widget to your website","href":"/channels/web-widget/quickstart"},{"title":"Widget configuration","href":"/channels/web-widget/configuration"},{"title":"Style the widget","href":"/channels/web-widget/styling"},{"title":"Track widget events","href":"/channels/web-widget/events-and-analytics"},{"title":"Add the widget to a React, Vue, Angular, or Svelte app","sidebarTitle":"Frameworks","href":"/channels/web-widget/frameworks"},{"title":"Voice chat in the widget","href":"/channels/web-widget/voice-chat"},{"title":"Troubleshoot the widget","href":"/channels/web-widget/troubleshooting"}]},{"group":"Response formatting","pages":[{"title":"Response formatting","href":"/channels/formatting/overview"},{"title":"Block syntax","href":"/channels/formatting/syntax"},{"title":"list-item","href":"/channels/formatting/list-item"},{"title":"horizontal-list-item","href":"/channels/formatting/horizontal-list-item"},{"title":"actions","href":"/channels/formatting/actions"},{"title":"links","href":"/channels/formatting/links"},{"title":"images","href":"/channels/formatting/images"},{"title":"documents","href":"/channels/formatting/documents"},{"title":"form","href":"/channels/formatting/form"},{"title":"payment","href":"/channels/formatting/payment"},{"title":"flow","href":"/channels/formatting/flow"},{"title":"navigate","href":"/channels/formatting/navigate"},{"title":"reaction","href":"/channels/formatting/reaction"}]}]},{"group":"Integrations","pages":[{"title":"Integrations","href":"/integrations/overview"},{"title":"Connect a Unified.to integration","href":"/integrations/connect"},{"title":"Subscribe to integration events","href":"/integrations/events"},{"title":"Manage integration MCP tools","href":"/integrations/mcp"},{"title":"Add a custom MCP server","href":"/integrations/custom-mcp-servers"},{"title":"Call an integration's API directly","description":"Use Integrations.passthrough in a tool to reach provider endpoints the integration's MCP tools don't cover","href":"/integrations/passthrough"},{"title":"Shopify","href":"/integrations/shopify"},{"title":"WooCommerce","description":"Install the Lua plugin on your WordPress store to give your agent an hourly synced catalog, baskets, checkout links, and a storefront widget","href":"/integrations/woocommerce"},{"title":"Square","href":"/integrations/square-ecommerce"},{"title":"Square Appointments","href":"/integrations/square-appointments"},{"title":"SimplyBook.me","href":"/integrations/simplybook"}]},{"group":"Devices","pages":[{"title":"Build your first device","sidebarTitle":"Start here","href":"/devices/quickstart"},{"title":"The device connection lifecycle","sidebarTitle":"How devices work","href":"/devices/how-it-works"},{"title":"Create a device credential","href":"/devices/credentials"},{"title":"Node device client","sidebarTitle":"Node client","href":"/devices/node-client"},{"title":"Python device client","sidebarTitle":"Python client","href":"/devices/python-client"},{"title":"MicroPython device client","sidebarTitle":"MicroPython client","href":"/devices/micropython-client"},{"title":"MQTT protocol","href":"/devices/mqtt-protocol"},{"title":"Expose device commands as tools","href":"/devices/commands-and-tools"},{"title":"Handle device triggers","href":"/devices/triggers"},{"title":"Upload files from a device","href":"/devices/cdn-uploads"},{"title":"Device reliability and limits","sidebarTitle":"Reliability and limits","href":"/devices/reliability-and-limits"},{"group":"Device examples","pages":[{"title":"Control a laptop from chat","sidebarTitle":"Laptop controller","href":"/devices/examples/mac-controller"},{"title":"Run a device on a Raspberry Pi Pico W","sidebarTitle":"Raspberry Pi Pico W","href":"/devices/examples/raspberry-pi-pico"},{"title":"Build a warehouse station","sidebarTitle":"Warehouse station","href":"/devices/examples/warehouse-inventory"},{"title":"Run a smart office with device groups","sidebarTitle":"Smart office","href":"/devices/examples/smart-office"},{"title":"Monitor a machine with a Pico W","sidebarTitle":"Factory monitor","href":"/devices/examples/industrial-sensor"}]}]},{"group":"Ship and operate","pages":[{"title":"Test an agent before you release","href":"/ship/testing"},{"title":"Release an agent to production","href":"/ship/releasing"},{"title":"Run the go-live checklist","href":"/ship/go-live-checklist"},{"title":"Automate releases in CI","sidebarTitle":"Automate with --ci","href":"/ship/ci-and-automation"},{"title":"Read logs and debug an agent","href":"/ship/logs-and-debugging"},{"title":"Back up and restore agent source","href":"/ship/backups-and-restore"},{"title":"Platform limits","href":"/ship/limits"},{"title":"Troubleshoot the CLI","href":"/ship/troubleshooting"}]},{"group":"Ship logs to your stack","pages":[{"title":"Ship logs to your stack","href":"/drains/overview"},{"title":"Event schema","href":"/drains/event-schema"},{"title":"Emit your own fields","href":"/drains/emit-your-own-fields"},{"title":"Delivery records","sidebarTitle":"delivery","href":"/drains/sources/delivery"},{"title":"Workflow audit records","sidebarTitle":"workflow-audit","href":"/drains/sources/workflow-audit"},{"title":"Generic HTTPS","href":"/drains/generic-https"},{"title":"OpenTelemetry","href":"/drains/opentelemetry"},{"title":"Datadog","href":"/drains/datadog"},{"title":"Better Stack","href":"/drains/better-stack"},{"title":"Splunk","href":"/drains/splunk"},{"title":"Grafana Loki","href":"/drains/loki"},{"title":"Axiom","href":"/drains/axiom"},{"title":"New Relic","href":"/drains/new-relic"},{"title":"Sumo Logic","href":"/drains/sumo-logic"},{"title":"Object storage","href":"/drains/object-storage"},{"title":"Verify signatures","href":"/drains/verify-signatures"},{"title":"Protecting your destination","href":"/drains/protecting-your-destination"},{"title":"Delivery guarantees","href":"/drains/delivery-guarantees"},{"title":"Drain notices","href":"/drains/notifications"},{"title":"Usage and plan quotas","href":"/drains/usage-and-quotas"},{"title":"Egress addresses and delivery policy","href":"/drains/egress"},{"title":"Datadog monitor pack","href":"/drains/packs/datadog-monitors"},{"title":"Grafana dashboard","href":"/drains/packs/grafana-dashboard"},{"title":"OpenTelemetry Collector config","href":"/drains/packs/otel-collector"}]},{"group":"Marketplace","pages":[{"title":"Marketplace","href":"/marketplace/overview"},{"title":"Publish an agent template","href":"/marketplace/publish-a-template"},{"title":"Template manifest","href":"/marketplace/manifest"},{"title":"Lifecycle hooks","href":"/marketplace/lifecycle-hooks"},{"title":"Lints and consent","href":"/marketplace/lints-and-consent"},{"title":"Install and apply a template","href":"/marketplace/install-and-apply"},{"title":"Check fleet health","href":"/marketplace/fleet-health"},{"title":"Publish and install marketplace skills","href":"/marketplace/skills"}]},{"group":"Build with AI","pages":[{"title":"Build a Lua agent with a coding assistant","sidebarTitle":"Overview","href":"/build-with-ai/overview"},{"title":"Add the docs MCP server to your coding assistant","sidebarTitle":"Docs MCP server","href":"/build-with-ai/docs-mcp"},{"title":"Build with the Claude Code plugin","sidebarTitle":"Claude Code plugin","href":"/build-with-ai/claude-code-plugin"}]},{"group":"Examples","pages":[{"title":"Examples","href":"/examples/overview"},{"title":"Customer support agent","href":"/examples/customer-support"},{"title":"E-commerce shopping agent","href":"/examples/ecommerce-assistant"},{"title":"Healthcare patient portal","href":"/examples/healthcare-portal"},{"title":"Door access over WhatsApp","href":"/examples/iot-door-assistant"},{"title":"Greenhouse relay control","href":"/examples/iot-smart-light"}]}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/sdk/overview"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Shopify - Lua CLI","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DXXFP6nH.js","DynamicMarkdown-B54_zNBF.js","zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js"]}