Skip to main content

Media inventory

Every screenshot, video and diagram the documentation calls for, ordered by priority rather than by filename.

59 placeholders: 58 screenshots, 1 video.

Each one appears inline in the docs as a greppable comment:

<!-- MEDIA: screenshot | id: example-placeholder-id | description -->

To find one in the source:

grep -rn "id: install-snippet-copy" docs/

To find everything still outstanding:

grep -rn "MEDIA:" docs/

Capture conventions

Apply to everything unless a row says otherwise.

Viewport1440 × 900 for full-page app screenshots. Crop tightly for single cards, dialogs and DevTools panels.
ThemeLight, unless the row says dark. Two rows deliberately want dark, to check contrast.
DataRealistic and non-round. 12,483 not 10,000. Vary statuses, dates and magnitudes so a table tells a story. Never Test 1 / Test 2, never Lorem ipsum.
Namesexample.com for the tracked domain. Real-looking referrers (news.ycombinator.com, reddit.com) are fine. No invented person names in testimonial style.
Site keyA plausible fake: ts_a1b2c3d4e5f6. Never a real one.
API keyAlways visibly fake. Never a real ts_live_ value, even revoked.
ChromeHide browser bookmarks bars and unrelated extensions. Nothing personal in a tab title.
RedactionNo real email addresses, no real customer domains, no real invoice figures.
FormatPNG at 2× device pixel ratio. Video as MP4, H.264, 1440 × 900, no audio.

Priority 1 — blocking getting-started and install

These are the pages a new customer reads in their first five minutes. Nothing else matters until these exist.

1a. The first-run flow

#idTypeAppears inMust showCapture notes
1install-snippet-copyscreenshotgetting-started/install-the-script.mdThe install page with the snippet rendered, real site key visible, copy buttonPlatform tab strip above it, "Plain HTML" selected. 1440px, light. The single most reused image — get this one right first.
2first-event-connectvideogetting-started/see-your-first-visit.mdInstall page in "Waiting", snippet pasted into a page in a second tab, page loaded, cut back, page flips to "Connected" with a timestamp~20s screen capture, no audio, 1440 × 900, light. The one video in the set.
3install-waiting-statescreenshotgetting-started/see-your-first-visit.mdInstall page in "Waiting for your first event", with the snippet above it and the polling indicatorLight. Pairs with #4 — same page, same scroll position, same crop.
4install-connected-statescreenshotgetting-started/see-your-first-visit.mdThe same page after the first event: "Connected", the first-event time, the dashboard linkLight. Must be framed identically to #3 so the two read as before/after.
5gs-add-site-formscreenshotgetting-started/add-your-first-site.md"Add a site" form filled in: domain example.com, a name, timezone select open1440px, light.
6verify-network-tabscreenshotgetting-started/see-your-first-visit.mdDevTools Network: t.js (200) and POST /api/events (202) with body {"ok":true}Dark DevTools. Crop to the two rows and the status column.
7dashboard-full-populatedscreenshotgetting-started/what-to-look-at-first.mdThe whole dashboard scrolled to top: four tiles, traffic chart with the AI crawler series visible, top of the geo/tech row~1 month of realistic traffic. 12,483 views / 3,912 visitors or similar. 1440px, light.
8dashboard-drilldown-filterscreenshotgetting-started/what-to-look-at-first.mdDashboard after clicking a referrer row: Filters button with a count badge of 1, popover open listing the filterLight.
9gs-site-quota-refusedscreenshotgetting-started/add-your-first-site.md"Add a site" refused on Starter with one site already: the site-limit message and the upgrade linkLight. Needs a Starter account at its limit.

1b. The install-page snippet tabs

Six shots of the same screen with a different platform tab selected. Capture them in one sitting — same account, same site, same key, same crop — so they read as one set.

#idTypeAppears inMust show
10install-snippet-plain-htmlscreenshotinstall/plain-html.md"Plain HTML" tab selected, snippet with real site key, copy button
11install-snippet-nextjsscreenshotinstall/nextjs.md"Next.js" tab, the App Router variant
12install-snippet-wordpressscreenshotinstall/wordpress.md"WordPress" tab
13install-snippet-webflowscreenshotinstall/webflow.md"Webflow" tab
14install-snippet-framerscreenshotinstall/framer.md"Framer" tab
15install-snippet-gtmscreenshotinstall/google-tag-manager.md"Google Tag Manager" tab — the DOM-construction variant, visibly different from the plain snippet
16install-snippet-ai-buildersscreenshotinstall/ai-builders.md"AI builders" tab — the paste-into-chat prompt with the real key substituted

All: 1440px, light.

1c. Verification

#idTypeAppears inMust showCapture notes
17install-connected-with-timestampscreenshotinstall/verifying-it-works.mdInstall page in Connected state with the first-event time and the dashboard linkMay be the same capture as #4 if the framing suits both.
18verify-network-202screenshotinstall/verifying-it-works.mdNetwork tab filtered to /api/events: status 202, Response panel showing {"ok":true}Crop tight to the request row plus the response body.

Priority 2 — third-party platform UIs

Screens inside someone else's product. Each needs a real account on that platform, which makes them the slowest to produce — start acquiring accounts early even though they rank second.

Keep each platform's own theme; do not force light on a product whose UI is dark.

#idTypeAppears inMust showCapture notes
19webflow-custom-code-headscreenshotinstall/webflow.mdWebflow Site settings → Custom code → Head code, snippet pasted, Save changes button visibleWebflow's dark UI. Site settings, not page settings — the page's whole warning turns on that.
20wordpress-theme-file-editorscreenshotinstall/wordpress.mdWordPress Theme File Editor, header.php open, snippet directly above </head>, highlightedWP admin light.
21gtm-custom-html-tagscreenshotinstall/google-tag-manager.mdGTM tag editor: Custom HTML tag with the snippet, trigger "All Pages"GTM light. The trigger must be legible — it is the point of the shot.
22framer-custom-code-headscreenshotinstall/framer.mdFramer Site settings → Custom code, snippet in "Start of <head> tag"Framer's dark UI.
23squarespace-code-injectionscreenshotinstall/head-field-platforms.mdSquarespace Settings → Advanced → Code Injection, snippet in HeaderSquarespace light. Needs a Business plan for the field to exist.
24wix-custom-code-settingsscreenshotinstall/head-field-platforms.mdWix Tracking & Analytics custom code dialog: snippet pasted, "All pages", "Head"Wix light. Needs a Premium plan. Both selectors must be legible.
25ghost-code-injectionscreenshotinstall/head-field-platforms.mdGhost Settings → Code injection, snippet in Site headerGhost admin.
26webflow-custom-attribute-goalscreenshotinstall/webflow.mdWebflow Designer element settings: custom attribute data-ts-goal = signup on a buttonWebflow dark.

Priority 3 — the dashboard

One populated test site can produce almost all of these in a single session. Seed it with about a month of varied traffic — several countries, several referrers, a mix of browsers, and a decent spread of crawler families — then capture in one pass so the numbers agree across every shot.

