event → sequence key */ private array $map = [ 'payment_failed' => 'dunning', 'period_ending' => 'renewal_reminder', 'cancel_requested' => 'win_back_offer', 'canceled' => 'win_back', 'anniversary' => 'loyalty', ]; public static function instance(): TriggerRegistry { return self::$instance ??= new self(); } public function register(): void { if (get_option('abovault_retention_enabled', 'yes') !== 'yes') { return; } add_action('abovault_payment_failed', function (int $id): void { $this->enroll($id, 'payment_failed'); }); // Every status transition can seed a trigger (canceled → win_back, etc.). add_action('abovault_subscription_transitioned', function (int $id, string $to): void { if ($to === Subscription::STATUS_CANCELED) { $this->enroll($id, 'canceled'); } }, 10, 2); // period_ending + anniversary are evaluated by ExecutionService's daily sweep. } /** @return array */ public function sequences(): array { return $this->map; } private function enroll(int $subscriptionId, string $event): void { $sequence = $this->map[$event] ?? null; if ($sequence === null) { return; } EnrollmentService::enroll($subscriptionId, $sequence, $event); } }