UTM attribution
Click a link with ?utm_source=…; the tracker captures source / medium / campaign on the next pageview.
Every click, scroll, route change and custom-dimension you set on this page lands in the demo0001 report. Open the same report and you'll find yourself in it.
Click any button — the log on the right shows the data point you just produced.
Click a link with ?utm_source=…; the tracker captures source / medium / campaign on the next pageview.
SDK auto-detects ?q=… on any URL and reports the query as an event.
Hit a deliberately broken path — 404.php reports the dead link via the tracker.
Try a broken linkSDK auto-captures clicks to external hosts and reports them as events.
Try an outbound linkClicks on common file extensions (pdf/zip/docx/…) auto-report as a "download" event.
Try a .txt downloadcd1-3 set via tj("cd", 1, "premium"); piggyback on every subsequent PV/event. Great for A/B buckets or tier slices.
Counts only seconds where the tab is visible AND there has been an interaction within 30 s — idle time is excluded.
Native PerformanceObserver measures LCP / INP / CLS; reported on pagehide; Google thresholds shown in the dashboard.
See your Vitalsdemo0001 is a public demo. Everyone's visits roll up together — but you'll immediately see your impact in the device / geo / browser panels.
Open demo0001 reportOne line, four ways. All async, never blocking.
Paste before </body>. Easiest / best compatibility.
<script async src="https://9ping.dev/hm.min.js"
data-sid="YOUR_SITE_ID"></script>
Dynamic load for JS apps. Auto-listens to hashchange + History API — no manual virtual PV.
// React/Vue/Vite/Next SPA
(function () {
var s = document.createElement('script');
s.async = true; s.src = 'https://9ping.dev/hm.min.js';
s.dataset.sid = 'YOUR_SITE_ID';
document.head.appendChild(s);
})();
Catches visitors with JS disabled. Stack on top of either method above.
<noscript>
<img src="https://9ping.dev/collect.php?sid=YOUR_SITE_ID&type=pv"
width="1" height="1" style="display:none" alt="">
</noscript>
Call tj() anytime after load — one helper for buttons / form submits / funnel steps.
// 自定义事件
tj('event', 'signup', 'submit', 'pricing-page');
// 自定义维度(跟随后续 PV/事件一同上报)
tj('cd', 1, 'premium');
tj('cd', 2, 'card');
This page is tagged with our tracker (site_id = demo0001 — identical to what the dashboard hands you). Try this:
Click the "Products" tab — the address bar gets #/page2, the title changes, and a new virtual PV pops up on the right. That is single-page-app (SPA) page tracking.
Tip: open a few incognito windows — UV and online count will distinguish different visitors.
Virtual PV fired — switching hash routes is exactly how React/Vue apps change pages. The new PV is on the right.
$129
Active noise cancelling · 38 h battery · multipoint
$219
Sapphire crystal · heart rate & SpO₂ · 50 m water-resistant
$89
Custom 75 % layout · hot-swap sockets
Each "Add to cart" click is reported as a custom event (category=ecommerce, action=add_to_cart, label=product SKU).
This demos the last step of a conversion funnel. The form never really submits, but form focus and the "Place order" click are both reportable events.