#idTypeAppears inMust showCapture notes
27dashboard-four-tilesscreenshotdashboard/metrics.mdThe four summary tiles: Views, Unique visitors, AI crawler views, Verified crawlerse.g. 12,483 / 3,912 / 1,247 / 62%. Crop to the tile row. Note: verification is not running yet, so a live capture shows 0%. Either capture against seeded data with verified rows, or hold this until IP verification ships.
28dashboard-breakdown-cardsscreenshotdashboard/breakdowns.mdGeo and tech cards side by side, internal tabs visible, populated1440px, light.
29dashboard-filters-popoverscreenshotdashboard/breakdowns.mdFilters popover open with two active filters (Country: Germany, Browser: Firefox), remove buttons, "Clear all"Light.
30dashboard-range-picker-openscreenshotdashboard/date-ranges.mdRange picker open: full preset list on the left, two-month calendar on the right1440px, light.
31dashboard-channels-cardscreenshotdashboard/channels.mdTraffic sources → Channels: a spread across Direct, Organic Search, Referral, Social, AI, CampaignLight. The AI channel row must be present and visible — it is the differentiated one.
32dashboard-world-mapscreenshotdashboard/world-map.mdWorld map populated across several continents, hover tooltip on one country showing name and countLight, desktop.
33dashboard-world-map-darkscreenshotdashboard/world-map.mdThe same map in dark themeDark. Deliberate — checks the country fill scale reads against a dark ground.
34dashboard-live-nowscreenshotdashboard/live-view.md"Now" preset selected: minute buckets over 30 minutes, "updated Xs ago" beside the refresh buttonLight. Needs live traffic during capture.
35dashboard-ai-human-splitscreenshotdashboard/metrics.mdThe AI-vs-human split stacked bar, several crawler families plus a human segmentLight, cropped to the card.
36site-settings-exclusionsscreenshotdashboard/excluding-your-own-visits.mdExclusions panel: excluded paths with a few glob patterns, excluded IPs with one address storedLight. Use a private-range IP; nothing real.

Priority 4 — the AI panel

The product's differentiator. Same seeded site as Priority 3, with a realistic crawler mix.

#idTypeAppears inMust showCapture notes
37ai-panel-fullscreenshotai-visibility/what-this-panel-shows.mdThe AI card, Crawlers tab, spread across operatorse.g. OpenAI 612 / Anthropic 341 / Google 188 / Perplexity 74. 1440px, light.
38ai-pages-read-tabscreenshotai-visibility/ai-traffic-by-page.mdAI card, "Pages read" tab: ranked paths with crawler view countsUse a docs or blog site so the paths are recognisable and the distribution is uneven. Light.
39chart-humans-vs-crawlersscreenshotai-visibility/humans-vs-ai.mdThe main traffic chart with both series and the full legendPick a range where the crawler series has visible shape, not a flat line. Light.
40ai-human-split-barscreenshotai-visibility/humans-vs-ai.mdThe split stacked bar with named crawler families labelledLight, cropped. May be the same capture as #35 if the labels are legible in both.

Priority 5 — troubleshooting and error states

Every one of these is a failure state, so each has to be produced deliberately against a test site. Several cannot be captured by chance.

#idTypeAppears inMust showCapture notes
41troubleshoot-network-checkscreenshottroubleshooting/no-events.mdNetwork tab on a working install: t.js 200 and /api/events 202The reference "this is what right looks like". Crop tight.
42csp-console-errorscreenshotscript/content-security-policy.mdConsole showing the CSP violation for connect-src blocking /api/eventsDark DevTools, cropped to the message. Set up a test page with script-src allowed and connect-src not — that exact asymmetry is the point.
43adblock-blocked-requestscreenshottroubleshooting/ad-blockers.mdNetwork tab with t.js blocked/failed and an empty ConsoleBoth panels visible. The pairing is the diagnostic — a blocker prints nothing where a CSP prints a message.
44duplicate-events-networkscreenshottroubleshooting/duplicate-events.mdTwo t.js requests and two /api/events POSTs from one page loadDeliberately double-install a test page.
45custom-event-console-errorscreenshotscript/custom-events.mdConsole error naming a rejected goal — e.g. Signup refused for the capital letterDark DevTools, cropped. Fire a deliberately invalid event.
46proxy-broken-ip-symptomscreenshotscript/proxying.mdThe dashboard under a misconfigured proxy: unique visitors at 1–2 against thousands of views, world map showing one countryAnnotate with a callout arrow. A "what wrong looks like" figure — build a proxy that drops the IP against a test site to produce it.
47identity-mode-togglescreenshotscript/cookieless-mode.mdSite settings identity control: all three modes, first-party cookie selected as default, accuracy note rendered beside itLight. The accuracy note must be legible — the rule is that the honest limit sits next to the choice, and this image is the evidence.
48site-delete-confirmationscreenshotprivacy/deleting-your-data.mdDelete-site dialog: type-the-domain field and the warning about what is removedLight. Use a throwaway site.

Priority 6 — features not yet built

