---
title: "Cancellations: what they cost, why, and who left"
description: "Cancelled subscriptions whose cancellation falls in [start, end] (civil days in the business timezone), under the same filters as the subscriptions list, so each count matches the list it drills…"
canonical_url: "https://twominutebilling.com/help/developers/api-reference/organization/cancellations"
---
# Cancellations: what they cost, why, and who left

> Cancelled subscriptions whose cancellation falls in [start, end] (civil days in the business timezone), under the same filters as the subscriptions list, so each count matches the list it drills…

<api-operation method="GET" path="/v1/businesses/{biz}/cancellation_analytics">
<template v-slot:docs="">

Cancelled subscriptions whose cancellation falls in <span>

`start`, `end`

</span>

 (civil days in the business timezone), under the same filters as the subscriptions list, so each count matches the list it drills into. Each is classified by what it cost: `paying` (it lost MRR — the net of its ledger `churn` movements within a day of the cancellation), `trial_not_converted` or `no_mrr` (none to lose when it ended). Paying losses are split by `cause` (`payment_failed`, `no_payment_method` and `chargeback` are involuntary; `term_ended`; `voluntary` = no payment-related reason recorded, which on an imported cancellation says nothing either way), by merchant `reason` (`null` = none recorded), by tenure at cancellation, and over the requested `bucket`s, with the ten largest losses. Money is integer minor units per currency, plus a total in the business's default currency converted at the rate held on each cancellation day; a loss no rate reaches is counted in `totals.unconverted` and left out of the converted figures.

## Path parameters

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Required
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        biz
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      <strong>
        yes
      </strong>
    </td>
    
    <td>
      Business id (biz_…)
    </td>
  </tr>
</tbody>
</table>

## Query parameters

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Required
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        start
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      <strong>
        yes
      </strong>
    </td>
    
    <td>
      First civil day of the window, in the business timezone
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        end
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      <strong>
        yes
      </strong>
    </td>
    
    <td>
      Last civil day of the window, inclusive
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        bucket
      </code>
    </td>
    
    <td>
      <code>
        array of string
      </code>
    </td>
    
    <td>
      no
    </td>
    
    <td>
      Trend buckets as <code>
        YYYY-MM-DD,YYYY-MM-DD
      </code>
      
       (inclusive), repeated
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        plan
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      no
    </td>
    
    <td>
      A plan product id — the list's <code>
        plan[is]
      </code>
      
       filter
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        interval
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      no
    </td>
    
    <td>
      Billing interval — the list's <code>
        billing_period_unit[is]
      </code>
      
       filter
    </td>
  </tr>
</tbody>
</table>

## Response

<table>
<thead>
  <tr>
    <th>
      Field
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        object
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      The object type; always <code>
        business_cancellation_analytics
      </code>
      
      . One of <code>
        business_cancellation_analytics
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        business
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      The business id.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        start
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      The first day of the window (YYYY-MM-DD).
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        end
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      The last day of the window (YYYY-MM-DD).
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        currency
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      The currency of the money figures.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        timezone
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      The business time zone.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        totals
      </code>
    </td>
    
    <td>
      <code>
        object
      </code>
    </td>
    
    <td>
      Totals for the window.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        kinds
      </code>
    </td>
    
    <td>
      <code>
        array of object
      </code>
    </td>
    
    <td>
      Cancellations by kind.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        causes
      </code>
    </td>
    
    <td>
      <code>
        array of object
      </code>
    </td>
    
    <td>
      Cancellations by cause.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        reasons
      </code>
    </td>
    
    <td>
      <code>
        array of object
      </code>
    </td>
    
    <td>
      Cancellations by stated reason.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        tenure
      </code>
    </td>
    
    <td>
      <code>
        array of object
      </code>
    </td>
    
    <td>
      Cancellations by how long the subscription lasted.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        buckets
      </code>
    </td>
    
    <td>
      <code>
        array of object
      </code>
    </td>
    
    <td>
      The buckets that you asked for with <code>
        bucket
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        top_losses
      </code>
    </td>
    
    <td>
      <code>
        array of object
      </code>
    </td>
    
    <td>
      The ten largest losses.
    </td>
  </tr>
</tbody>
</table>

## Status codes

<table>
<thead>
  <tr>
    <th>
      Status
    </th>
    
    <th>
      Meaning
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        200
      </code>
    </td>
    
    <td>
      Business cancellation analytics
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        400
      </code>
    </td>
    
    <td>
      Invalid window, bucket or interval
    </td>
  </tr>
</tbody>
</table>
</template>

<template v-slot:request="">

```bash [Request]
curl "$TMBILLING_URL/v1/businesses/biz_XXXXXXXXXXXX01/cancellation_analytics?start=2026-03-14&end=2026-04-14" \
  -H "Authorization: Bearer $TMBILLING_API_KEY"
```

</template>

<template v-slot:response="">
<code-group>

```json [200 OK]
{
  "object": "business_cancellation_analytics",
  "business": "biz_XXXXXXXXXXXX01",
  "start": "2026-09-01",
  "end": "2026-09-30",
  "currency": "USD",
  "timezone": "America/New_York",
  "totals": {
    "count": 12,
    "mrr_lost_minor": 58800,
    "mrr_lost_by_currency": {},
    "paying": 9,
    "involuntary": 4,
    "unconverted": 3
  },
  "kinds": [
    {
      "kind": "paying",
      "count": 12,
      "mrr_lost_minor": 58800,
      "mrr_lost_by_currency": {}
    }
  ],
  "causes": [
    {
      "cause": "payment_failed",
      "involuntary": false,
      "count": 12,
      "mrr_lost_minor": 58800,
      "mrr_lost_by_currency": {}
    }
  ],
  "reasons": [
    {
      "reason": "too_expensive",
      "count": 12,
      "mrr_lost_minor": 58800,
      "mrr_lost_by_currency": {}
    }
  ],
  "tenure": [
    {
      "band": "3_6m",
      "label": "3–6 months",
      "count": 12,
      "mrr_lost_minor": 58800,
      "mrr_lost_by_currency": {}
    }
  ],
  "buckets": [
    {
      "start": "2026-09-01",
      "end": "2026-09-07",
      "count": 3,
      "paying": 2,
      "mrr_lost_minor": 2900,
      "involuntary_mrr_lost_minor": 2900
    }
  ],
  "top_losses": [
    {
      "subscription": "sub_XXXXXXXXXXXX01",
      "customer": "cus_XXXXXXXXXXXX01",
      "customer_name": "Example Co",
      "plan": "pro",
      "canceled_at": "2026-03-14T09:30:00Z",
      "currency": "USD"
    }
  ]
}
```

```json [400 Bad Request]
{
  "error": {
    "type": "invalid_request_error",
    "message": "Invalid window, bucket or interval"
  }
}
```

</code-group>
</template>
</api-operation>


## Sitemap

See the full [sitemap](https://twominutebilling.com/sitemap.md) for all pages.
