# Quickstart: Script tag > Add OakData to any HTML page with one script tag - no bundler, no build step. Source: https://oakdata.co/docs/quickstart/script --- No build step? One classic script tag installs OakData on static sites, server-rendered templates, or any plain HTML page. The loader reads your key from the tag and boots the SDK from a CDN. In a hurry? Paste this prompt into Claude Code, Cursor, or any agent working on your site, and give it your public key when asked: **Prompt for a coding agent:** ``` Add OakData product analytics to this site (no build step). 1. In the shared layout - or every page's - add: Ask me for the key value if you don't already have it. 2. If the site has a login flow, call oak.identify(user.id, { email: user.email }) when it resolves, and oak.reset() on logout. window.oak is available as soon as the tag is parsed - early calls are queued. 3. For important buttons and links, prefer declarative tracking: add data-oak-event="event_name" plus data-oak-prop-* attributes instead of inline JS handlers. Don't add any other analytics providers. Show me the changes before applying them. ``` ## Drop-in snippet Paste this near the end of your `` (or before ``), with your project's **public** key (`oak_pub_…`): **Before ** ```html ``` That one tag boots the tracker: pageviews fire on load, and [autocapture](https://oakdata.co/docs/sdk/autocapture) records clicks and form submits. It also assigns `window.oak`, so any inline script or handler can call the API. The ingest host follows the domain in `src` - which is what makes the [managed reverse proxy](https://oakdata.co/docs/sdk/proxy) a one-word change. > **Calls before the SDK loads are safe** From the moment the tag is parsed, `oak.*` calls are queued and replayed once the SDK is up - inline handlers never have to worry about load order. ## Tracking events & identifying users **index.html** ```html ``` > **Public keys only** Page source is public - only ever put a `oak_pub_…` key in a script tag. Secret keys (`oak_sec_…`) are for the [REST API](https://oakdata.co/docs/api/rest) and [MCP server](https://oakdata.co/docs/api/mcp), and must stay server-side. ## Prefer an ES module? The loader is a convenience wrapper - the SDK itself is a standard ES module on npm, so you can import it directly from a CDN and call `init` yourself. Pinning the version (`@1`) stops the CDN from silently crossing a breaking change. **esm.sh** ```html ``` **jsDelivr** ```html ``` > **Ad-blockers eating your data?** Filter lists block requests to analytics domains. Serve OakData first-party from a subdomain of your own site with one CNAME record - see the [managed reverse proxy](https://oakdata.co/docs/sdk/proxy). The [SDK reference](https://oakdata.co/docs/sdk/reference) covers every method and init option.