Rybbit
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/analyze

Analyzes 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

Request
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" }
    ]
  }'
Request
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();
Request
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()
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']
    ]
];

$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);
Request
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)
Request
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)
}
Request
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(())
}
Request
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();
Request
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();
Response
{
  "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
    }
  ]
}