Changelog
What's new in Notion Analytics
Every release, every improvement, every fix. We ship constantly and you can track it all here.
- v1.5.5
Your dashboard now loads in its final state: no more post-reload surprise lock
- Reloading the dashboard had a tell: for the fraction of a second while the page settled, every analytics tab (Overview, Realtime, Pages, and the rest) looked open and clickable, then suddenly snapped to locked once the app learned you hadn't connected Notion yet. The lock state is now resolved on the server before the page is even sent to your browser, so the sidebar is locked (or unlocked) from the very first frame it's visible. There is no in-between state anymore, on any reload.
- The dashboard also paints faster and more honestly across the board: your session, plan, and workspaces are read server-side in one pass instead of through a chain of follow-up requests, deep links like a billing upgrade CTA land directly on their tab (no brief flash of Overview first), and the "Complete setup" button's label no longer gets cut short by its 1-minute badge on narrower sidebars.
- v1.5.4
Password-reset emails now actually sign you in, and every dead link explains itself
- Clicking "Reset Password" in the email used to dead-end: the link opened the reset page, but the sign-in session it created was silently thrown away (the tokens traveled in a part of the URL the server can never read), so typing a new password answered "session expired", and re-clicking the same email said the link had "expired" even minutes after arrival, because that first wasted click had already consumed it. Emails now carry a server-redeemable link: the click establishes your session the moment it lands, the reset form only appears when a real session exists, and every reset email you'd already received still works too.
- Every auth email failure now says what actually happened instead of a raw code: reset, verification, and email-change links that were already used, replaced by a newer request, or past their expiry show a plain-English card explaining that links work exactly once, with a one-click "Request a new reset link" (or "Resend" for verification emails). The emails themselves now state the single-use rule up front, so "expires in 1 hour" finally matches reality.
- Email-change confirmations got the same surgery: clicking "Confirm New Email" used to land on the login page with a sign-in error even when the change succeeded. It now confirms the address, signs you straight in, and tells you the update happened. Dead signup-verification links can no longer show a false "Email verified!" success either; the real failure wins, with a resend option right in the message.
- v1.5.3
The Performance report actually shows your pages now
- The Page Performance report had a silent bug since launch: it fetched your data correctly, then handed it to the table in the wrong shape, so the tab rendered permanently empty (headers, zero rows) no matter how much analytics you had. It now lists every tracked page with views, visitors, average read time, reactions, retention, engagement + quality scores, and its recommended next action. And when the report can't load, you get a visible error with a Retry button; never an empty table pretending to be "no data".
- Every chart in the app (traffic overview, realtime visitor flow, all five trend reports, and the device-type breakdown) now renders through one shared, theme-aware chart component (the shadcn/ui Chart wrapper over Recharts). Consistent tooltips with formatted values, smooth entry animations on every fresh view, and colors that follow your light/dark theme automatically. The week-time activity heatmap gained a soft staggered fade-in as well.
- Also fixed along the way: with a comparison period selected, the traffic chart showed its "vs previous" badge but never drew the dashed previous-period lines (a chart-library child-scanning quirk with wrapped groups). The comparison curves (and their entries in the tooltip) now render for real, on the traffic chart and every trend report.
- v1.5.2
The founder deal now follows you through sign-up, and it's on fire
- Clicking "Claim founder deal" while signed out no longer loses you after account creation: you're sent to sign up (a banner reassures you the deal is saved), and after signing in (Google or email, including the email-verification round trip) you land straight back on the deal with the one-time checkout already resuming. No more hunting for the banner you clicked five minutes ago.
- The founder banner now wears an animated fire ring: a warm comet of amber, orange, and ember light orbiting the card border with a soft glow, instantly signaling "limited deal, look here" while staying subtle enough for a professional page (and completely still for visitors who prefer reduced motion). When the deal sells out, the ring goes quiet with it.
- v1.5.1
One delete button per workspace, and trials that can't be flip-flopped
- Deleting a workspace now has exactly one entry point: the "Delete workspace…" item in the sidebar's workspace dropdown. The per-row trash icons on every workspace row (dropdown and Integrations page) are gone: same typed-confirmation safety, one obvious button instead of duplicates.
- Plan changes during a free trial are now capped at three per trial. Switching Starter ↔ Pro (or monthly ↔ yearly) stays instant, card-free, and (verified against Stripe's current subscription-update behavior) completely invoice-free, since a trial swap only re-points the price the trial-end invoice will bill. The cap simply stops rapid flip-flopping from churning subscription events: past three switches your current plan rides out the trial, and changes reopen the moment it converts (or you cancel via "Manage Billing").
- The billing checkout endpoint is rate-limited (12 requests per 10 minutes per account), so scripted plan-switch spam hits a calm 429 instead of Stripe; complementing both the switch cap and the existing one-trial-per-customer guard.
- v1.5.0
Delete a workspace for real, and switch plans mid-trial in one click
- Workspaces can now be permanently deleted: a trash button on every workspace row in the sidebar's workspace dropdown and the Integrations page opens a typed-confirmation dialog that removes the workspace and everything it owns (pages, analytics history, engagement time, reactions, and per-page widget settings) straight from the database. Shared team workspaces stay owner-only (members never see a delete button), your account, plan, and billing are untouched, and deleting a workspace frees its plan slot immediately on every plan (Free, Starter, Pro, Founder).
- Disconnect vs. delete is now a real choice: Disconnect still keeps all data and just pauses the Notion connection; Delete is clearly labeled as the irreversible path, with the plan-level "what this means for your subscription" spelled out before you confirm.
- Switching plans during a free trial is instant: a trialing user who picks a different plan (Starter ↔ Pro, or monthly ↔ yearly) gets their subscription's price swapped in place: same trial end date, no card required, and the trial-end invoice simply charges the new plan. No more dead end at the billing portal's "Cancel subscription" button when you just wanted the cheaper plan.
- The Stripe billing portal now offers "Change plan": plan switches with proration for paid subscriptions, configured automatically by the app (you'll see it in Stripe as the "Notion Analytics (default)" portal configuration). If the configuration can't be created for any reason, the portal falls back to exactly its previous behavior; the enhancement never becomes a dependency.
- Mid-trial upgrades no longer risk double billing: previously an upgrade during a trial created a second subscription that would also charge at trial end; the in-place price swap keeps exactly one subscription per customer.
- v1.4.0
Team invites actually work now: log in and you're in
- Team invites are real: clicking "Accept Invitation" in the invite email and logging in IS the acceptance; the invited member's dashboard immediately shows the shared workspace (labeled with their role), its pages, analytics, realtime feed, and reports. Signing in proves ownership of the invited email, so there is no extra step to forget.
- Members inherit the team: the shared workspace's analytics unlock at the team owner's plan level (a Pro team's Free-plan members see the full history window and geo/device reports for the shared data, never paywalled mid-team), and the workspace picker, Pages view, and Integrations view all label shared workspaces with the member's role.
- Roles are enforced on the server, not just hidden in the UI: viewers get a clear read-only state everywhere (the track/untrack buttons explain it, and the API answers 403), editors and admins can track, untrack, and sync the owner's pages, and the workspace connection, billing, and the member list always stay owner-only.
- The owner's Team Members list now tells the truth: "Invited" until the member first signs in, a live relative-time "last active" afterwards, and the member's real profile name once they have an account. Removing a member revokes their access immediately.
- The footer email signup is verified end-to-end: every subscription is stored in the waitlist table in your Supabase project (source-tagged "footer"), duplicates are handled gracefully, and invalid addresses are rejected.
- Email notification toggles now provably gate the emails they describe: milestone alerts and the weekly report only ever send to users who left the matching toggle on; verified behaviorally, not just persisted.
- v1.3.0
Exact metrics, custom date ranges, and a workspace sync that never lies
- Custom date ranges: pick any start and end date from the calendar (Starter+), with outside-month days clickable, backend-validated ranges on every analytics route, and compare support.
- Pageview and visitor counting now follow the GA4/Plausible model exactly: every real page load counts (reloads, second browser profiles, return visits), unique visitors stay deduped, and a 30-second double-fire guard stops embed re-mounts from inflating counts; refreshes move views, never visitors.
- Device detection went universal: the full industry parser matrix (iOS Chrome/Firefox, Android Edge, Samsung Internet, Yandex, Opera, in-app social browsers), Android tablets and iPads classified correctly, and iPadOS-13+ Safari's desktop-mode UA corrected client-side so Devices and OS reports stay exact on every device, including the iPads that GA4, Plausible, and Matomo all miscount as Desktop.
- Realtime now tells the truth in every edge case: multi-tab visits count once with full engagement, long readers stay in the live feed while their heartbeats flow, and every dashboard view refreshes itself every 30 seconds while its tab is focused.
- Workspace tracking sync was rebuilt around one rule: the dashboard only changes tracking state on positive confirmation. Disconnecting a workspace now provably preserves every page, tracked flag, and widget; reconnecting restores everything exactly; a page Notion can't see (deleted or unshared; the API can't tell them apart) is flagged for your attention instead of being silently untracked; a page whose widget went missing is healed automatically on the next sync; and if tracking can't place the widget on the page, you get an honest warning with the fix; never a silent success.
- The page list is now a live inventory with no sync button to think about: new pages you share with the integration appear automatically: when you connect, whenever you open the Pages view, and the moment you return to the dashboard tab from Notion (the only place sharing can change). The syncs are silent when nothing changed and say exactly what happened when something did, including workspaces with more than 100 pages, which previously truncated silently.
- v1.2.1
Perfectly proportioned branding on every screen
- The NotionAnalytics.app wordmark now scales through a single responsive sizing system; it renders noticeably larger on phones (where it previously shrank too small) and keeps perfect proportions on tablets and desktops, in the site header, footer, sidebar, and every auth screen.
- The dashboard sidebar logo is now sized to fit every sidebar width cleanly (no more touching the edges on desktop) and stays one consistent size across the mobile drawer and desktop sidebar.
- Accessibility polish across the app: dropdown triggers now announce their open state to screen readers, the pricing Monthly/Yearly toggle and the Settings tabs expose proper toggle/tab semantics, and every logo button has a consistent focus ring and accessible label.
- SEO fixes: the About, Contact, Blog, and Changelog pages now use a proper top-level heading, and every page's brand name is derived from a single source of truth so a future rebrand can never leave stale names behind.
- The footer is now one shared component across the homepage and all secondary pages (it previously drifted; the homepage was missing the RSS link), and dependency/config dead weight was trimmed for a leaner deploy.
- v1.2.0
Faster, leaner, and built to scale
- The Pages view now reads pre-aggregated per-page statistics: one small query per page instead of scanning every recorded view, so the dashboard stays instant no matter how much traffic your pages accumulate.
- Plan history windows are now enforced automatically: analytics events older than your plan's window (7 days on Free, 30 days on Starter, unlimited on Pro) are cleaned up weekly, exactly as described in our privacy policy. Pro accounts are never touched, and public reaction counts are never affected.
- Checkout buttons now show a busy state while a plan change is in flight, so a double-click can never open two Stripe sessions.
- Security and account emails (password resets, address changes, team invites) are now guaranteed to be delivered even when a server pauses immediately after responding.
- Engagement heartbeats run at a 15-second cadence (industry-standard, the same approach Google Analytics uses), cutting infrastructure load by a third while keeping engagement time just as accurate.
- v1.1.0
“Last used” sign-in method memory
- The login and sign-up pages now remember which method you last signed in with on this device and pin a “Last used” label right on that sign-in option, the same pattern used by professional login pages like Vercel and GitHub. Hover the label to see exactly when.
- The hint is always real: it is recorded only after a sign-in actually succeeds (email login, Google OAuth callback, or password-reset link), never optimistically on button click.
- Future-proof by design: the method id comes straight from your auth provider's own metadata, so any login method added later (GitHub, Apple, …) gets the same treatment with zero extra code.
- Returning email users land with the email field pre-focused for one less click.