Skip to main content

Install from npm

The package is on public npm under the MIT license, so you don’t need any .npmrc, registry or token setup.
If a project or home .npmrc maps the @quickbutik scope to another registry, that mapping hides the public package and the install fails with Cannot find module '@quickbutik/kit'. Remove the scope mapping.
Requirements
  • Node 18 or newer on the server, because the kit needs a global fetch.
  • React is an optional peer dependency (^18.2 || ^19), needed only for @quickbutik/kit/react. Some features (<ProductProvider slug>, the promise form, tag hoisting in <SEO />) need React 19.
  • The SDK itself has zero runtime dependencies.

Entry points

In a framework with server components (Next.js App Router), keep /react below a "use client" boundary and fetch catalog data on the server with the plain client from @quickbutik/kit.

Load from a CDN (no build step)

For a page with no npm and no bundler, load the self-contained script-tag build:
Pin an exact version in a script tag (@1.8.0, not @1 or no version at all) and bump it on purpose. To self-host, copy the file out of node_modules/@quickbutik/kit/dist/ and serve it from your own origin.
Use defer to keep the script off the critical path. The full list of data-* attributes is in the script tag reference.

Environment variables

The publishable key is public by design, so it belongs in the env var your framework exposes to the browser. Keep the .env file out of git anyway.
Never put a qb_pat_… personal access token in any of these. The kit rejects one with a ShopkitConfigError, but a public env var would still ship it to every visitor.
Leave apiUrl and checkoutUrl unset in production. They default to https://commerce.quickbutik.com and https://pay.quickbutik.com.

Versions

The current version is 1.8.0. Install it unpinned from npm and pin it exactly in a script tag. These features need a minimum version:
Upgrading to 1.8.0 changes two defaults. Every storefront built on <ShopkitProvider>, configure(), <qb-shop> or the script tag now shows a cookie banner and, once the shopper agrees, loads the shop’s analytics; opt out with consent: false in the config (data-consent="false"). And configure({ currency }) / data-currency, which used to be formatting settings only, are now sent with every request as the currency the page browses in. For the shop’s own currency the platform answers exactly as before.
The full history is in the package’s CHANGELOG.md on npm.