diff --git a/CHANGELOG.md b/CHANGELOG.md
index 145157a..dcf72d3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,18 @@ and this project follows [Semantic Versioning](https://semver.org/).
## [Unreleased]
+## [1.31.0] - 2026-10-22
+
+### Added
+
+- The registration funnel's traffic source works without tagged links: visits from Facebook, Instagram, Google, X, LinkedIn and other sites are recognised from where the visitor came from (and Facebook's/Google's click ids). Links without a tag used to count as "direct". WhatsApp still only shows from tagged links (`?utm_source=whatsapp`), since it doesn't pass that on.
+- The event page's Share button shares the link tagged `?utm_source=share`, and Save QR encodes it tagged `?utm_source=qr`, so those visits show separately.
+- Event pages tell search engines about the event in Google's event format (schema.org `Event`): name, dates, venue, picture, organiser, ticket prices in Rand and whether it's sold out. Google can then show events with their date, venue and ticket link in search results and in its event listings. Contact-only events are listed without tickets.
+
+### Changed
+
+- Event pages, the events list and the home page tell search engines their one official address, so `?utm_source=…`, `?src=…` and alias links all count towards the same page in search rankings. Shared event links also carry the event's address.
+
## [1.30.1] - 2026-10-22
### Changed
diff --git a/frontend/src/app/events/[id]/ClientActions.tsx b/frontend/src/app/events/[id]/ClientActions.tsx
index 89649b3..a701d0b 100644
--- a/frontend/src/app/events/[id]/ClientActions.tsx
+++ b/frontend/src/app/events/[id]/ClientActions.tsx
@@ -6,6 +6,12 @@ import { API_BASE } from "@/lib/api";
type Props = { event: { id: string; title: string; description?: string | null } };
+// The event's own address tagged with where the link was handed out, so visits from it
+// show under that source in the funnel report (the page's canonical drops the tag for SEO).
+function taggedEventUrl(source: string): string {
+ return `${window.location.origin}${window.location.pathname}?utm_source=${source}`;
+}
+
export default function ClientActions({ event }: Props) {
return (