> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pivolio.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pivolio.com/_mcp/server.

# SDKs

Pivolio ships one tracking engine and several thin bindings around it. Install
exactly one of them; they are not meant to be combined in a single page.

#### [Browser](/documentation/sd-ks/browser)

Vanilla JavaScript and TypeScript. The engine everything else wraps.

#### [React](/documentation/sd-ks/react)

`PivolioProvider`, `usePivolio`, `useTrack`, `usePageView`.

#### [Next.js](/documentation/sd-ks/next-js)

Everything in React, plus App Router page views.

#### [Shopify](/documentation/sd-ks/shopify)

A Web Pixel extension for the storefront funnel.

#### [Script tag](/documentation/sd-ks/script-tag)

CDN install with an async command queue — no build step.

#### [Configuration](/documentation/sd-ks/configuration)

Every option, its default, and its unit.

## The packages

| Package            | Install when                              | What it gives you                                       |
| ------------------ | ----------------------------------------- | ------------------------------------------------------- |
| `@pivolio/browser` | Plain JS/TS, Vue, Svelte, or a script tag | The `Tracker` class and the singleton API               |
| `@pivolio/react`   | Any React app that isn't Next.js          | The provider and hooks                                  |
| `@pivolio/next`    | Next.js (App Router or Pages)             | All of React, plus `<PivolioPageView />`                |
| `@pivolio/shopify` | A Shopify Web Pixel extension             | `createShopifyPixel(api)`                               |
| `@pivolio/core`    | **Never**                                 | Shared internals — private, and bundled into the others |

> **Warning**
>
> `@pivolio/core` is a private package. It is bundled into every published SDK, so
> you never install it and never import from it. The four published packages above
> are the entire public surface.

`@pivolio/react` and `@pivolio/next` depend on `@pivolio/browser`, so installing
the wrapper is enough — you don't add the browser package alongside it. And
because `@pivolio/next` re-exports the whole React surface, a Next app installs
`@pivolio/next` only.

#### npm

```bash
npm install @pivolio/browser
# or @pivolio/react · @pivolio/next · @pivolio/shopify
```

#### Script tag

```html
<script async src="https://unpkg.com/@pivolio/browser@1/dist/browser.browser.js"></script>
```

## Versioning

Every package is released together off a single `v*` git tag and shares one
version number. That means you never have to reason about
compatibility between, say, `@pivolio/next` and the `@pivolio/browser` it wraps:
matching versions are the only combination that ships.

The practical consequence is that upgrading is all-or-nothing. If you have both
`@pivolio/next` and `@pivolio/shopify` in a monorepo, bump them in the same
change.

## What every binding shares

Whichever package you install, the behaviour underneath is identical:

* **`track(name, { properties, traits })`** — properties are nested under
  `properties`, never passed at the top level.
* **Batching by default** — events buffer and go out via `/batch`. See
  [Configuration](/documentation/sd-ks/configuration).
* **One identity model** — the same cookies, the same `/id` server call, the
  same cross-domain linker. See
  [Identity and consent](/documentation/sd-ks/identity-consent).
* **Zero runtime dependencies** — nothing is pulled in beyond React itself for
  the React and Next bindings.

> **Note**
>
> Events are tracked and reported as soon as they arrive, but **delivery to ad
> platforms requires an active plan or trial**. An unsubscribed workspace records
> everything and dispatches nothing.