fix(webhook): prevent duplicate customer emails by only sending on ORDER_CONFIRMED
Some checks failed
Build and Deploy / build (push) Has been cancelled

Both ORDER_CREATED and ORDER_CONFIRMED were sending customer emails,
causing duplicates. Now only ORDER_CONFIRMED sends customer emails,
while both events still notify admins.
This commit is contained in:
Unchained
2026-03-25 16:17:35 +02:00
parent eb311568db
commit bf628f873f

View File

@@ -237,7 +237,7 @@ function parseOrderItems(lines: SaleorLineItem[], currency: string) {
})); }));
} }
async function handleOrderConfirmed(order: SaleorOrder) { async function handleOrderConfirmed(order: SaleorOrder, eventType: string) {
const language = getCustomerLanguage(order); const language = getCustomerLanguage(order);
const currency = order.total.gross.currency; const currency = order.total.gross.currency;
const customerName = getCustomerName(order); const customerName = getCustomerName(order);
@@ -245,31 +245,36 @@ async function handleOrderConfirmed(order: SaleorOrder) {
const customerEmail = order.userEmail; const customerEmail = order.userEmail;
const phone = order.shippingAddress?.phone || order.billingAddress?.phone; const phone = order.shippingAddress?.phone || order.billingAddress?.phone;
await sendEmailToCustomer({ // Only send customer email for ORDER_CONFIRMED, not ORDER_CREATED
to: customerEmail, // This prevents duplicate emails when both events fire
subject: if (eventType === "ORDER_CONFIRMED") {
language === "sr" await sendEmailToCustomer({
? `Potvrda narudžbine #${order.number}` to: customerEmail,
: language === "de" subject:
? `Bestellbestätigung #${order.number}` language === "sr"
: language === "fr" ? `Potvrda narudžbine #${order.number}`
? `Confirmation de commande #${order.number}` : language === "de"
: `Order Confirmation #${order.number}`, ? `Bestellbestätigung #${order.number}`
react: OrderConfirmation({ : language === "fr"
? `Confirmation de commande #${order.number}`
: `Order Confirmation #${order.number}`,
react: OrderConfirmation({
language,
orderId: order.id,
orderNumber: order.number,
customerEmail,
customerName,
items: parseOrderItems(order.lines, currency),
total: formatPrice(order.total.gross.amount, currency),
shippingAddress: formatAddress(order.shippingAddress),
siteUrl: SITE_URL,
}),
language, language,
orderId: order.id, idempotencyKey: `order-confirmed/${order.id}`,
orderNumber: order.number, });
customerEmail, }
customerName,
items: parseOrderItems(order.lines, currency),
total: formatPrice(order.total.gross.amount, currency),
shippingAddress: formatAddress(order.shippingAddress),
siteUrl: SITE_URL,
}),
language,
idempotencyKey: `order-confirmed/${order.id}`,
});
// Always send admin notification for both ORDER_CREATED and ORDER_CONFIRMED
await sendEmailToAdmin({ await sendEmailToAdmin({
subject: `🎉 New Order #${order.number} - ${formatPrice(order.total.gross.amount, currency)}`, subject: `🎉 New Order #${order.number} - ${formatPrice(order.total.gross.amount, currency)}`,
react: OrderConfirmation({ react: OrderConfirmation({
@@ -469,7 +474,7 @@ async function handleSaleorWebhook(
switch (event) { switch (event) {
case "ORDER_CREATED": case "ORDER_CREATED":
case "ORDER_CONFIRMED": case "ORDER_CONFIRMED":
await handleOrderConfirmed(order); await handleOrderConfirmed(order, event);
break; break;
case "ORDER_FULFILLED": case "ORDER_FULFILLED":
await handleOrderFulfilled(order); await handleOrderFulfilled(order);