Skip to content

feat(emails): bulletproof CTA buttons in transactional templates#3920

Merged
PierreBrisorgueil merged 3 commits into
masterfrom
feat/transactional-email-cta
Jun 28, 2026
Merged

feat(emails): bulletproof CTA buttons in transactional templates#3920
PierreBrisorgueil merged 3 commits into
masterfrom
feat/transactional-email-cta

Conversation

@PierreBrisorgueil

Copy link
Copy Markdown
Contributor

Transactional emails printed the action URL as raw inline text (reads as phishing, adds friction). Replace with a bulletproof (table-based, inline-CSS) CTA button + a small fallback 'paste this link' line, across all 5 templates with a bare {{url}}: verify-email, reset-password, signup-invite, org-request-new, org-member-added. Brand-neutral; placeholders intact.

Closes #3917

Replace raw inline action URLs with email-client-safe, table-based
CTA buttons (inline CSS, no external CSS/flexbox) plus a "Button not
working?" fallback link, across verify-email, reset-password-email and
signup-invite. Placeholders and brand-neutral styling preserved.
…r-added templates

Adversarial review found 2 transactional templates with a bare inline {{url}}
left unstyled. Apply the same table-based CTA button + fallback line so all
action-link emails are consistent.

Claude-Session: https://claude.ai/code/session_011zXXYka6vU5utEGoT4frME
Copilot AI review requested due to automatic review settings June 28, 2026 11:43
@coderabbitai

coderabbitai Bot commented Jun 28, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@PierreBrisorgueil, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 28 minutes and 3 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0673c6fa-d428-41b0-baaa-9c53d3d0b10f

📥 Commits

Reviewing files that changed from the base of the PR and between 2689a4d and 0388ef4.

📒 Files selected for processing (11)
  • config/templates/billing-payment-failed.html
  • config/templates/billing-quota-reached-100.html
  • config/templates/billing-quota-warning-80.html
  • config/templates/org-member-added.html
  • config/templates/org-request-approved.html
  • config/templates/org-request-new.html
  • config/templates/org-request-rejected.html
  • config/templates/reset-password-confirm-email.html
  • config/templates/reset-password-email.html
  • config/templates/signup-invite.html
  • config/templates/verify-email.html
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/transactional-email-cta

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates transactional email HTML templates to replace raw inline action URLs with a consistent, table-based CTA button plus a small fallback “Button not working?” link, improving trust and reducing friction for common user actions.

Changes:

  • Replaces plain-text / inline URL instructions with a styled CTA button in 5 transactional templates.
  • Adds a small fallback link line that exposes the URL for copy/paste if the button fails to render.
  • Normalizes some template structure/formatting in the org-related emails while introducing the CTA.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
config/templates/verify-email.html Adds CTA button + fallback link for email verification.
config/templates/signup-invite.html Adds CTA button + fallback link for signup invitation.
config/templates/reset-password-email.html Adds CTA button + fallback link for password reset.
config/templates/org-request-new.html Adds CTA button + fallback link for reviewing org join requests; expands template formatting.
config/templates/org-member-added.html Adds CTA button + fallback link for accepting org invitation; expands template formatting.

Comment thread config/templates/verify-email.html
Comment thread config/templates/signup-invite.html
Comment thread config/templates/reset-password-email.html
Comment thread config/templates/org-request-new.html
Comment thread config/templates/org-member-added.html
@codecov

codecov Bot commented Jun 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.66%. Comparing base (7a26112) to head (0388ef4).
⚠️ Report is 5 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #3920   +/-   ##
=======================================
  Coverage   92.66%   92.66%           
=======================================
  Files         169      169           
  Lines        5535     5535           
  Branches     1778     1778           
=======================================
  Hits         5129     5129           
  Misses        326      326           
  Partials       80       80           
Flag Coverage Δ
integration 61.12% <ø> (ø)
unit 74.23% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.


Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 2689a4d...0388ef4. Read the comment docs.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Adversarial review (Copilot): the target=_blank CTA buttons across all 5
transactional templates need rel=noopener noreferrer to prevent reverse
tabnabbing when opened in a browser from an email client.

Claude-Session: https://claude.ai/code/session_011zXXYka6vU5utEGoT4frME
@PierreBrisorgueil PierreBrisorgueil merged commit 039f553 into master Jun 28, 2026
8 checks passed
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.

🔧 Styled bulletproof CTA button across transactional email templates

2 participants