interface UserData { em?: string; client_user_agent?: string; client_ip_address?: string; } interface CustomData { location?: string; } interface MetaPixelEvent { event_name: string; event_time: number; event_source_url: string; action_source: string; user_data: UserData; custom_data?: CustomData; event_id: string; } interface MetaPixelPayload { data: MetaPixelEvent[]; access_token: string; } async function hashEmail(email: string): Promise { const encoder = new TextEncoder(); const data = encoder.encode(email.toLowerCase().trim()); const hashBuffer = await crypto.subtle.digest('SHA-256', data); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map(byte => byte.toString(16).padStart(2, '0')).join(''); } function generateEventId(): string { const array = new Uint8Array(16); crypto.getRandomValues(array); return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join(''); } export async function sendCompleteRegistrationEvent( email: string, eventSourceUrl: string, userAgent?: string, clientIpAddress?: string, location?: string ): Promise { try { const pixelId = process.env.META_PIXEL_ID || import.meta.env.META_PIXEL_ID; const accessToken = process.env.META_PIXEL_ACCESS_TOKEN || import.meta.env.META_PIXEL_ACCESS_TOKEN; if (!pixelId || !accessToken) { return false; } const userData: UserData = { em: await hashEmail(email), }; if (userAgent) { userData.client_user_agent = userAgent; } if (clientIpAddress) { userData.client_ip_address = clientIpAddress; } const customData: CustomData = {}; if (location) { customData.location = location; } const event: MetaPixelEvent = { event_name: 'CompleteRegistration', event_time: Math.floor(Date.now() / 1000), event_source_url: eventSourceUrl, action_source: 'website', user_data: userData, event_id: generateEventId(), }; if (Object.keys(customData).length > 0) { event.custom_data = customData; } const payload: MetaPixelPayload = { data: [event], access_token: accessToken, }; const response = await fetch(`https://graph.facebook.com/v21.0/${pixelId}/events`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }); if (!response.ok) { return false; } return true; } catch (error) { return false; } }