blob: 16ad637a455524c8fd664068f572e74d0dd8bdee [file] [view]
# Slack Link Attribution (UTM Convention)
`https://doris.apache.org/slack` is the only Slack link we publish. It is a
small tracking page (`src/pages/slack.tsx`) that records the click in the ASF
Matomo instance and then forwards the visitor to the real invite link kept in
`docusaurus.config.js` under `customFields.slackInviteUrl`. When the invite
link is rotated, change it there and nothing else.
Russian community entry points use `https://doris.apache.org/telegram` with
the same UTM parameters and redirect behavior. Its destination is configured
once in `customFields.telegramInviteUrl` in `docusaurus.config.js`. Change
that field when the Telegram link changes. These clicks use the same
`Community Acquisition` category with the separate action `Telegram Click`.
Locale-aware components use `buildCommunityEntryUrl()` so Russian visitors
reach Telegram and other locales continue to use Slack.
Every channel keeps linking to `/slack`; what differs per channel is the UTM
query string. Use these four standard parameters and nothing else:
| Parameter | Question it answers | Allowed values |
|---|---|---|
| `utm_source` | Where does the visitor come from? | `website`, `github`, `linkedin`, `reddit`, `youtube`, `medium`, `newsletter`, `webinar`, `conference`, `partner`, or a specific organiser such as `awsug` |
| `utm_medium` | What kind of traffic is it? | `website`, `docs`, `social`, `community`, `content`, `event`, `offline`, `email` |
| `utm_campaign` | Which campaign? (optional for permanent entry points) | e.g. `doris_summit_2026`, `iceberg_webinar_202609`, `release_4_1` |
| `utm_content` | Which exact CTA / placement? | e.g. `homepage_hero`, `footer`, `docs_toc`, `github_readme`, `post_01`, `closing_slide`, `qr_code` |
Value rules (the page enforces them, but write links this way so reports stay
clean):
- lowercase ASCII letters, digits, `.`, `_`, `-`; anything else becomes `_`
- at most 64 characters per value
- never use `|`, it is the field separator in the Matomo event name
## Examples
```text
Website header https://doris.apache.org/slack?utm_source=website&utm_medium=website&utm_content=homepage_hero
Website footer https://doris.apache.org/slack?utm_source=website&utm_medium=website&utm_content=footer
Docs TOC https://doris.apache.org/slack?utm_source=website&utm_medium=docs&utm_content=docs_toc
GitHub README https://doris.apache.org/slack?utm_source=github&utm_medium=community&utm_content=github_readme
LinkedIn post https://doris.apache.org/slack?utm_source=linkedin&utm_medium=social&utm_campaign=community_growth_h2_2026&utm_content=post_01
Webinar https://doris.apache.org/slack?utm_source=webinar&utm_medium=event&utm_campaign=iceberg_webinar_202609
Conference QR code https://doris.apache.org/slack?utm_source=awsug&utm_medium=offline&utm_campaign=awsug_uzbekistan_2026&utm_content=closing_slide
```
Links rendered by the website itself are generated with
`buildSlackEntryUrl()` from `src/components/slack-redirect/slack-attribution.logic.js`;
do not hand-write them in React code.
Markdown content on the site uses these fixed values:
| Where | `utm_medium` | `utm_content` |
|---|---|---|
| Blog posts (`blog/`) | `content` | `blog_<file-name-in-lowercase>`, cut to 64 characters |
| Community docs (`community/`) | `docs` | `community_join_page`, `contribute_guide` |
| Release notes (`releasenotes/`) | `docs` | `release_notes_<version>`, e.g. `release_notes_3_0_0` |
Never link to `join.slack.com` directly from content: the invite link
rotates, and a direct link skips the tracking page entirely.
## What the page records
One Matomo event per click:
```text
Category: Community Acquisition
Action: Slack Click
Name: source|medium|campaign|content
```
Attribution priority is `utm_source` > `document.referrer` > direct:
| Situation | Event name |
|---|---|
| UTM present | `github\|community\|\|github_readme` |
| No `utm_source`, referrer available | `reddit.com\|referral\|\|` (host without `www.`) |
| Neither | `direct\|none\|\|` |
Empty fields stay empty (`github|||` means the link only carried
`utm_source=github`). Matomo also stores the full page URL and the referrer
with the automatic page view, so the Referrers report can be used to discover
sites that link to `/slack` without any UTM.
Note that links rendered inside doris.apache.org use `rel="noreferrer"`, so a
click from our own pages without UTM shows up as `direct`. That is why every
in-site entry point carries UTM parameters.
## Reading the numbers
In Matomo (`https://analytics.apache.org/`, site id 43):
1. Behaviour → Events → Event Names, category `Community Acquisition`.
2. Split the name on `|` to aggregate by source, medium, campaign or content.
3. Compare daily unique clicks with new Slack members for a rough
click-to-join rate.
Clicks are not joins: once the visitor lands on `join.slack.com` we cannot see
whether they completed the sign-up, so only aggregate trends are meaningful.
## Timing
The page queues the event in `_paq` immediately and redirects from the
event's callback, i.e. as soon as matomo.js has handed the request to
`navigator.sendBeacon`. matomo.js sends its automatic page view first and
holds later requests for 800ms, so with the tracker present the redirect
happens roughly 0.9s after the page has rendered.
While matomo.js is still downloading the page waits up to 1.5s for it; if the
script fetch already failed (ad blocker, 404) or no tracker is installed
(development builds) it redirects at once - Resource Timing is used to tell
the two apart. A hard cap of 2.5s applies in every case. Browsers without
JavaScript are forwarded by a `<noscript>` meta refresh. The constants live at
the top of `src/components/slack-redirect/SlackRedirect.tsx`.