Funnels
Analyze Funnel
Analyzes a funnel and returns step-by-step conversion data. Sessions must complete steps in order (step 2 must occur after step 1, etc.).
POST /api/sites/:site/funnels/analyzeAnalyzes a funnel and returns step-by-step conversion data. Sessions must complete steps in order (step 2 must occur after step 1, etc.).
Path Parameters
Prop
Type
Query Parameters
Accepts all Common Parameters (time and filters).
Request Body
Prop
Type
FunnelStep Object
Prop
Type
Response
Prop
Type
FunnelStepResult Object
Prop
Type
curl -X POST "https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31" \
-H "Authorization: Bearer your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"steps": [
{ "type": "page", "value": "/", "name": "Homepage" },
{ "type": "page", "value": "/pricing", "name": "Pricing" },
{ "type": "page", "value": "/signup", "name": "Signup" },
{ "type": "event", "value": "signup_complete", "name": "Complete" }
]
}'const response = await fetch(
'https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31',
{
method: 'POST',
headers: {
'Authorization': 'Bearer your_api_key_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({
steps: [
{ type: 'page', value: '/', name: 'Homepage' },
{ type: 'page', value: '/pricing', name: 'Pricing' },
{ type: 'page', value: '/signup', name: 'Signup' },
{ type: 'event', value: 'signup_complete', name: 'Complete' }
]
})
}
);
const data = await response.json();import requests
response = requests.post(
'https://app.rybbit.io/api/sites/1/funnels/analyze',
params={
'start_date': '2024-01-01',
'end_date': '2024-01-31'
},
json={
'steps': [
{ 'type': 'page', 'value': '/', 'name': 'Homepage' },
{ 'type': 'page', 'value': '/pricing', 'name': 'Pricing' },
{ 'type': 'page', 'value': '/signup', 'name': 'Signup' },
{ 'type': 'event', 'value': 'signup_complete', 'name': 'Complete' }
]
},
headers={
'Authorization': 'Bearer your_api_key_here'
}
)
data = response.json()$body = [
'steps' => [
['type' => 'page', 'value' => '/', 'name' => 'Homepage'],
['type' => 'page', 'value' => '/pricing', 'name' => 'Pricing'],
['type' => 'page', 'value' => '/signup', 'name' => 'Signup'],
['type' => 'event', 'value' => 'signup_complete', 'name' => 'Complete']
]
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer your_api_key_here',
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);require 'net/http'
require 'json'
uri = URI('https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer your_api_key_here'
request['Content-Type'] = 'application/json'
request.body = {
steps: [
{ type: 'page', value: '/', name: 'Homepage' },
{ type: 'page', value: '/pricing', name: 'Pricing' },
{ type: 'page', value: '/signup', name: 'Signup' },
{ type: 'event', value: 'signup_complete', name: 'Complete' }
]
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
data = JSON.parse(response.body)package main
import (
"bytes"
"encoding/json"
"io"
"net/http"
)
func main() {
body := map[string]interface{}{
"steps": []map[string]string{
{"type": "page", "value": "/", "name": "Homepage"},
{"type": "page", "value": "/pricing", "name": "Pricing"},
{"type": "page", "value": "/signup", "name": "Signup"},
{"type": "event", "value": "signup_complete", "name": "Complete"},
},
}
jsonBody, _ := json.Marshal(body)
client := &http.Client{}
req, _ := http.NewRequest("POST", "https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31", bytes.NewBuffer(jsonBody))
req.Header.Set("Authorization", "Bearer your_api_key_here")
req.Header.Set("Content-Type", "application/json")
resp, _ := client.Do(req)
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
var data map[string]interface{}
json.Unmarshal(respBody, &data)
}use reqwest;
use serde_json::{json, Value};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let body = json!({
"steps": [
{"type": "page", "value": "/", "name": "Homepage"},
{"type": "page", "value": "/pricing", "name": "Pricing"},
{"type": "page", "value": "/signup", "name": "Signup"},
{"type": "event", "value": "signup_complete", "name": "Complete"}
]
});
let client = reqwest::Client::new();
let response = client
.post("https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31")
.header("Authorization", "Bearer your_api_key_here")
.header("Content-Type", "application/json")
.json(&body)
.send()
.await?;
let data: Value = response.json().await?;
Ok(())
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String json = """
{
"steps": [
{"type": "page", "value": "/", "name": "Homepage"},
{"type": "page", "value": "/pricing", "name": "Pricing"},
{"type": "page", "value": "/signup", "name": "Signup"},
{"type": "event", "value": "signup_complete", "name": "Complete"}
]
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31"))
.header("Authorization", "Bearer your_api_key_here")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
String data = response.body();using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
var body = new
{
steps = new[]
{
new { type = "page", value = "/", name = "Homepage" },
new { type = "page", value = "/pricing", name = "Pricing" },
new { type = "page", value = "/signup", name = "Signup" },
new { type = "event", value = "signup_complete", name = "Complete" }
}
};
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "your_api_key_here");
var content = new StringContent(
JsonSerializer.Serialize(body),
Encoding.UTF8,
"application/json");
var response = await client.PostAsync(
"https://app.rybbit.io/api/sites/1/funnels/analyze?start_date=2024-01-01&end_date=2024-01-31",
content);
var data = await response.Content.ReadAsStringAsync();{
"data": [
{
"step_number": 1,
"step_name": "Homepage",
"visitors": 10000,
"conversion_rate": 100,
"dropoff_rate": 0
},
{
"step_number": 2,
"step_name": "Pricing",
"visitors": 4500,
"conversion_rate": 45,
"dropoff_rate": 55
},
{
"step_number": 3,
"step_name": "Signup",
"visitors": 1800,
"conversion_rate": 18,
"dropoff_rate": 60
},
{
"step_number": 4,
"step_name": "Complete",
"visitors": 720,
"conversion_rate": 7.2,
"dropoff_rate": 60
}
]
}