import api from './client';
export interface CrmSummary {
companies: number;
contacts: number;
deals: number;
pipeline_value: number;
}
export interface PipelineStage {
name: string;
count: number;
value: number;
}
export interface ContactsAnalytics {
total: number;
growth_30d: string;
avg_lifecycle_days: number;
source_breakdown: Record<string, number>;
}
export interface DealsVelocity {
avg_days_to_close: number;
monthly_wins: number;
win_rate: number;
pipeline_velocity_score: number;
}
export interface ForecastData {
monthly_revenue: number;
monthly_deals: number;
quarterly_revenue: number;
quarterly_deals: number;
}
// -- Revenue Forecast interfaces --
export interface ForecastMonth {
month: string;
label: string;
actual: number;
likely: number;
best: number;
conservative: number;
}
export interface RevenueForecastResponse {
forecast: {
trailing_actuals: ForecastMonth[];
forecast_months: ForecastMonth[];
confidence_score: number;
avg_monthly_actual: number;
total_pipeline_value: number;
total_weighted_value: number;
open_deals_count: number;
};
}
// -- Pipeline Health interfaces --
export interface AtRiskDeal {
deal_name: string;
amount: number;
stage: string;
expected_close_date: string | null;
days_overdue: number;
}
export interface StageDistribution {
stage: string;
count: number;
value: number;
}
export interface StageConversion {
stage: string;
count: number;
next_stage: string | null;
conversion_pct: number;
}
export interface PipelineForecastResponse {
pipeline_health: {
health_score: number;
total_pipeline_value: number;
weighted_pipeline_value: number;
open_deals_count: number;
coverage_ratio: number;
avg_monthly_won_revenue: number;
growth_rate_pct: number;
this_month_new_deals: number;
last_month_new_deals: number;
};
at_risk_deals: AtRiskDeal[];
stage_distribution: StageDistribution[];
stage_conversion: StageConversion[];
}
// -- KPI interfaces --
export interface KPIMetric {
label: string;
category: string;
value: number;
previous_value: number;
unit: string;
pct_change: number;
trend: 'up' | 'down' | 'flat';
invert_trend?: boolean;
}
export interface KPIsResponse {
kpis: KPIMetric[];
period_days: number;
current_period: {
start: string;
end: string;
};
previous_period: {
start: string;
end: string;
};
}
// -- Existing analytics API --
export const analyticsApi = {
getCrmSummary: async (): Promise<CrmSummary> => {
const { data } = await api.get<CrmSummary>('/api/analytics/crm/summary');
return data;
},
getPipeline: async (): Promise<{ stages: PipelineStage[] }> => {
const { data } = await api.get<{ stages: PipelineStage[] }>('/api/analytics/pipeline');
return data;
},
getContacts: async (): Promise<ContactsAnalytics> => {
const { data } = await api.get<ContactsAnalytics>('/api/analytics/contacts');
return data;
},
getDealsVelocity: async (): Promise<DealsVelocity> => {
const { data } = await api.get<DealsVelocity>('/api/analytics/deals/velocity');
return data;
},
getForecasts: async (): Promise<ForecastData> => {
const { data } = await api.get<ForecastData>('/api/analytics/forecasts');
return data;
},
};
// -- Forecast API --
export const forecastApi = {
getRevenueForecast: async (): Promise<RevenueForecastResponse> => {
const { data } = await api.get<RevenueForecastResponse>('/api/analytics/forecast/revenue');
return data;
},
getPipelineForecast: async (): Promise<PipelineForecastResponse> => {
const { data } = await api.get<PipelineForecastResponse>('/api/analytics/forecast/pipeline');
return data;
},
getKPIs: async (period_days?: number): Promise<KPIsResponse> => {
const params = period_days ? { period_days } : {};
const { data } = await api.get<KPIsResponse>('/api/analytics/kpis', { params });
return data;
},
};
// -- Cascading Goals interfaces --
export interface GoalMetric {
id: string;
metric_name: string;
target_value: number;
actual_value: number;
unit: string;
period: string;
progress_percentage: number;
}
export interface GoalNode {
id: string;
name: string;
description: string;
level: 'org' | 'department' | 'team' | 'rep';
target_value: number;
current_value: number;
unit: string;
status: string;
progress_percentage: number;
parent_goal_id: string | null;
assigned_to: string | null;
company_id?: string;
weight: number;
start_date: string | null;
end_date: string | null;
metrics: GoalMetric[];
sub_goals: GoalNode[];
}
export interface CascadeLevel {
id: string;
name: string;
target_value: number;
current_value: number;
progress_percentage: number;
parent_goal_id?: string | null;
}
export interface CascadeSummary {
org_target: number;
org_current: number;
org_progress_percentage: number;
dept_targets: CascadeLevel[];
dept_total_target: number;
dept_total_current: number;
team_targets: CascadeLevel[];
team_total_target: number;
team_total_current: number;
rep_targets: CascadeLevel[];
rep_total_target: number;
rep_total_current: number;
total_cascade: number;
cascade_variance: number;
}
export interface GoalsResponse {
goals: GoalNode[];
cascade_summary: CascadeSummary;
total_goals: number;
}
export interface UpdateGoalProgressResponse {
goal: GoalNode;
cascade_summary: CascadeSummary;
}
export interface CreateGoalPayload {
name: string;
description?: string;
target_value: number;
current_value?: number;
level: 'org' | 'department' | 'team' | 'rep';
parent_goal_id?: string | null;
company_id: string;
status?: string;
assigned_to?: string | null;
start_date?: string;
end_date?: string;
unit?: string;
weight?: number;
}
export interface CreateGoalResponse {
goal: GoalNode;
cascade_summary: CascadeSummary;
}
export interface DeleteGoalResponse {
deleted: string;
cascade_summary: CascadeSummary;
}
// -- Goal filter params --
export interface GoalsFilterParams {
company_id?: string;
level?: 'org' | 'department' | 'team' | 'rep';
status?: 'active' | 'completed' | 'paused' | 'cancelled';
parent_goal_id?: string;
search?: string;
start_date_gte?: string;
end_date_lte?: string;
include_cascade?: boolean;
}
// -- Goal metrics --
export interface CreateMetricPayload {
metric_name: string;
target_value: number;
actual_value?: number;
unit?: string;
period?: string;
period_start?: string;
period_end?: string;
}
export interface UpdateMetricPayload extends Partial<CreateMetricPayload> {}
// -- Analytics users --
export interface AnalyticsUser {
id: string;
email: string;
full_name: string;
role: string;
company_role?: string;
}
// -- Goals API --
export const goalsApi = {
getGoals: async (params?: GoalsFilterParams): Promise<GoalsResponse> => {
const { data } = await api.get<GoalsResponse>('/api/analytics/goals', { params });
return data;
},
getGoalMetrics: async (goalId: string): Promise<{ metrics: GoalMetric[] }> => {
const { data } = await api.get<{ metrics: GoalMetric[] }>(`/api/analytics/goals/${goalId}/metrics`);
return data;
},
createGoalMetric: async (goalId: string, payload: CreateMetricPayload): Promise<{ metric: GoalMetric }> => {
const { data } = await api.post<{ metric: GoalMetric }>(`/api/analytics/goals/${goalId}/metrics`, payload);
return data;
},
updateGoalMetric: async (goalId: string, metricId: string, payload: UpdateMetricPayload): Promise<{ metric: GoalMetric }> => {
const { data } = await api.put<{ metric: GoalMetric }>(`/api/analytics/goals/${goalId}/metrics/${metricId}`, payload);
return data;
},
deleteGoalMetric: async (goalId: string, metricId: string): Promise<{ deleted: string }> => {
const { data } = await api.delete<{ deleted: string }>(`/api/analytics/goals/${goalId}/metrics/${metricId}`);
return data;
},
updateProgress: async (goalId: string, currentValue: number, rollUp?: boolean): Promise<UpdateGoalProgressResponse> => {
const { data } = await api.put<UpdateGoalProgressResponse>(
`/api/analytics/goals/${goalId}/progress`,
{ current_value: currentValue, roll_up: rollUp ?? false }
);
return data;
},
createGoal: async (payload: CreateGoalPayload): Promise<CreateGoalResponse> => {
const { data } = await api.post<CreateGoalResponse>('/api/analytics/goals', payload);
return data;
},
updateGoal: async (goalId: string, payload: Partial<CreateGoalPayload>): Promise<CreateGoalResponse> => {
const { data } = await api.put<CreateGoalResponse>(`/api/analytics/goals/${goalId}`, payload);
return data;
},
deleteGoal: async (goalId: string): Promise<DeleteGoalResponse> => {
const { data } = await api.delete<DeleteGoalResponse>(`/api/analytics/goals/${goalId}`);
return data;
},
getUsers: async (): Promise<{ users: AnalyticsUser[] }> => {
const { data } = await api.get<{ users: AnalyticsUser[] }>('/api/analytics/users');
return data;
},
};
// -- Strategic Intelligence interfaces --
export interface TrendPoint {
month: string;
label: string;
actual: number;
budget: number;
}
export interface StrategicOverview {
period: string;
period_label: string;
budget: number;
actual: number;
forecast: number;
variance: number;
variance_pct: number;
trend: TrendPoint[];
}
export interface WaterfallStep {
label: string;
value: number;
cumulative: number;
color: string;
}
export interface MarketMixPoint {
source: string;
value: number;
}
export interface WaterfallData {
waterfall: WaterfallStep[];
budget: number;
actual: number;
components: {
pipeline_contribution: number;
new_deals: number;
deal_size_variance: number;
conversion_rate_variance: number;
churn_cancellations: number;
};
market_mix: MarketMixPoint[];
}
export interface RootCauseNode {
label: string;
value: number;
details?: Record<string, unknown>;
children: RootCauseNode[];
}
export interface RootCauseTree {
root: {
label: string;
value: number;
budget: number;
actual: number;
children: RootCauseNode[];
};
}
export interface ContributionFactor {
name: string;
label: string;
value: number;
direction: 'positive' | 'negative' | 'neutral';
description: string;
recommendation: string;
percentage: number;
}
export interface SourceBreakdown {
source: string;
current: number;
previous: number;
change: number;
}
export interface ContributionAnalysis {
total_variance: number;
period: string;
factors: ContributionFactor[];
source_breakdown: SourceBreakdown[];
}
// -- Strategic Intelligence API --
export const strategicApi = {
getOverview: async (): Promise<StrategicOverview> => {
const { data } = await api.get<StrategicOverview>('/api/analytics/strategic-intelligence/overview');
return data;
},
getWaterfall: async (): Promise<WaterfallData> => {
const { data } = await api.get<WaterfallData>('/api/analytics/strategic-intelligence/waterfall');
return data;
},
getRootCause: async (): Promise<RootCauseTree> => {
const { data } = await api.get<RootCauseTree>('/api/analytics/strategic-intelligence/root-cause');
return data;
},
getContribution: async (): Promise<ContributionAnalysis> => {
const { data } = await api.get<ContributionAnalysis>('/api/analytics/strategic-intelligence/contribution');
return data;
},
};
// -- Scale Optimization interfaces --
export interface ScaleOverview {
total_spend_30d: number;
total_spend_90d: number;
total_conversions: number;
attributed_revenue: number;
overall_roas: number;
avg_ltv_cac: number;
total_active_campaigns: number;
campaigns_by_channel: Record<string, number>;
period: string;
}
export interface RunRateData {
ytd_revenue: number;
annual_target: number | null;
run_rate: number | null;
months_elapsed: number;
months_remaining: number;
pace: 'on_track' | 'behind' | null;
required_monthly: number | null;
remaining_needed: number | null;
}
export interface ChannelPerformance {
channel: string;
source_service: string;
spend: number;
impressions: number;
clicks: number;
conversions: number;
ctr: number;
cpc: number;
attributed_revenue: number;
roas: number;
ltv_cac: number;
cac: number;
trend: 'up' | 'down' | 'flat';
}
export interface MatrixCell {
spend: number;
revenue: number;
roas: number;
}
export interface MatrixRow {
dimension: string;
type: 'product' | 'market';
[channel: string]: string | MatrixCell;
}
export interface MatrixResponse {
rows: MatrixRow[];
channels: string[];
channel_names: Record<string, string>;
}
export interface Recommendation {
id: string;
action: string;
description: string;
from_channel: string;
from_channel_key: string;
to_channel: string;
to_channel_key: string;
move_amount: number;
current_roas_from: number;
current_roas_to: number;
projected_revenue: number;
current_revenue: number;
revenue_lift: number;
revenue_lift_pct: number;
confidence: 'high' | 'medium' | 'low';
reason: string;
}
export interface RecommendationsResponse {
recommendations: Recommendation[];
total_channels: number;
overall_avg_roas: number;
channel_summary: Array<{
source: string;
name: string;
spend: number;
roas: number;
revenue: number;
}>;
generated_at: string;
}
// -- Scale Optimization API --
export const scaleOptimizationApi = {
getOverview: async (): Promise<ScaleOverview> => {
const { data } = await api.get<ScaleOverview>('/api/analytics/scale-optimization/overview');
return data;
},
getRunRate: async (): Promise<RunRateData> => {
const { data } = await api.get<RunRateData>('/api/analytics/scale-optimization/run-rate');
return data;
},
getChannels: async (): Promise<{ channels: ChannelPerformance[] }> => {
const { data } = await api.get<{ channels: ChannelPerformance[] }>('/api/analytics/scale-optimization/channels');
return data;
},
getMatrix: async (): Promise<MatrixResponse> => {
const { data } = await api.get<MatrixResponse>('/api/analytics/scale-optimization/matrix');
return data;
},
getRecommendations: async (): Promise<RecommendationsResponse> => {
const { data } = await api.get<RecommendationsResponse>('/api/analytics/scale-optimization/recommendations');
return data;
},
};