Per-entry GA4 reporting

How Is This Page Doing?

Telescope puts Google Analytics 4 numbers for a single entry right inside the Craft control panel — so editors never have to leave Craft, learn GA4, or be handed a Google account.

Telescope

See It in Action

Add the Analytics field to a field layout — or switch on the entry sidebar and add nothing at all — and every entry gets its own report.

Analytics

/blog/shipping-a-craft-plugin

Last 28 days ▾ Print
Page views
24,154
Visitors
17,485
Sessions
19,902
Avg. session
2m 14s
Engagement
61.4%
Bounce rate
38.6%
Page views Visitors
Jun 28 Jul 25
Traffic sources
Source / medium Sessions
google / organic 9,431
(direct) / (none) 4,118
newsletter / email 2,760
reddit.com / referral 1,644
bing / organic 902
Referring pages
Referrer Sessions
news.ycombinator.com 1,208
craftcms.com/plugins 844
reddit.com/r/craftcms 436
twitter.com 311
dev.to 190
Locations
Country Visitors
United States 7,902
United Kingdom 2,441
Germany 1,806
Netherlands 1,204
Australia 988
Landing pages
Path Sessions
/blog/shipping-a-craft-plugin 11,320
/blog 3,905
/ 2,214
/about 1,102
/contact 640

A representation of the Analytics field report. Figures are illustrative.

Features

Everything an editor needs to know about a page, without leaving the page.

A Report Per Entry

Open an entry and see the numbers for that page: views, visitors, sessions, average session duration, engagement and bounce rate, plus a timeline of the whole period. Telescope resolves the entry’s URL to a GA4 page path and asks about that path only.

Field, Sidebar, Section, Widget

Add the Analytics field wherever you want the full report. Or switch on Show on all entries for a compact sidebar summary with no field layout changes at all. A Telescope section lists the property’s most-viewed pages, and a dashboard widget puts the top pages on the Craft dashboard.

Six Breakdowns, All Optional

Overview, timeline, geography, traffic sources, referring pages and landing pages. Each one is a single Data API call, so you can switch off the sections you don’t need and cut your quota use to match.

Zero Runtime Dependencies

No Metrix, no third-party analytics plugin, no Chart.js. The signed JWT assertion, the GA4 Data API client and the timeline chart are all in the plugin, and the chart is server-rendered SVG. Nothing loads from a CDN, so Telescope works happily under a strict Content Security Policy.

Service Account Auth

Authenticate with a Google service account — the credential type built for server-to-server access. No browser consent flow and no refresh token to expire. Every credential field reads environment variables, so the private key stays out of committed project config. An OAuth refresh token works too, if you already have one.

Multi-Site Aware

Point each site at its own GA4 property, or share one property across all of them and turn on hostname filtering — otherwise /about on every site is the same page path and their numbers get added together.

Cached, and Warmable from Cron

Reports are cached for ten minutes by default; failures never are, so fixing a credential problem takes effect immediately. Console commands check the connection, print a report, list top pages, warm the cache ahead of your editors, and clear it on demand.

A Report You Can Hand Over

Every report has a print view — a clean, standalone page an editor can export to PDF straight from the browser and send to a client. No PDF library, no headless renderer.

A Twig API for the Front End

The same numbers are available to your templates through craft.telescope.* — reports for an element or an arbitrary URL, the property’s top pages, and the formatting and chart helpers the control panel uses.

Frequently Asked Questions

Common questions about Telescope.

Nothing. Telescope is free, under the Craft license. There is no paid edition, no trial and no upsell.

No. Telescope talks to the Google Analytics Data API directly. It has zero runtime dependencies — the signed JWT assertion, the API client and the timeline chart are all implemented in the plugin, and nothing is loaded from a CDN. That also means it works under a strict Content Security Policy.

Craft CMS 5.0 or later and PHP 8.2 or later, with the json and openssl extensions — both are standard on virtually every PHP install. You also need a GA4 property and permission to add a user to it.

With a Google service account by default: you create a JSON key in the Google Cloud console, add the service account’s email address to your GA4 property as a Viewer, and paste the key (or a path to it) into the plugin settings. There is no browser consent flow and no refresh token to expire. If you already have an OAuth client and refresh token for the Analytics API, you can use those instead.

No — that is largely the point. The service account is the only Google identity involved. Editors just need the View analytics reports permission in Craft.

Yes, and you should. Both the credentials and the property ID fields parse environment variables, so you can store the key in .env and enter $GOOGLE_ANALYTICS_CREDENTIALS in the setting. Project config then only ever contains the variable name.

Only if you want the full report inline. Turn on Show on all entries and Telescope adds a compact summary to every entry’s sidebar without touching a single field layout — optionally limited to chosen sections. The Analytics field itself stores nothing either, so adding or removing it never touches your content tables.

Overview cards (page views, visitors, sessions, average session duration, engagement rate and bounce rate), a timeline chart, and breakdowns by location, traffic source, referring page and landing page. Each of those sections can be switched off individually.

Each site can point at its own GA4 property via per-site property IDs, or they can all share one. If they share one, turn on Filter by hostname — otherwise /about on every site is the same page path in GA4 and the numbers get added together.

A full report costs six Data API calls, one per section. Reports are cached for ten minutes by default and served from cache thereafter; failed calls are never cached, so fixing a credential problem takes effect straight away. On a busy site, run telescope/analytics/warm from cron and switch off the sections you do not need.

Almost always because the page path Telescope is matching is not the path GA4 recorded. Run php craft telescope/analytics/show <id> to see the exact path being queried, compare it with GA4 under Reports → Engagement → Pages and screens, then adjust Path match type or Include query strings.

Yes. craft.telescope.report(entry), craft.telescope.reportForUrl(url) and craft.telescope.topPages() are available in front-end Twig, along with the same formatting and SVG chart helpers the control panel uses.

Point it at your content

Give your editors the numbers for the page they’re already looking at.

Free, under the Craft license · Craft 5 · PHP 8.2+