Do not attempt these until the feature ships. Each is listed against the page that will need it, so nothing is forgotten at launch.

Sharing

#idTypeAppears inMust show
49sharing-create-linkscreenshotsharing/creating-a-share-link.mdThe Sharing panel: created link with copy button, section toggles, range cap, password field, expiry
50shared-dashboard-viewscreenshotsharing/what-a-viewer-sees.mdA share link opened logged out: read-only dashboard, no sidebar, no settings, no account menu

#50 is the important one — the page's whole promise is "here is exactly what your viewer sees", so it must be captured in a genuinely signed-out browser rather than approximated.

Team

#idTypeAppears inMust show
51team-invite-dialogscreenshotteam/inviting-someone.mdInvite dialog with an email entered and the role selector open showing all four roles
52team-seat-limit-refusedscreenshotteam/seat-limits.mdInvite refused on Starter, with the seat allowance and the upgrade link

API

#idTypeAppears inMust showCapture notes
53api-key-created-oncescreenshotapi/getting-an-api-key.mdKey creation result: the full plaintext key, copy button, prominent shown-once warningA clearly fake key. Never a real ts_live_, even a revoked one.

Billing

#idTypeAppears inMust showCapture notes
54pricing-slider-two-tiersscreenshotbilling/plans-compared.mdPricing page: slider at 200k, both tier cards at that step, monthly/yearly toggleThe pricing page may exist before the billing screens do — check, this may be capturable now.
55billing-usage-meterscreenshotbilling/what-counts-as-an-event.mdUsage meter: events used against the limit, ~70% consumed, period end date
56over-quota-bannerscreenshotbilling/at-your-limit.mdDashboard with the over-quota banner: usage against limit, add-on and upgrade optionsRealistic overage, e.g. 214,802 of 200,000. Needs an account deliberately pushed over.
57billing-payment-methodscreenshotbilling/invoices.mdPayment method section: saved card brand and last four, update buttonA Stripe test card. Never real card data.
58goals-cardscreenshotscript/custom-events.mdThe Goals card: three or four goal names with visitor counts, at least one showing a differing completions line beneath itThe differing row is the point — it is what shows the two numbers are not the same measurement. Light theme, cropped to the card.
59goals-filter-appliedscreenshotscript/custom-events.mdThe dashboard with a goal filter active: filter chip at the top, country card narrowed to the visitors who triggered that goalShows the visitor-scoped filter — the country card must still show pageview-derived rows, not just the goal rows. Light theme, top half.

Batching plan

Roughly how to sequence a capture session.

BatchWhatNeeds
A1–9, 17–18One fresh account, one new site, one test page to paste into. Do the flow once, capturing as you go. Yields the whole first-run story including the video.
B10–16The same account, cycling the install page's platform tabs. Fast — one screen, seven states.
C19–26Accounts on Webflow, WordPress, GTM, Framer, Squarespace (Business), Wix (Premium), Ghost. The long pole. Start acquiring these while doing Batch A.
D27–40One test site seeded with ~1 month of varied human and crawler traffic. Capture the whole dashboard and AI panel in one pass so numbers agree between shots.
E41–48Deliberate failures: a CSP page, an ad blocker, a double install, an invalid event, a proxy that drops the IP. Each is a small setup.
F49–57After the corresponding features ship.

Blockers worth knowing before you start

#27 dashboard-four-tiles and #37/#39 (the AI panel) — IP verification is not running yet, so a live capture shows "Verified crawlers" as 0%. Either seed verified rows, or accept the 0% and re-capture when verification ships. Do not retouch the number.

#54–57 (billing) — the billing screens are not built. The pricing page may be; check before deferring #54.

#49–53 (sharing, team, API) — those screens do not exist yet.

#46 proxy-broken-ip-symptom — this one has to be manufactured. Stand up a proxy that deliberately drops the client IP, point a test site at it, generate traffic from a few different addresses, and capture the collapse. It is the most effort of any single image here and it is also the one that stops a customer destroying their own visitor counts.

Was this page helpful?

Last updated August 28, 2026