diff --git a/src/lib/conversion/control.ts b/src/lib/conversion/control.ts index eff7f1d..0d60ca8 100644 --- a/src/lib/conversion/control.ts +++ b/src/lib/conversion/control.ts @@ -1,12 +1,8 @@ -import { - CustomData, - EventRequest, - EventResponse, - ServerEvent, - UserData -} from 'facebook-nodejs-business-sdk'; +import { CustomData, EventRequest, ServerEvent, UserData } from 'facebook-nodejs-business-sdk'; import type { StandardEventName } from '../types/fbq.js'; -import type { ConversionUserData } from '$lib/types/conversion.js'; +import type { ConversionResponseBody, ConversionUserData } from '$lib/types/conversion.js'; +import { dev } from '$app/environment'; +import log from 'loglevel'; /** * Builds UserData for conversion events. @@ -90,7 +86,8 @@ export class ConversionControl { } /** - * Sends a conversion event to Meta Pixel. + * Sends a conversion event to Meta Pixel. Requires a test event code for + * events to be sent to Meta when in development mode. * * @param eventName - The name of the standard event to send. * @param options - Additional options for the event. @@ -99,7 +96,7 @@ export class ConversionControl { async trackEvent( eventName: StandardEventName, options: ConversionEventOptions - ): Promise { + ): Promise { const event = new ServerEvent() .setEventName(eventName) .setEventTime(Math.floor(Date.now() / 1000)) @@ -110,8 +107,35 @@ export class ConversionControl { if (options?.eventSourceURL) event.setEventSourceUrl(options.eventSourceURL); if (options?.customData) event.setCustomData(options.customData); + // If we're in dev mode and missing a test event code, log and exit + if (dev && !this._testEventCode) { + log.info( + `[ConversionControl] ${eventName} event not sent - missing test event code in dev mode.` + ); + return Promise.resolve({ + pixelID: this._pixelID, + fbtrace_id: 'dev-mode-no-test-event-code', + receivedEvents: 1, + processedEvents: 0, + messages: ['Event not sent - missing test event code in dev mode.'] + }); + } + const req = new EventRequest(this._accessToken, this._pixelID).setEvents([event]); if (this._testEventCode) req.setTestEventCode(this._testEventCode); - return req.execute(); + const response = await req.execute(); + + const structuredResponse: ConversionResponseBody = { + pixelID: response.id, + fbtrace_id: response.fbtrace_id, + receivedEvents: response.events_received, + processedEvents: response.num_processed_entries, + messages: response.messages + }; + + log.debug( + `[ConversionControl] Sent ${eventName}, Event response: ${JSON.stringify(structuredResponse)}` + ); + return structuredResponse; } } diff --git a/src/lib/conversion/server.ts b/src/lib/conversion/server.ts index f7e5f0f..0d17b21 100644 --- a/src/lib/conversion/server.ts +++ b/src/lib/conversion/server.ts @@ -1,10 +1,6 @@ import { json, type RequestHandler } from '@sveltejs/kit'; import { buildConversionUserData, buildCustomData, ConversionControl } from './control.ts'; -import type { - ConversionErrorResponseBody, - ConversionRequestBody, - ConversionResponseBody -} from '$lib/types/conversion.js'; +import type { ConversionErrorResponseBody, ConversionRequestBody } from '$lib/types/conversion.js'; import { StatusCodes } from 'http-status-codes'; @@ -46,16 +42,7 @@ export const createConversionRequestHandler: (control: ConversionControl) => Req customData }); - // Structure the response - const structuredResponse: ConversionResponseBody = { - pixelID: response.id, - fbtrace_id: response.fbtrace_id, - receivedEvents: response.events_received, - processedEvents: response.num_processed_entries, - messages: response.messages - }; - - return json(structuredResponse, { status: StatusCodes.OK }); + return json(response, { status: StatusCodes.OK }); } catch (e) { return json( { error: e instanceof Error ? e.message : String(e) } as ConversionErrorResponseBody,