Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PM-15814]Alert owners of reseller-managed orgs to renewal events #12607

Conversation

cyprain-okeke
Copy link
Contributor

@cyprain-okeke cyprain-okeke commented Dec 27, 2024

🎟️ Tracking

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

📔 Objective

Organizations that are managed by a reseller have a higher probability of churning. This happens because of a breakdown in communication around renewal dates.

the managed org does not have visibility into when their renewal date is, because their billing is managed by the reseller. Without knowing their renewal date, the managed org cannot issue a purchase order to their reseller.

the reseller does not respond to invoices from Bitwarden because they do not include a purchase order number matching one from a customer of theirs (the managed org).

the first indication the managed org has that something has gone wrong is when the organization is suspended. This happens 30 days after the automatic invoice we send to the reseller is marked as unpaid, which is usually 45 days after it was issued (resellers get net-45 by default).

To help prevent this issue, we will show in-product messaging to owners of reseller-managed organizations, alerting them that their renewal date is upcoming, and to reach out to their reseller to insure uninterrupted service.

📸 Screenshots

Screenshot 2024-12-27 at 18 24 16 Screenshot 2024-12-27 at 22 21 32 Screenshot 2024-12-30 at 15 37 22

⏰ Reminders before review

  • Contributor guidelines followed
  • All formatters and local linters executed and passed
  • Written new unit and / or integration tests where applicable
  • Protected functional changes with optionality (feature flags)
  • Used internationalization (i18n) for all UI strings
  • CI builds passed
  • Communicated to DevOps any deployment requirements
  • Updated any necessary documentation (Confluence, contributing docs) or informed the documentation team

🦮 Reviewer guidelines

  • 👍 (:+1:) or similar for great changes
  • 📝 (:memo:) or ℹ️ (:information_source:) for notes or general info
  • ❓ (:question:) for questions
  • 🤔 (:thinking:) or 💭 (:thought_balloon:) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion
  • 🎨 (:art:) for suggestions / improvements
  • ❌ (:x:) or ⚠️ (:warning:) for more significant problems or concerns needing attention
  • 🌱 (:seedling:) or ♻️ (:recycle:) for future improvements or indications of technical debt
  • ⛏ (:pick:) for minor or nitpick changes

@cyprain-okeke cyprain-okeke requested review from a team as code owners December 27, 2024 21:22
Copy link
Contributor

github-actions bot commented Dec 27, 2024

Logo
Checkmarx One – Scan Summary & Detailsab63b66e-d868-4026-b06d-9e14f4c208f5

Fixed Issues

Severity Issue Source File / Package
MEDIUM Client_Privacy_Violation /apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html: 15

Copy link

codecov bot commented Dec 30, 2024

Codecov Report

Attention: Patch coverage is 1.58730% with 62 lines in your changes missing coverage. Please review.

Project coverage is 33.76%. Comparing base (03d0957) to head (05e0d3b).
Report is 1 commits behind head on main.

✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
...c/app/billing/services/reseller-warning.service.ts 0.00% 49 Missing ⚠️
...pps/web/src/app/vault/org-vault/vault.component.ts 0.00% 8 Missing ⚠️
...response/organization-billing-metadata.response.ts 0.00% 5 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #12607      +/-   ##
==========================================
- Coverage   33.79%   33.76%   -0.04%     
==========================================
  Files        2911     2912       +1     
  Lines       90718    90781      +63     
  Branches    17155    17173      +18     
==========================================
- Hits        30655    30649       -6     
- Misses      57674    57743      +69     
  Partials     2389     2389              

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

@micahblut
Copy link
Member

@cyprain-okeke are the date formats localized? MM/DD/YYYY is not used in most places.

cyprain-okeke and others added 3 commits December 30, 2024 15:18
…rs-of-reseller-managed-orgs-to-renewal-events' into pm-15814-alert-owners-of-reseller-managed-orgs-to-renewal-events
Copy link
Contributor

@Jingo88 Jingo88 left a comment

Choose a reason for hiding this comment

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

Looks good. just a small nit

@@ -592,6 +599,7 @@ export class VaultComponent implements OnInit, OnDestroy {
.subscribe();

this.unpaidSubscriptionDialog$.pipe(takeUntil(this.destroy$)).subscribe();
//this.resellerWarning1$.pipe(takeUntil(this.destroy$)).subscribe();
Copy link
Contributor

Choose a reason for hiding this comment

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

This looks like leftover commented out code, okay to remove?

Jingo88
Jingo88 previously approved these changes Dec 31, 2024
Copy link
Member

@gbubemismith gbubemismith left a comment

Choose a reason for hiding this comment

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

Just some small changes needed

@@ -187,6 +191,8 @@ export class VaultComponent implements OnInit, OnDestroy {
private hasSubscription$ = new BehaviorSubject<boolean>(false);
protected currentSearchText$: Observable<string>;
protected freeTrial$: Observable<FreeTrial>;
protected resellerWarning$: Observable<ResellerWarning | null>;
protected resellerWarning: ResellerWarning;
Copy link
Member

Choose a reason for hiding this comment

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

I don't think this variable is used anywhere

@@ -592,6 +599,7 @@ export class VaultComponent implements OnInit, OnDestroy {
.subscribe();

this.unpaidSubscriptionDialog$.pipe(takeUntil(this.destroy$)).subscribe();
//this.resellerWarning1$.pipe(takeUntil(this.destroy$)).subscribe();
Copy link
Member

Choose a reason for hiding this comment

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

This should be removed if it's not needed anymore

@@ -612,6 +619,16 @@ export class VaultComponent implements OnInit, OnDestroy {
}),
);

this.resellerWarning$ = combineLatest([organization$]).pipe(
Copy link
Member

Choose a reason for hiding this comment

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

I think we only need combineLatest when we have multiple independent streams. This can be simplified a bit

Suggested change
this.resellerWarning$ = combineLatest([organization$]).pipe(
this.resellerWarning$ = organization$.pipe(
filter(org => org.isOwner),
switchMap(org => this.billingApiService
.getOrganizationBillingMetadata(org.id)
.pipe(map(metadata => ({org, metadata})))
),
map()

gbubemismith
gbubemismith previously approved these changes Dec 31, 2024
Jingo88
Jingo88 previously approved these changes Dec 31, 2024
@cyprain-okeke cyprain-okeke removed the request for review from Jingo88 December 31, 2024 17:05
@cyprain-okeke cyprain-okeke merged commit 899b169 into main Dec 31, 2024
66 checks passed
@cyprain-okeke cyprain-okeke deleted the pm-15814-alert-owners-of-reseller-managed-orgs-to-renewal-events branch December 31, 2024 17:06
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.

5 participants