The widget doesn't show up
Check the script tag, the organization key, the browser console, your Content Security Policy and your billing, in that order.
Work down this list. Most installs that don't work stop at the first or second step.
1. The tag is on the page, once
View your page's source and search for t.js. You need exactly one tag, before </body>:
<script src="https://teem.so/t.js" data-organization="pk_..." defer></script>
A second tag is ignored, even one with a different key. If you're testing a second organization, take the first tag out.
2. The key is current
data-organization must match the key in Settings → Keys. When someone rotates that key, every install still using the old one stops loading until it's updated.
3. The console is quiet
Open your browser's developer tools and look for lines starting with teem:.
| Message | What it means |
|---|---|
teem: data-organization is required |
The attribute is missing from the tag |
teem: widget could not start |
The key is wrong or was rotated, or billing switched the widget off |
teem: identity was not accepted |
identify() sent something teem rejected. The widget still works, and the visitor is asked for their details |
4. Your Content Security Policy allows teem.so
If your app sends a Content-Security-Policy header, add https://teem.so to script-src, connect-src, img-src and font-src. The widget puts its own styles inside a shadow root, so a strict style-src may also need 'unsafe-inline'.
5. The organization isn't locked
Fourteen days after an organization goes read-only, its widget stops loading. Settings → Billing shows where you stand. See Trial, price and what happens when it ends.
Confirming it worked
Open the Install screen. After the widget's first load it switches to installed and shows the origin and page it last saw. Check that the origin is your app's. Localhost counts.