[PM-30697] [PM-30698] Renewal email copy updates (#6875)

* feat(families-renewal): Update copy

* feat(premium-renewal): Add new var, update copy
This commit is contained in:
Alex Morask
2026-01-21 11:52:36 -06:00
committed by GitHub
parent 7fb2822e05
commit 75a857055e
9 changed files with 16 additions and 16 deletions

View File

@@ -627,7 +627,7 @@ public class UpcomingInvoiceHandler(
{ {
BaseMonthlyRenewalPrice = (premiumPlan.Seat.Price / 12).ToString("C", new CultureInfo("en-US")), BaseMonthlyRenewalPrice = (premiumPlan.Seat.Price / 12).ToString("C", new CultureInfo("en-US")),
DiscountAmount = $"{coupon.PercentOff}%", DiscountAmount = $"{coupon.PercentOff}%",
DiscountedMonthlyRenewalPrice = (discountedAnnualRenewalPrice / 12).ToString("C", new CultureInfo("en-US")) DiscountedAnnualRenewalPrice = discountedAnnualRenewalPrice.ToString("C", new CultureInfo("en-US"))
} }
}; };

View File

@@ -18,8 +18,8 @@
at {{BaseAnnualRenewalPrice}} + tax. at {{BaseAnnualRenewalPrice}} + tax.
</mj-text> </mj-text>
<mj-text font-size="16px" line-height="24px" padding="10px 15px 15px 15px"> <mj-text font-size="16px" line-height="24px" padding="10px 15px 15px 15px">
As a long time Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this renewal. As a long time Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this year's renewal.
This year's renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax. This renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax.
</mj-text> </mj-text>
<mj-text font-size="16px" line-height="24px" padding="10px 15px"> <mj-text font-size="16px" line-height="24px" padding="10px 15px">
Questions? Contact Questions? Contact

View File

@@ -17,8 +17,8 @@
Your Bitwarden Premium subscription renews in 15 days. The price is updating to {{BaseMonthlyRenewalPrice}}/month, billed annually. Your Bitwarden Premium subscription renews in 15 days. The price is updating to {{BaseMonthlyRenewalPrice}}/month, billed annually.
</mj-text> </mj-text>
<mj-text font-size="16px" line-height="24px" padding="10px 15px 15px 15px"> <mj-text font-size="16px" line-height="24px" padding="10px 15px 15px 15px">
As an existing Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this renewal. As an existing Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this year's renewal.
This year's renewal now will be {{DiscountedMonthlyRenewalPrice}}/month, billed annually. This renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax.
</mj-text> </mj-text>
<mj-text font-size="16px" line-height="24px" padding="10px 15px"> <mj-text font-size="16px" line-height="24px" padding="10px 15px">
Questions? Contact Questions? Contact

View File

@@ -202,8 +202,8 @@
<tr> <tr>
<td align="left" style="font-size:0px;padding:10px 15px 15px 15px;word-break:break-word;"> <td align="left" style="font-size:0px;padding:10px 15px 15px 15px;word-break:break-word;">
<div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;line-height:24px;text-align:left;color:#1B2029;">As a long time Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this renewal. <div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;line-height:24px;text-align:left;color:#1B2029;">As a long time Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this year's renewal.
This year's renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax.</div> This renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax.</div>
</td> </td>
</tr> </tr>

View File

@@ -1,7 +1,7 @@
Your Bitwarden Families subscription renews in 15 days. The price is updating to {{BaseMonthlyRenewalPrice}}/month, billed annually Your Bitwarden Families subscription renews in 15 days. The price is updating to {{BaseMonthlyRenewalPrice}}/month, billed annually
at {{BaseAnnualRenewalPrice}} + tax. at {{BaseAnnualRenewalPrice}} + tax.
As a long time Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this renewal. As a long time Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this year's renewal.
This year's renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax. This renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax.
Questions? Contact support@bitwarden.com Questions? Contact support@bitwarden.com

View File

