Skip to content

chore: add UTM parameters to all owned outbound links#4544

Closed
devin-ai-integration[bot] wants to merge 3 commits intomainfrom
chore/1773308822-add-utm-parameters
Closed

chore: add UTM parameters to all owned outbound links#4544
devin-ai-integration[bot] wants to merge 3 commits intomainfrom
chore/1773308822-add-utm-parameters

Conversation

@devin-ai-integration
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration bot commented Mar 12, 2026

Summary

Adds UTM tracking parameters to owned outbound links across the repo so app installs and website traffic can be attributed by source in PostHog. Also documents the UTM convention in the analytics developer docs and handbook so the team can maintain consistency going forward.

18 files changed across 5 areas:

Source utm_source utm_medium Files
GitHub README/CONTRIBUTING github readme, contributing 2
Desktop app (settings, calendar, changelog) app settings, changelog 5
Blog articles (homepage & download CTAs) website blog 8
Docs website docs 1
Analytics docs (convention reference) 2

All links use utm_campaign=organic. UTM params are placed before # fragments where applicable. Homepage URLs are normalized to char.com/ (with trailing slash) to avoid fragmenting analytics data between char.com and char.com/.

Not changed:

  • crates/db-user/assets/ onboarding files — marked READ-ONLY in AGENTS.md; these still use hyprnote.com and lack UTMs (tracked as a known gap in the analytics docs)
  • Blog-to-blog cross-links, Discord links, account management links, OG meta tags, CI config URLs, API endpoints
  • fastrepl/marketing repo (empty, no commits)

Review & Testing Checklist for Human

  • Blog article UTMs on same-site links — blog pages on char.com link to char.com/?utm_source=website&utm_medium=blog&.... These UTMs will override the visitor's original session source in PostHog/GA when they navigate internally. Confirm this is the desired behavior vs. excluding same-origin links from UTM tagging.
  • Verify UTM convention matches your analytics setup — confirm utm_source values (github, app, website) and utm_medium values (readme, settings, blog, etc.) align with how you want to segment in PostHog.
  • Verify analytics doc anchor link — the handbook links to /docs/developers/analytics#utm-parameters-on-owned-links. Confirm the docs framework generates this slug correctly from the ## UTM parameters on owned links heading.
  • Spot-check completeness — grep the repo for any owned outbound char.com links that may have been missed (especially in recently added blog posts or docs).

Suggested test plan: Open the Netlify preview, navigate to the analytics docs page and handbook funnel page, verify the UTM convention tables render correctly, and confirm the cross-link between them resolves.

Notes

  • Onboarding assets in crates/db-user are a known gap — they use legacy hyprnote.com URLs and are read-only, so UTMs + domain migration would need a separate effort
  • The chatgpt-data-retention-policy.mdx article had a trailing   removed by main — this PR preserves that cleanup while adding UTMs to the download link

Link to Devin session: https://app.devin.ai/sessions/34101d26258248b490fe456d66f56073
Requested by: @ComputelessComputer

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@netlify
Copy link
Copy Markdown

netlify bot commented Mar 12, 2026

Deploy Preview for hyprnote-storybook canceled.

Name Link
🔨 Latest commit cb1b659
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote-storybook/deploys/69b2c65c03c9be00092583bd

@netlify
Copy link
Copy Markdown

netlify bot commented Mar 12, 2026

Deploy Preview for hyprnote canceled.

Name Link
🔨 Latest commit 382cc4a
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote/deploys/69d44f4228a7350008b627df

Copy link
Copy Markdown
Contributor Author

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 5 potential issues.

Open in Devin Review

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 Onboarding assets still reference old hyprnote.com domain

Both crates/db-user/assets/onboarding-raw.html and crates/db-user/assets/thank-you.md link to hyprnote.com and docs.hyprnote.com rather than the current char.com domain. The PR added UTM parameters to these old-domain links but didn't update the domains themselves. If these files are still served to any users (even via the importer), visitors would land on the old domain. Whether UTM parameters survive a domain redirect depends on server configuration — they may be silently dropped, making the tracking ineffective. This is separate from the read-only rule violation; even if the files were editable, the UTMs on the wrong domain would be a concern.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +20 to +24
href="https://hyprnote.com/discord?utm_source=app&utm_medium=onboarding&utm_campaign=organic">https://hyprnote.com/discord</a></p>
</li>
<li>
<p>Official Docs: <a target="_blank" rel="noopener noreferrer nofollow"
href="https://docs.hyprnote.com">https://docs.hyprnote.com</a></p>
href="https://docs.hyprnote.com?utm_source=app&utm_medium=onboarding&utm_campaign=organic">https://docs.hyprnote.com</a></p>
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Modification of READ-ONLY crates/db-user asset (onboarding-raw.html)

crates/db-user/AGENTS.md explicitly states: "crates/db-user is legacy and READ-ONLY." This PR modifies crates/db-user/assets/onboarding-raw.html to add UTM parameters, violating the mandatory read-only rule. Additionally, the UTMs are applied to hyprnote.com links (the old domain), not char.com links as specified by the UTM convention documented in apps/web/content/docs/developers/12.analytics.mdx:129 ("All owned outbound links that drive traffic to char.com carry UTM parameters"), making these UTMs ineffective for the stated tracking purpose.

Prompt for agents
The crates/db-user/AGENTS.md rule states this crate is legacy and READ-ONLY. These changes should be reverted. If UTM tracking is needed for onboarding links, the links should be updated in whatever non-legacy location currently serves onboarding content to users (and should point to char.com, not hyprnote.com).
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread crates/db-user/assets/thank-you.md Outdated
Comment on lines +10 to +13
**In the meantime...** why don't you check out [docs](https://docs.hyprnote.com/using-hyprnote/getting-started?utm_source=app&utm_medium=onboarding&utm_campaign=organic) or [blog](https://hyprnote.com/blog?utm_source=app&utm_medium=onboarding&utm_campaign=organic) for a better understanding of the service. We also have @[Onboarding Video](note:df1d8c52-6d9d-4471-aff1-5dbd35899cbe) for you to get started.
<br/>

Also, please [join our Discord](https://hyprnote.com/discord)! We really want to hear from you.
Also, please [join our Discord](https://hyprnote.com/discord?utm_source=app&utm_medium=onboarding&utm_campaign=organic)! We really want to hear from you.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Modification of READ-ONLY crates/db-user asset (thank-you.md)

crates/db-user/AGENTS.md explicitly states: "crates/db-user is legacy and READ-ONLY." This PR modifies crates/db-user/assets/thank-you.md to add UTM parameters, violating the mandatory read-only rule. The UTMs are also applied to hyprnote.com/docs.hyprnote.com links rather than char.com as the UTM convention requires (apps/web/content/docs/developers/12.analytics.mdx:129).

Prompt for agents
The crates/db-user/AGENTS.md rule states this crate is legacy and READ-ONLY. These changes should be reverted. If UTM tracking is needed for onboarding links, the links should be updated in whatever non-legacy location currently serves onboarding content to users (and should point to char.com, not hyprnote.com).
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

### 1. Char: complete control over your data and AI stack

Most transcription software forces you into their cloud, their servers, their rules. **[Char](https://char.com)** is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack.
Most transcription software forces you into their cloud, their servers, their rules. **[Char](https://char.com?utm_source=website&utm_medium=blog&utm_campaign=organic)** is an open-source AI note-taker that stores your data locally and gives you complete control over the AI stack.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 Inconsistent URL format: char.com?utm_source=... missing trailing slash

Three blog articles link to the bare domain without a trailing slash before the query string: https://char.com?utm_source=website&utm_medium=blog&utm_campaign=organic (in apps/web/content/articles/best-ai-notetakers-google-meet.mdx:33, apps/web/content/articles/meeting-productivity-tools.mdx:34, apps/web/content/articles/meeting-minutes-software.mdx:35). Other articles in the same PR use https://char.com/?utm_source=... with a trailing slash (e.g. apps/web/content/articles/best-ai-notetaker.mdx:62). While browsers and servers handle both forms correctly, the inconsistency could cause PostHog to record two different landing page URLs for the homepage (char.com vs char.com/), fragmenting analytics data. Consider normalizing to https://char.com/?utm_source=... everywhere.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

| GitHub CONTRIBUTING | `github` | `contributing` | `CONTRIBUTING.md` |
| Desktop app settings | `app` | `settings` | `apps/desktop/src/settings/ai/llm/shared.tsx` |
| Desktop app changelog | `app` | `changelog` | `apps/desktop/src/changelog/index.tsx` |
| In-app onboarding | `app` | `onboarding` | `crates/db-user/assets/onboarding-raw.html` |
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 Analytics docs reference the read-only crate as canonical UTM example

The newly added UTM convention table at apps/web/content/docs/developers/12.analytics.mdx:147 lists crates/db-user/assets/onboarding-raw.html as the example file for in-app onboarding UTMs. Since crates/db-user is designated READ-ONLY and legacy, this documentation endorses a pattern that contradicts the crate's own rules. If the onboarding content is served from a different location in production, the docs should reference that location instead.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@netlify
Copy link
Copy Markdown

netlify bot commented Apr 7, 2026

Deploy Preview for char-cli-web canceled.

Name Link
🔨 Latest commit 382cc4a
🔍 Latest deploy log https://app.netlify.com/projects/char-cli-web/deploys/69d44f42dbc6800008858693

devin-ai-integration bot and others added 3 commits April 7, 2026 00:25
Add UTM tracking parameters to owned links across GitHub files,
desktop app, onboarding assets, blog articles, and docs to enable
attribution of app installs and website traffic by source.

Convention:
- utm_source: github | app | website
- utm_medium: readme | contributing | settings | changelog | onboarding | blog | docs
- utm_campaign: organic

Co-Authored-By: John <john@hyprnote.com>
…book

Co-Authored-By: John <john@hyprnote.com>
…ling slash, update analytics docs reference

Co-Authored-By: John <john@hyprnote.com>
@devin-ai-integration devin-ai-integration bot force-pushed the chore/1773308822-add-utm-parameters branch from de66501 to 382cc4a Compare April 7, 2026 00:26
@ComputelessComputer ComputelessComputer deleted the chore/1773308822-add-utm-parameters branch April 11, 2026 03:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant