settings-v0
Show the company's cancel flow report
What the cancel flow did over a range of UTC days (default the last 30, at most 366). A session counts on the day it started, and an open session past its 30 minutes counts as abandoned. save_rate is saved sessions over sessions with a reason. An offer counts as shown when the reason step returned it to the customer; a cancel that carried the reason shows none. Each experiment with sessions in the range lists both arms with their sample sizes. Answers 404 while the company cannot use the cancel flow. Responses are not cached.
GET
/
api
/
subscription_pro
/
retention_report
Show the company's cancel flow report
curl --request GET \
--url https://api.fluid.app/api/subscription_pro/retention_report \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/subscription_pro/retention_report"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/subscription_pro/retention_report', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/subscription_pro/retention_report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/subscription_pro/retention_report"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/subscription_pro/retention_report")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/retention_report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"retention_report": {
"from": "2026-10-01",
"to": "2026-10-30",
"sessions": {
"started": 12,
"with_reason": 10,
"open": 0,
"saved": 4,
"cancelled": 6,
"abandoned": 2,
"save_rate": 0.4
},
"reasons": [
{
"reason_code": "too_expensive",
"started": 6,
"with_reason": 6,
"open": 0,
"saved": 3,
"cancelled": 3,
"abandoned": 0,
"save_rate": 0.5
}
],
"offers": [
{
"offer_type": "discount",
"shown": 6,
"accepted": 3,
"acceptance_rate": 0.5
}
],
"experiments": [
{
"id": 12,
"control_version": 2,
"variant_version": 3,
"variant_percent": 50,
"started_at": "2026-10-01T09:00:00Z",
"stopped_at": null,
"running": true,
"min_sample": 200,
"sample_sufficient": false,
"arms": [
{
"arm": "control",
"flow_version": 2,
"started": 6,
"with_reason": 5,
"open": 0,
"saved": 1,
"cancelled": 4,
"abandoned": 1,
"save_rate": 0.2
},
{
"arm": "variant",
"flow_version": 3,
"started": 6,
"with_reason": 5,
"open": 0,
"saved": 3,
"cancelled": 2,
"abandoned": 1,
"save_rate": 0.6
}
]
}
]
},
"status": 200,
"meta": {
"request_id": "7d2f4c1a-9b3e-4f6d-8a21-3c5e0b9f1d42",
"timestamp": "2026-10-10T14:05:31Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer token authentication
Query Parameters
The first day (UTC), default 29 days before to
The last day (UTC), inclusive, default today
⌘I
Show the company's cancel flow report
curl --request GET \
--url https://api.fluid.app/api/subscription_pro/retention_report \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/subscription_pro/retention_report"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/subscription_pro/retention_report', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/subscription_pro/retention_report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/subscription_pro/retention_report"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/subscription_pro/retention_report")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/retention_report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"retention_report": {
"from": "2026-10-01",
"to": "2026-10-30",
"sessions": {
"started": 12,
"with_reason": 10,
"open": 0,
"saved": 4,
"cancelled": 6,
"abandoned": 2,
"save_rate": 0.4
},
"reasons": [
{
"reason_code": "too_expensive",
"started": 6,
"with_reason": 6,
"open": 0,
"saved": 3,
"cancelled": 3,
"abandoned": 0,
"save_rate": 0.5
}
],
"offers": [
{
"offer_type": "discount",
"shown": 6,
"accepted": 3,
"acceptance_rate": 0.5
}
],
"experiments": [
{
"id": 12,
"control_version": 2,
"variant_version": 3,
"variant_percent": 50,
"started_at": "2026-10-01T09:00:00Z",
"stopped_at": null,
"running": true,
"min_sample": 200,
"sample_sufficient": false,
"arms": [
{
"arm": "control",
"flow_version": 2,
"started": 6,
"with_reason": 5,
"open": 0,
"saved": 1,
"cancelled": 4,
"abandoned": 1,
"save_rate": 0.2
},
{
"arm": "variant",
"flow_version": 3,
"started": 6,
"with_reason": 5,
"open": 0,
"saved": 3,
"cancelled": 2,
"abandoned": 1,
"save_rate": 0.6
}
]
}
]
},
"status": 200,
"meta": {
"request_id": "7d2f4c1a-9b3e-4f6d-8a21-3c5e0b9f1d42",
"timestamp": "2026-10-10T14:05:31Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}