Liquid, JavaScript, Temas
Olá,
Estou tentando configurar o envio de um webhook para o GTM server side para o disparo de um evento no GA4 quando um pedido é pago.
Dentro do painel da Shopify, vou em notificações, crio o webhook "pagamento de pedido" e insiro a url do custom domain configurado no Stape (a mesma url que está no GTM ss).
Quando envio os testes do webhook, a solicitação não aparece no painel de depuração do GTM. Ao olhar os logs dentro da Stape, as solicitações aparecem com o status 400.
Já tentei configurar um client personalizado no GTM ss para capturar esse webhook:
const CLIENT_NAME = 'Shopify Webhook Client';
const logToConsole = require('logToConsole');
const returnResponse = require('returnResponse');
function onRequest(event) {
const request = event.request;
// Verifica se é uma requisição POST
if (request.method !== 'POST') {
logToConsole('Método não suportado: ' + request.method);
returnResponse({ statusCode: 405 });
return null;
}
// Captura todas as requisições POST, mas filtra apenas as que vêm da Shopify
if (!request.headers['X-Shopify-Topic']) {
logToConsole('Requisição sem cabeçalho X-Shopify-Topic');
returnResponse({ statusCode: 400 });
return null;
}
// Lê o corpo da requisição JSON
let requestBody;
if (request.headers['content-type'] === 'application/json' && request.body) {
requestBody = request.json();
} else {
logToConsole('Conteúdo não é JSON ou corpo vazio.');
returnResponse({ statusCode: 400 });
return null;
}
// Verifica se há um objeto 'order' no JSON recebido
if (!requestBody.order) {
logToConsole('Objeto "order" não encontrado no corpo da requisição.');
returnResponse({ statusCode: 422 });
return null;
}
// Extrai dados relevantes do pedido
const eventData = {
event_name: request.headers['X-Shopify-Topic'] ? request.headers['X-Shopify-Topic'] : '',
order_id: requestBody.order.id ? requestBody.order.id : '',
total_price: requestBody.order.total_price ? requestBody.order.total_price : '',
currency: requestBody.order.currency ? requestBody.order.currency : '',
email: requestBody.order.contact_email ? requestBody.order.contact_email : '',
payment_method: requestBody.order.note_attributes
? getAttributeValue(requestBody.order.note_attributes, 'payment_method')
: '',
discount_code: requestBody.order.discount_codes && requestBody.order.discount_codes.length > 0
? requestBody.order.discount_codes[0].code
: ''
};
logToConsole('Evento Capturado:', eventData);
return {
name: CLIENT_NAME,
data: eventData
};
}
// Função auxiliar para buscar um atributo específico na lista de note_attributes
function getAttributeValue(attributes, key) {
if (attributes && typeof attributes === 'object' && attributes.length) {
for (let i = 0; i < attributes.length; i++) {
if (attributes[i].name === key) {
return attributes[i].value;
}
}
}
return '';
}
Mas sem sucesso.
Alguém já tentou esse processo e poderia me dar uma luz?
Saiba como expandir as operações em âmbito global com o caminho de aprendizado e o selo...
By Shopify Feb 7, 2025Comece a vender no atacado com o roteiro de aprendizado da Shopify Academy, B2B on Shop...
By Shopify Jan 31, 2025Você é aquele lojista que criou múltiplas lojas para usufruir do período de avaliação...
By Paula Aug 15, 2024