Infraestrutura Edge Server-Side
Meta CAPI Gateway Zero Custo em Cloudflare Workers
Código oficial de Cloudflare Worker para rodar a API de Conversões do Meta no plano gratuito (até 100.000 requisições/dia), eliminando servidores pagos de terceiros.
Comparativo de Economia
Stape.io / AWS: US$ 20 a US$ 100/mês por cliente (R$ 1.200 a R$ 6.000/ano desperdiçados em infraestrutura de servidores).
Cloudflare Workers: R$ 0,00 (Plano Free inclui 100.000 requisições diárias com latência global abaixo de 20ms).
🚀 Edge Hashing: O worker criptografa e-mails e telefones em SHA-256 diretamente na borda da CDN antes de enviar à API do Meta.
Código worker.js (Edge Meta CAPI)
Cloudflare Workers v2026export default {
async fetch(request, env) {
if (request.method !== 'POST') {
return new Response('Meta CAPI Gateway Active', { status: 200 });
}
try {
const data = await request.json();
const pixelId = env.PIXEL_ID || data.pixel_id;
const accessToken = env.ACCESS_TOKEN || data.access_token;
// Hash SHA-256 nativo via Web Crypto
async function hash(str) {
if (!str) return undefined;
const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(str.trim().toLowerCase()));
return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join('');
}
const clientIp = request.headers.get('cf-connecting-ip');
const userAgent = request.headers.get('user-agent');
const payload = {
data: [{
event_name: data.event_name,
event_time: Math.floor(Date.now() / 1000),
event_id: data.event_id,
event_source_url: data.event_source_url,
action_source: "website",
user_data: {
em: await hash(data.email),
ph: await hash(data.phone),
client_ip_address: clientIp,
client_user_agent: userAgent,
fbp: data.fbp,
fbc: data.fbc
},
custom_data: data.custom_data
}]
};
const metaUrl = `https://graph.facebook.com/v19.0/${pixelId}/events?access_token=${accessToken}`;
const metaRes = await fetch(metaUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
return new Response(await metaRes.text(), {
status: metaRes.status,
headers: { 'Content-Type': 'application/json' }
});
} catch (err) {
return new Response(JSON.stringify({ error: err.message }), { status: 500 });
}
}
};