mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-13 00:34:43 +00:00
Lock grandfathering to pre-cutover subscribers
This commit is contained in:
parent
4651433809
commit
34784c9b9b
5 changed files with 28 additions and 31 deletions
|
|
@ -58,7 +58,7 @@ Runtime rules:
|
|||
- Deduplication follows canonical unified-resource identity rather than transport-specific state.
|
||||
|
||||
Migration policy:
|
||||
- Existing active recurring v5 customers keep their grandfathered recurring price and uncapped monitored-system and guest capacity until cancellation.
|
||||
- Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their grandfathered recurring price and uncapped monitored-system and guest capacity until cancellation.
|
||||
- Existing free users above the new Community cap are not hard-broken on rollout day.
|
||||
- During grace, existing monitoring keeps working.
|
||||
- During grace, only new counted-system additions are blocked until the user removes systems or upgrades.
|
||||
|
|
@ -67,13 +67,13 @@ Migration policy:
|
|||
|
||||
| Customer cohort | What happens in v6 | Pricing and capacity outcome |
|
||||
|---|---|---|
|
||||
| Existing active recurring subscriber from a v5 or earlier Pulse Pro monthly/annual plan | The install can migrate into the v6 activation model without forcing a repurchase. | The existing recurring price stays in place and monitored-system plus guest capacity remain uncapped while the subscription remains continuously active. |
|
||||
| Legacy recurring subscriber from a v5 or earlier Pulse Pro monthly/annual plan, already active before the public v6 pricing cutover | The install can migrate into the v6 activation model without forcing a repurchase. | The existing recurring price stays in place and monitored-system plus guest capacity remain uncapped while the subscription remains continuously active. |
|
||||
| Existing lifetime license holder | The license remains valid through the v6 licensing transition. | Lifetime remains permanently valid and monitored-system plus guest capacity stay uncapped. |
|
||||
| Former recurring subscriber who already canceled or later lapses/cancels | A later return is treated as a new paid purchase, not as a grandfathered renewal. | The old grandfathered price and uncapped capacity do not resume automatically; current public v6 pricing and caps apply. |
|
||||
| New self-hosted v6 purchase | The purchase uses the current Relay / Pro / Pro+ self-hosted plans. | Current public v6 monitored-system and guest caps apply. |
|
||||
|
||||
Support rule:
|
||||
- If a currently active recurring subscriber or a lifetime customer sees a bounded monitored-system or guest cap in v6, treat it as a bug rather than as intended policy.
|
||||
- If a grandfathered recurring subscriber covered by the pre-cutover legacy policy, or a lifetime customer, sees a bounded monitored-system or guest cap in v6, treat it as a bug rather than as intended policy.
|
||||
|
||||
## Feature Matrix
|
||||
|
||||
|
|
|
|||
|
|
@ -131,18 +131,18 @@ Pulse v6 uses the activation/grant model for active licensing, but it can migrat
|
|||
- a Pulse v6 activation key, or
|
||||
- a valid Pulse v5 Pro/Lifetime license key, which Pulse will try to exchange automatically
|
||||
- If the exchange service cannot complete the migration, retry from the v6 license panel or use the self-serve retrieval flow to fetch the current v6 activation key. Email is only a backup copy of that key.
|
||||
- Existing active recurring v5 customers keep their grandfathered recurring price and uncapped monitored-system and guest capacity until cancellation. If they cancel and later return, current v6 pricing and limits apply.
|
||||
- Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their grandfathered recurring price and uncapped monitored-system and guest capacity until cancellation. If they cancel and later return, current v6 pricing and limits apply.
|
||||
|
||||
#### Paid Upgrade Truth Table
|
||||
|
||||
When an existing paid user asks what changes for them specifically, use this rule set:
|
||||
|
||||
- Existing active recurring Pulse Pro subscribers from v5 or earlier keep their current recurring price and uncapped monitored-system plus guest capacity while the subscription remains continuously active.
|
||||
- Legacy recurring Pulse Pro subscriptions from v5 or earlier that were already active before the public v6 pricing cutover keep their current recurring price and uncapped monitored-system plus guest capacity while the subscription remains continuously active.
|
||||
- Existing lifetime customers remain permanently valid and uncapped.
|
||||
- Former recurring customers who already canceled, or who cancel and later return, do not resume the old grandfathered pricing or uncapped capacity automatically; they re-enter on current public v6 pricing and limits.
|
||||
- New self-hosted v6 purchases use the current Relay / Pro / Pro+ plan caps.
|
||||
|
||||
If an active recurring subscriber or lifetime customer sees a new monitored-system or guest cap after moving to v6, treat that as a regression, not as expected upgrade behavior.
|
||||
If a grandfathered recurring subscriber covered by the pre-cutover legacy policy, or a lifetime customer, sees a new monitored-system or guest cap after moving to v6, treat that as a regression, not as expected upgrade behavior.
|
||||
|
||||
Practical recommendation:
|
||||
|
||||
|
|
|
|||
|
|
@ -4236,22 +4236,6 @@
|
|||
"subsystem_ids": [
|
||||
"patrol-intelligence"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "legacy-grandfathering-eligibility-cutoff",
|
||||
"summary": "Commercial migration still needs an explicit eligibility cutoff for uncapped grandfathered recurring continuity: decide whether only subscriptions already active before the public v6 pricing cutover qualify, or whether subscriptions started during the RC/current-v5 checkout window also qualify, and keep public pricing copy from implying the broader interpretation until that policy is explicitly decided.",
|
||||
"owner": "project-owner",
|
||||
"blocking_level": "release-ready",
|
||||
"status": "open",
|
||||
"opened_at": "2026-04-15",
|
||||
"lane_ids": [
|
||||
"L2",
|
||||
"L3",
|
||||
"L9"
|
||||
],
|
||||
"subsystem_ids": [
|
||||
"cloud-paid"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source_of_truth_file": "docs/release-control/v6/internal/SOURCE_OF_TRUTH.md",
|
||||
|
|
@ -4411,7 +4395,7 @@
|
|||
},
|
||||
{
|
||||
"id": "v5-pro-price-grandfathering",
|
||||
"summary": "Paid Pulse Pro v5 recurring customers keep their existing recurring price plus uncapped monitored-system and guest capacity through the v6 pricing change until they cancel; renewals must preserve that grandfathered state, while any return after cancellation re-enters on current v6 pricing and limits.",
|
||||
"summary": "Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their existing recurring price plus uncapped monitored-system and guest capacity through the v6 pricing change until they cancel; renewals must preserve that grandfathered state, while any return after cancellation re-enters on current v6 pricing and limits.",
|
||||
"kind": "pricing",
|
||||
"decided_at": "2026-03-12",
|
||||
"subsystem_ids": [
|
||||
|
|
@ -4687,6 +4671,20 @@
|
|||
"L9",
|
||||
"L12"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "legacy-grandfathering-eligibility-cutoff",
|
||||
"summary": "Uncapped grandfathered recurring continuity applies only to legacy recurring Pulse Pro subscriptions that were already active before the public v6 pricing cutover; public pricing and checkout copy must not imply that brand-new pre-cutover purchases automatically qualify for that legacy continuity.",
|
||||
"kind": "pricing",
|
||||
"decided_at": "2026-04-15",
|
||||
"subsystem_ids": [
|
||||
"cloud-paid"
|
||||
],
|
||||
"lane_ids": [
|
||||
"L2",
|
||||
"L3",
|
||||
"L9"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,8 @@ license panel using the existing key.
|
|||
|
||||
Use this cohort breakdown:
|
||||
|
||||
- Existing active recurring monthly or annual subscribers from v5 or earlier:
|
||||
- Legacy recurring monthly or annual subscribers from v5 or earlier who were
|
||||
already active before the public v6 pricing cutover:
|
||||
keep the current recurring price and uncapped monitored-system plus guest
|
||||
capacity while the subscription remains continuously active.
|
||||
- Existing lifetime customers:
|
||||
|
|
@ -73,9 +74,9 @@ Use this cohort breakdown:
|
|||
- New self-hosted v6 purchasers:
|
||||
take the current Relay / Pro / Pro+ caps.
|
||||
|
||||
If a currently active recurring subscriber or a lifetime customer sees a
|
||||
bounded monitored-system or guest cap in v6, treat that as a product bug, not
|
||||
as intended policy.
|
||||
If a grandfathered recurring subscriber covered by the pre-cutover legacy
|
||||
policy, or a lifetime customer, sees a bounded monitored-system or guest cap
|
||||
in v6, treat that as a product bug, not as intended policy.
|
||||
|
||||
### Will old bookmarks and familiar v5 pages still work?
|
||||
|
||||
|
|
|
|||
|
|
@ -4385,10 +4385,7 @@ class SubsystemLookupTest(unittest.TestCase):
|
|||
)
|
||||
lane_context = match["lane_context"]
|
||||
self.assertEqual(lane_context["lane_id"], "L3")
|
||||
self.assertEqual(
|
||||
{decision["id"] for decision in lane_context["open_decisions"]},
|
||||
{"legacy-grandfathering-eligibility-cutoff"},
|
||||
)
|
||||
self.assertEqual(lane_context["open_decisions"], [])
|
||||
self.assertEqual(
|
||||
{gate["id"] for gate in lane_context["release_gates"]},
|
||||
{
|
||||
|
|
@ -4415,6 +4412,7 @@ class SubsystemLookupTest(unittest.TestCase):
|
|||
{
|
||||
"cloud-msp-price-id-propagation",
|
||||
"cloud-msp-stripe-prices",
|
||||
"legacy-grandfathering-eligibility-cutoff",
|
||||
"stable-release-promotion-model",
|
||||
"stripe-mapping-contract-lock",
|
||||
"trial-authority-saas-controlled",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue