feat(funnels): update frontend types and API client for funnels v2

This commit is contained in:
Usman Baig
2026-03-18 14:20:15 +01:00
parent ff58ba5953
commit d5b594d6f9

View File

@@ -1,10 +1,18 @@
import apiRequest from './client'
export interface StepPropertyFilter {
key: string
operator: 'is' | 'is_not' | 'contains' | 'not_contains'
value: string
}
export interface FunnelStep {
order: number
name: string
value: string
type: string // "exact", "contains", "regex"
category?: 'page' | 'event'
property_filters?: StepPropertyFilter[]
}
export interface Funnel {
@@ -13,15 +21,23 @@ export interface Funnel {
name: string
description: string
steps: FunnelStep[]
conversion_window_value: number
conversion_window_unit: 'hours' | 'days'
created_at: string
updated_at: string
}
export interface ExitPage {
path: string
visitors: number
}
export interface FunnelStepStats {
step: FunnelStep
visitors: number
dropoff: number
conversion: number
exit_pages: ExitPage[]
}
export interface FunnelStats {
@@ -32,7 +48,27 @@ export interface FunnelStats {
export interface CreateFunnelRequest {
name: string
description: string
steps: FunnelStep[]
steps: Omit<FunnelStep, 'order'>[]
conversion_window_value?: number
conversion_window_unit?: 'hours' | 'days'
}
export interface FunnelTrends {
dates: string[]
overall: number[]
steps: Record<string, number[]>
}
export interface FunnelBreakdownEntry {
value: string
visitors: number
conversion: number
}
export interface FunnelBreakdown {
step: number
dimension: string
entries: FunnelBreakdownEntry[]
}
export async function listFunnels(siteId: string): Promise<Funnel[]> {
@@ -64,10 +100,41 @@ export async function deleteFunnel(siteId: string, funnelId: string): Promise<vo
})
}
export async function getFunnelStats(siteId: string, funnelId: string, startDate?: string, endDate?: string): Promise<FunnelStats> {
export async function getFunnelStats(siteId: string, funnelId: string, startDate?: string, endDate?: string, filters?: string): Promise<FunnelStats> {
const params = new URLSearchParams()
if (startDate) params.append('start_date', startDate)
if (endDate) params.append('end_date', endDate)
if (filters) params.append('filters', filters)
const queryString = params.toString() ? `?${params.toString()}` : ''
return apiRequest<FunnelStats>(`/sites/${siteId}/funnels/${funnelId}/stats${queryString}`)
}
export async function getFunnelTrends(
siteId: string, funnelId: string,
startDate?: string, endDate?: string,
interval: string = 'day', filters?: string
): Promise<FunnelTrends> {
const params = new URLSearchParams()
if (startDate) params.append('start_date', startDate)
if (endDate) params.append('end_date', endDate)
params.append('interval', interval)
if (filters) params.append('filters', filters)
const queryString = params.toString() ? `?${params.toString()}` : ''
return apiRequest<FunnelTrends>(`/sites/${siteId}/funnels/${funnelId}/trends${queryString}`)
}
export async function getFunnelBreakdown(
siteId: string, funnelId: string,
step: number, dimension: string,
startDate?: string, endDate?: string,
filters?: string
): Promise<FunnelBreakdown> {
const params = new URLSearchParams()
params.append('step', step.toString())
params.append('dimension', dimension)
if (startDate) params.append('start_date', startDate)
if (endDate) params.append('end_date', endDate)
if (filters) params.append('filters', filters)
const queryString = params.toString() ? `?${params.toString()}` : ''
return apiRequest<FunnelBreakdown>(`/sites/${siteId}/funnels/${funnelId}/breakdown${queryString}`)
}