Skip to content

[PM-40167] feat: Update billing domain email copy - #8203

Draft
cyprain-okeke wants to merge 2 commits into
mainfrom
billing/pm-40167/server-emails-billing-domain-license-subscription-seats-sponsorship-billing
Draft

[PM-40167] feat: Update billing domain email copy#8203
cyprain-okeke wants to merge 2 commits into
mainfrom
billing/pm-40167/server-emails-billing-domain-license-subscription-seats-sponsorship-billing

Conversation

@cyprain-okeke

Copy link
Copy Markdown
Contributor

🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-40167

📔 Objective

Refreshes subject lines and body copy for nine billing-domain emails (HTML + text variants) per the PM-38898 terminology epic:

  • LicenseExpired — subject only ("License expired")
  • OrganizationSeatsMaxReached / OrganizationSmSeatsMaxReached / OrganizationSmServiceAccountsMaxReached — lowercased subjects; body now leads with the organization name (added OrganizationName to the view models via CoreHelpers.SanitizeForEmail)
  • Provider/ProviderUpdatePaymentMethod — "Your Bitwarden organization…" copy and Admin Console navigation wording
  • FamiliesForEnterprise offer (new + existing account), sponsorship reverting, and removed-from-family emails — "Sponsored Families Plan" terminology, updated subjects and body copy

Additional changes riding along:

  • Removed the now-unused offerAcceptanceDate parameter from SendFamiliesForEnterpriseRemoveSponsorshipsEmailAsync (interface, both implementations, caller, tests)
  • Sponsor org name in offer emails now passes through CoreHelpers.SanitizeForEmail, matching the sibling sponsorship-removal email
  • Fixed the sponsorship-reverting text template referencing a nonexistent {{Date}} property (previously rendered a blank date); both variants now use {{date ExpirationDate 'MMMM dd, yyyy'}}
  • Unit tests added for all changed emails, rendering the real embedded templates and asserting subjects, body copy (HTML + text), retained CTA links/disclaimers, and date formatting

Notes for reviewers:

  • The ticket description still says the copy is gated behind the vfo1-foundation flag as duplicate V2 templates — that's stale. Nick Krantz confirmed the copy ships in-place with no flag; the ticket AC predates that decision.
  • The removed-sponsorship email keeps the "Or click the following link: {subscription URL}" line per the ticket's copy spec. In the HTML variant this renders the raw URL as visible link text (previously anchored behind "Subscription page") and the "Or" no longer has an antecedent — flagged to product as a copy-deck question rather than deviating from the specified copy here.

Refreshes subject lines and body copy for nine billing emails
(license, seat limits, provider payment method, and Families for
Enterprise sponsorship) per the PM-38898 terminology epic. Copy
ships in-place with no feature flag per product decision.

Also removes the unused offerAcceptanceDate parameter from
SendFamiliesForEnterpriseRemoveSponsorshipsEmailAsync, sanitizes
the sponsor org name in offer emails, and fixes the sponsorship
reverting text template referencing a nonexistent {{Date}} property.
@cyprain-okeke cyprain-okeke added the ai-review Request a Claude code review label Aug 13, 2026
@github-actions github-actions Bot added the platform-community Touches a Platform-stewarded area with limited team familiarity label Aug 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

ℹ️ Limited Platform familiarity

This PR touches a platform-community area. The Platform team owns this code but does not actively develop it, so a Platform review here may be less authoritative than usual.

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

🤖 Bitwarden Claude Code Review

Overall Assessment: APPROVE

Reviewed copy updates across nine billing-domain email templates (HTML + text), the accompanying view model additions (OrganizationName on the seat/machine-account models), subject line changes in HandlebarsMailService, and the removal of the offerAcceptanceDate parameter from SendFamiliesForEnterpriseRemoveSponsorshipsEmailAsync. Verified that the signature change is propagated to both IMailService implementations (HandlebarsMailService, NoopMailService) and the only caller, that no stale references to OfferAcceptanceDate or the old {{Date}} property remain, and that {{date ExpirationDate 'MMMM dd, yyyy'}} and {{{link SubscriptionUrl true}}} match the registered Handlebars helper signatures and existing template conventions. New view model values are passed through CoreHelpers.SanitizeForEmail and rendered with escaping stashes, consistent with sibling templates. No security, correctness, or breaking-change issues were identified.

Code Review Details

No findings at or above the reporting threshold.

Notes considered and intentionally not raised as findings:

  • The dangling "Or click the following link:" line in FamiliesForEnterpriseRemovedFromFamilyUser (both variants) is already documented in the PR description as a copy-deck question raised with product.
  • FreeFamiliesForEnterprisePolicyEventHandler passes OrganizationSponsorship.FriendlyName into the email parameter — pre-existing behavior untouched by this change.

…n-license-subscription-seats-sponsorship-billing
@cyprain-okeke cyprain-okeke added the t:feature Change Type - Feature Development label Aug 13, 2026
@codecov

codecov Bot commented Aug 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 63.28%. Comparing base (d9325ae) to head (9c3b3b1).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #8203      +/-   ##
==========================================
+ Coverage   63.17%   63.28%   +0.11%     
==========================================
  Files        2381     2381              
  Lines      103771   103773       +2     
  Branches     9394     9394              
==========================================
+ Hits        65559    65675     +116     
+ Misses      35981    35864     -117     
- Partials     2231     2234       +3     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-review Request a Claude code review platform-community Touches a Platform-stewarded area with limited team familiarity t:feature Change Type - Feature Development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant