Version

Retention Management

A project's Revenue Recovery settings as a connector's creator surface runs them — the grace window with its ladder in words, the question, the digest and the three offers with the coupons a creator may pick, read whole and saved one field at a time.

Subscriby\Connector\Core\RetentionManagement. Where Retention is the cancellation screen as a member meets it, this is the programme's settings as the creator runs them, for a platform that has a conversation with creators. Every call takes the CreatorRef of the account that is talking and the ProjectRef of the project, and runs as that creator: the owner, or a teammate under the same team permissions, with the same bounds and the same coupon rule the dashboard applies. The details answer whether the owner's plan includes the offers, so a connector hides what a save would not honour, and every refusal reaches you as RetentionRefused with a stable reason.

settingsOf()

$settings = $this->retention->settingsOf($creator, $project);

$settings->projectName;
$settings->graceDays;                         // 7
$settings->maxGraceDays;                      // 30, the ceiling a window may be set to
$settings->ladderSentence;                    // the window and its notices in one sentence, in the creator's language
$settings->digestEnabled;                     // one message a day, on the days something happened
$settings->feedbackEnabled;                   // whether a cancelling member is asked why
$settings->offersAvailable;                   // false when the owner's plan lacks the offers
$settings->pauseOffered;                      // whether a pause is offered where the gateway can hold the charge
$settings->discountCoupon?->code;             // the coupon applied to the renewals, or null
$settings->returnCoupon?->code;               // the coupon handed over on the way out, or null
foreach ($settings->coupons as $coupon) {     // the project's live coupons a creator may pick
    $coupon->id; $coupon->code; $coupon->discount;   // "20% off"
}

RetentionSettingsDetails carries every setting twice over: as the stored value a settings question edits (the days, the switch, the coupon's id) and as the sentence the core phrases from it, which a screen prints. offersAvailable is the owner's plan speaking: the three offer settings are stored on every plan, and a connector shows them only while it is true.

saveSettings()

use Subscriby\Connector\Data\RetentionSettingsDraft;

$settings = $this->retention->saveSettings($creator, $project, new RetentionSettingsDraft(graceDays: 10));
$settings = $this->retention->saveSettings($creator, $project, new RetentionSettingsDraft(digestEnabled: false));
$settings = $this->retention->saveSettings($creator, $project, new RetentionSettingsDraft(returnCouponId: $couponId));
$settings = $this->retention->saveSettings($creator, $project, new RetentionSettingsDraft(discountCouponId: RetentionSettingsDraft::NONE));

A draft names only the fields you answered: null means "leave it as it is", so a bot that flips one switch sends one field, and a coupon is cleared with RetentionSettingsDraft::NONE, since null cannot mean both. The core checks the window against its bounds (invalid_settings) and the coupon against the project's own (coupon_unknown), writes the row and answers the settings as written, the ladder sentence re-phrased for the new window.

Refusals

Both methods throw Subscriby\Connector\Exceptions\RetentionRefused. getMessage() is the core's sentence in the creator's language; reason is stable and yours to branch on: project_unknown (the creator cannot manage the project, or no such project or creator exists), forbidden (a teammate without the permission to change the project's subscriptions), invalid_settings and coupon_unknown. A surface treats project_unknown as missing information and relays the rest.

What is not here

The win-back sequences, the figures, the cancellation screens and the activity ledger stay the dashboard's, the REST API's and the MCP tools'; a conversation has no screen for them. Nothing here reads as nobody: a creator surface reads what the creator may read, and a member surface uses Retention.

Read it fresh

Details are computed when you ask; park nothing across two taps but the project ref. The dashboard, the REST API and another connector may change the settings between them.

How is this guide?

Last updated on

Version

On this page

Subscriby is a product
designed by you — for you.
No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request

For AI agents: llms.txt · llms-full.txt