Skip to content

[Feat] Add self-hosted license purchase entry points - #937

Draft
roomote-roomote[bot] wants to merge 5 commits into
developfrom
feature/self-hosted-license-purchase-0gyjcumvkkxa0
Draft

[Feat] Add self-hosted license purchase entry points#937
roomote-roomote[bot] wants to merge 5 commits into
developfrom
feature/self-hosted-license-purchase-0gyjcumvkkxa0

Conversation

@roomote-roomote

Copy link
Copy Markdown
Contributor

Created by Roomote. Follow up by mentioning @roomote, in the web UI, or in Slack.

What changed

  • Added a persistent Roomote Cloud purchase CTA to the self-hosted License settings, promoted it beside the warning when only one or no seats remain, and tracked clicks with seat and license context.
  • Added a renewal warning for purchased self-hosted keys that expire within 30 days.
  • Extended daily Ping reports with the active license ID and a users-only reporting path for licensed deployments that opt out of anonymous analytics, while keeping full instance statistics behind the existing opt-out and environment gates.
  • Moved deployment license resolution into the shared server data layer so the web app and scheduled worker use the same offline key verification path.
  • Updated public documentation with the Cloud purchase path, annual key refresh, and licensed usage-reporting terms.

Why this change was made

Self-hosted operators need a direct path to purchase and renew licenses without contacting maintainers, and licensed usage needs to reach the shared billing pipeline without turning anonymous analytics back on.

Impact

Self-hosted admins can move from seat-limit warnings to Roomote Cloud purchase, see when purchased keys need refreshing, and keep applying keys through Settings or R_LICENSE_KEY. License verification and expiry enforcement remain offline, expired keys still fall back to the free 10-seat limit, and only the license ID plus current user total bypasses the analytics opt-out.

Targeted web, BullMQ, telemetry, type, lint, Knip, and docs checks passed. The full test sweep passed 357 of 358 web test files; the remaining pre-existing automation-settings test failed during database cleanup because a seeded environment still referenced its user.

Screenshots

Desktop License settings with the Roomote Cloud purchase CTA and helper guidance

Mobile License settings stacked without clipping

One-seat-remaining warning with the purchase CTA promoted inline

@roomote-roomote

roomote-roomote Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor Author

1 issue outstanding. See task

  • packages/telemetry/src/server/license-cloud.ts:156-166 In-flight syncs can overwrite a newer activation lease: a report that read the old key before an admin changes it still writes its old licenseCloudState after the new key is stored. The effective seat-limit check then sees a license-ID mismatch and falls back to 10 seats until a later sync succeeds. Guard the update against the currently configured license or serialize it with the key update.

Reviewed 069c008

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.

2 participants