Most retention tools guard the cancel button. Tenure covers all four ways out.See them →

Developers

One tag. Or no tag, and an API.

Tenure is meant to be installed in an afternoon by whoever owns the billing page, and to be invisible in your bundle and your error budget. The cancel path always completes, including when we do not.

The path

From the click to the charge

Clickdata-tenure-cancelYour button, interceptedDecidePOST /recommendEligibility, offer, budgetShowshadow rootYour brand, your pageApplyPOST /enableBilling change, idempotentTellsigned eventYour backend, retriedIF ANY STEP FAILS, YOUR CANCEL BUTTON DOES WHAT IT ALWAYS DID

Install

One tag, one attribute

Drop the tag on the page that already has your cancel button, and mark the button. Tenure takes over the click, runs the flow, and hands the original action back if the subscriber still wants to leave.

<script
  src="https://cdn.trytenure.ai/widget.js"
  data-key="pk_live_..."
></script>

<button data-tenure-cancel
        data-tenure-customer="sub_8421">
  Cancel subscription
</button>

If the script fails to load, times out, or errors, the button does exactly what it did before it was marked.

REST

Or render nothing at all

The same decisions are available over HTTP, with scoped keys and idempotency. Ask what to offer this subscriber, then tell Tenure what they said.

POST /api/v1/recommend
X-Session-Id: ses_a1b2
Authorization: Bearer tk_live_...

{ "customer_id": "sub_8421",
  "reason": "too_expensive" }

→ 200
{ "offer": { "id": "off_pause60",
             "type": "PAUSE",
             "label": "Pause for 60 days" },
  "arm": "TREATMENT" }

Sending the same request twice does the same thing once. Every applied offer lands in the audit log.

Agents

Give a model the tools, and the limits

An agent connection exposes the same operations as tools a model can call directly. Budget caps, eligibility and guardrails are enforced on the server, not requested in a prompt.

tools:
  tenure.recommend_offer
  tenure.apply_offer
  tenure.cancel_subscription
  tenure.lookup_customer

# Caps, eligibility and discount depth are
# enforced server-side. An agent cannot
# negotiate past them.

Works with any agent platform that can call an HTTP tool. Vendor guides exist; certified integrations are not claimed.

Events

Signed events to your backend

When something is applied, Tenure tells your system. Signed over the timestamp and body, retried with backoff, and safe to receive twice.

POST https://yourapp.com/tenure/events
x-tenure-signature: t=1758…,v1=9f2c…
idempotency-key: op_7c31

{ "type": "offer.applied",
  "sessionId": "ses_a1b2",
  "appliedBy": "tenure",
  "offer": { "type": "DISCOUNT" } }

Verify the signature before you trust the body. The same delivery may arrive more than once; the key tells you.

Reference

The full documentation lives in the app.

API reference, webhook payloads, widget styling variables, the mobile clients and a machine-readable index for your own agents.

Try it against your own account first.

Test mode runs the whole flow end to end without touching a real subscriber or a real charge.