diff --git a/packages/audience/sdk-sample-app/README.md b/packages/audience/sdk-sample-app/README.md
new file mode 100644
index 0000000000..176895533d
--- /dev/null
+++ b/packages/audience/sdk-sample-app/README.md
@@ -0,0 +1,178 @@
+# @imtbl/audience-sdk-sample-app
+
+Interactive sample app for `@imtbl/audience`. Every public method, every
+typed `track()` event, and every reachable `AudienceErrorCode` has a
+dedicated UI control so you can sanity-check SDK changes end-to-end
+against the real sandbox backend and copy working call sites.
+
+> **Pre-release.** Depends on `@imtbl/audience@0.0.0`. The SDK API is
+> stabilising but breaking changes may still land before the first
+> published release.
+
+## Why vanilla JavaScript?
+
+Every other sample app in this monorepo (`packages/passport/sdk-sample-app`,
+`packages/checkout/sdk-sample-app`, `packages/internal/dex/sdk-sample-app`,
+`packages/internal/bridge/bridge-sample-app`) is React + Next.js with the
+`@biom3` design system. This one is plain ES2020 served by a ~90-line Node
+stdlib HTTP server. Intentional: the whole point is to demonstrate how
+`@imtbl/audience` loads via a plain `
+
+