import { axiosInstance } from './client';
// ─── Types ────────────────────────────────────────────────────────────────
export type FacebookCampaignStatus = 'ACTIVE' | 'PAUSED' | 'DELETED' | 'UNKNOWN';
export interface FacebookAdsCampaign {
id: string;
company_id: string;
external_id: string;
name: string;
status: FacebookCampaignStatus;
budget: number | null;
budget_type: string;
channel_type: string;
start_date?: string;
end_date?: string;
parent_campaign_id?: string;
total_spend: number;
total_clicks: number;
total_conversions: number;
metadata?: Record<string, unknown>;
created_at: string;
updated_at: string;
}
export interface FacebookAdsMetric {
id: string;
company_id: string;
external_campaign_id: string;
metric_date: string;
spend: number;
impressions: number;
clicks: number;
conversions: number;
ctr: number | null;
cpc: number | null;
cpv: number | null;
roas: number | null;
created_at: string;
}
export interface FacebookAdsAnalytics {
total_campaigns: number;
active_campaigns: number;
paused_campaigns: number;
total_spend_30d: number;
total_spend_90d: number;
total_spend_ytd: number;
total_impressions_30d: number;
total_clicks_30d: number;
total_conversions_30d: number;
avg_ctr: number;
avg_cpc: number;
avg_cpa: number;
total_roas: number;
campaigns_by_status?: { status: string; count: number; total_budget: number }[];
campaigns_by_channel?: { channel_type: string; count: number; total_spend: number }[];
top_campaigns?: { name: string; external_id: string; spend: number; clicks: number; conversions: number; status: string }[];
daily_spend_trend?: { date: string; spend: number; clicks: number; impressions: number; conversions: number }[];
}
// ─── API ──────────────────────────────────────────────────────────────────
const baseUrl = (companyId: string) => `/api/company/${companyId}/facebook_ads`;
export const facebookAdsApi = {
// Campaigns
async getCampaigns(
companyId: string,
params?: { status?: string; search?: string; channel?: string; page?: number; per_page?: number }
): Promise<{ success: boolean; data: { items: FacebookAdsCampaign[]; total: number; page: number; per_page: number } }> {
const response = await axiosInstance.get(`${baseUrl(companyId)}/campaigns`, { params });
return response.data;
},
async getCampaign(
companyId: string,
campaignId: string
): Promise<{ success: boolean; data: FacebookAdsCampaign }> {
const response = await axiosInstance.get(`${baseUrl(companyId)}/campaigns/${campaignId}`);
return response.data;
},
// Metrics
async getMetrics(
companyId: string,
params?: { campaign_id?: string; date_from?: string; date_to?: string; page?: number; per_page?: number }
): Promise<{ success: boolean; data: { items: FacebookAdsMetric[]; total: number; page: number; per_page: number } }> {
const response = await axiosInstance.get(`${baseUrl(companyId)}/metrics`, { params });
return response.data;
},
// Analytics
async getAnalytics(companyId: string): Promise<{ success: boolean; data: FacebookAdsAnalytics }> {
const response = await axiosInstance.get(`${baseUrl(companyId)}/analytics`);
return response.data;
},
// Sync
async sync(companyId: string): Promise<{ success: boolean; data: { message: string } }> {
const response = await axiosInstance.post(`${baseUrl(companyId)}/sync`);
return response.data;
},
};