---
title: "Analytics Churn"
method: GET
path: "/admin/analytics/licenses/churn"
---

# Analytics Churn

`GET /admin/analytics/licenses/churn`

Churn rate по месяцам. v3 — переработана логика renewed.

Реальность: пользователи платят каждые ~30 дней, premium_until накапливается вперёд.
Платёж ВСЕГДА приходит ДО истечения premium_until — значит искать
p.created_at > premium_until бессмысленно.

Правильная логика:
- expired = пользователи у которых последний платёж был в данном месяце
  и с тех пор прошло > 37 дней (30 дней подписки + 7 дней grace period)
- renewed = те из expired у кого есть ещё один платёж после первого в этом месяце

## Query parameters

- `months` integer

## Headers

- `authorization` string

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/open60m/apis/open60-vpn-api.md) · [All operations](https://skmtc.dev/open60m/apis/open60-vpn-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/open60m/open60-vpn-api/revisions/932cba8b4b19/schema)