@@ -5,7 +5,7 @@ namespace Bit.Core.Models.Mail.Billing.Renewal.Premium;
public class PremiumRenewalMailView : BaseMailView public class PremiumRenewalMailView : BaseMailView
{ {
public required string BaseMonthlyRenewalPrice { get; set; } public required string BaseMonthlyRenewalPrice { get; set; }
public required string DiscountedMonthlyRenewalPrice { get; set; } public required string DiscountedAnnualRenewalPrice { get; set; }
public required string DiscountAmount { get; set; } public required string DiscountAmount { get; set; }
} }

View File

@@ -201,8 +201,8 @@
<tr> <tr>
<td align="left" style="font-size:0px;padding:10px 15px 15px 15px;word-break:break-word;"> <td align="left" style="font-size:0px;padding:10px 15px 15px 15px;word-break:break-word;">
<div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;line-height:24px;text-align:left;color:#1B2029;">As an existing Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this renewal. <div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;line-height:24px;text-align:left;color:#1B2029;">As an existing Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this year's renewal.
This year's renewal now will be {{DiscountedMonthlyRenewalPrice}}/month, billed annually.</div> This renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax.</div>
</td> </td>
</tr> </tr>

View File

@@ -1,6 +1,6 @@
Your Bitwarden Premium subscription renews in 15 days. The price is updating to {{BaseMonthlyRenewalPrice}}/month, billed annually. Your Bitwarden Premium subscription renews in 15 days. The price is updating to {{BaseMonthlyRenewalPrice}}/month, billed annually.
As an existing Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this renewal. As an existing Bitwarden customer, you will receive a one-time {{DiscountAmount}} loyalty discount for this year's renewal.
This year's renewal now will be {{DiscountedMonthlyRenewalPrice}}/month, billed annually. This renewal will now be billed annually at {{DiscountedAnnualRenewalPrice}} + tax.
Questions? Contact support@bitwarden.com Questions? Contact support@bitwarden.com

View File

@@ -280,7 +280,7 @@ public class UpcomingInvoiceHandlerTests
email.ToEmails.Contains("user@example.com") && email.ToEmails.Contains("user@example.com") &&
email.Subject == "Your Bitwarden Premium renewal is updating" && email.Subject == "Your Bitwarden Premium renewal is updating" &&
email.View.BaseMonthlyRenewalPrice == (plan.Seat.Price / 12).ToString("C", new CultureInfo("en-US")) && email.View.BaseMonthlyRenewalPrice == (plan.Seat.Price / 12).ToString("C", new CultureInfo("en-US")) &&
email.View.DiscountedMonthlyRenewalPrice == (discountedPrice / 12).ToString("C", new CultureInfo("en-US")) && email.View.DiscountedAnnualRenewalPrice == discountedPrice.ToString("C", new CultureInfo("en-US")) &&
email.View.DiscountAmount == $"{coupon.PercentOff}%" email.View.DiscountAmount == $"{coupon.PercentOff}%"
)); ));
} }
@@ -2436,7 +2436,7 @@ public class UpcomingInvoiceHandlerTests
email.Subject == "Your Bitwarden Premium renewal is updating" && email.Subject == "Your Bitwarden Premium renewal is updating" &&
email.View.BaseMonthlyRenewalPrice == (plan.Seat.Price / 12).ToString("C", new CultureInfo("en-US")) && email.View.BaseMonthlyRenewalPrice == (plan.Seat.Price / 12).ToString("C", new CultureInfo("en-US")) &&
email.View.DiscountAmount == "30%" && email.View.DiscountAmount == "30%" &&
email.View.DiscountedMonthlyRenewalPrice == (expectedDiscountedPrice / 12).ToString("C", new CultureInfo("en-US")) email.View.DiscountedAnnualRenewalPrice == expectedDiscountedPrice.ToString("C", new CultureInfo("en-US"))
)); ));
await _mailService.DidNotReceive().SendInvoiceUpcoming( await _mailService.DidNotReceive().SendInvoiceUpcoming(