Fini handles subscription cancellations end to end in a deterministic Intent Rule: it confirms the customer actually wants to cancel, identifies their account, captures the reason, calls your billing API through an Action, and replies with the effective date, refund amount and confirmation id your system returned. The same pattern covers pauses and plan changes, and high-value accounts can be held for human review with an internal note instead of a direct reply. The step-by-step build lives in the Cancellation flow walkthrough, which is Fini’s canonical end-to-end example. This page covers the decisions around it: what to automate, what to keep with your team, how to confirm before acting, and what to measure.

What Fini handles and what it hands to your team

How it works in Fini

Example behavior tree

The walkthrough’s tree cancels as soon as the intent matches. The variant below adds an explicit confirmation step, the first defensive pattern the walkthrough recommends. It’s an example to adapt: tag names and fields are placeholders.
How it runs: on the first message, the confirmation tag isn’t user_confirmed yet, so the Fallback reaches the last Reply and asks the customer to confirm. Each customer message re-runs the rule from the root, so when the customer replies “yes, cancel it”, the confirmation tag is applied during tagging (before the rule runs) and the first branch cancels. If the customer goes quiet after the confirmation question, a Follow up after inactivity setting on that Reply can send one reminder while the conversation is Waiting for customer. If you prefer an explicit button, use a Form with a single confirmation field before the Tool instead, as the walkthrough describes. Pair either approach with an idempotency key in the Action body built from values you have before the call (for example ${customer_id}-cancel; effective_date is a Tool output, so it isn’t available yet) so a duplicate message can’t cancel twice.

Pauses, downgrades and retention offers

Common adaptations, each a sibling branch under a Fallback root (the multi-intent shape from the Order status and changes walkthrough):
  • Pause instead of cancel. A pause_request branch calling Pause Subscription and replying with the resume date it returns.
  • Downgrade. A plan_change branch with a Check on plan, then a Change Plan Tool.
  • Retention offer. If your billing system exposes an offer endpoint, a Tool that fetches the offer for this customer runs before the confirmation question, and the user_denied branch applies it. Keep offer logic in your system, so the agent only presents what your API returned.
  • Different review rules. Replace is_vip Equals True with plan Equals enterprise, or switch the Reply Rules card to No Reply to leave those customers entirely to your team.

What you need

Guardrails and escalation

What to measure

Scope Analytics to cancellations with the Tags filter or the Intent rule filter. If you collect reasons with a Form, the structured values give you consistent reasons to report on.

Cancellation flow walkthrough

The step-by-step build: attribute, Action, Intent Rule, Reply Rules gate, testing and troubleshooting.

Order status and changes

A Fallback-rooted rule handling several related intents, the shape for pause and downgrade branches.

Tags

Intent tags, confirmation groups and writing “when not to apply” rules.

Intent Rules

Node types, inactivity follow-ups and the Form pattern.

Refunds and returns

When the customer wants money back rather than to stop the subscription.

Escalation and handoff

Where escalated cancellations land and what your team sees.
For a comparison of tools for subscription cancellation, see the guide on usefini.com.