diff --git a/src/app/api/webhooks/saleor/route.ts b/src/app/api/webhooks/saleor/route.ts index 5a1e181..a1d094e 100644 --- a/src/app/api/webhooks/saleor/route.ts +++ b/src/app/api/webhooks/saleor/route.ts @@ -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 currency = order.total.gross.currency; const customerName = getCustomerName(order); @@ -245,31 +245,36 @@ async function handleOrderConfirmed(order: SaleorOrder) { const customerEmail = order.userEmail; const phone = order.shippingAddress?.phone || order.billingAddress?.phone; - await sendEmailToCustomer({ - to: customerEmail, - subject: - language === "sr" - ? `Potvrda narudžbine #${order.number}` - : language === "de" - ? `Bestellbestätigung #${order.number}` - : language === "fr" - ? `Confirmation de commande #${order.number}` - : `Order Confirmation #${order.number}`, - react: OrderConfirmation({ + // Only send customer email for ORDER_CONFIRMED, not ORDER_CREATED + // This prevents duplicate emails when both events fire + if (eventType === "ORDER_CONFIRMED") { + await sendEmailToCustomer({ + to: customerEmail, + subject: + language === "sr" + ? `Potvrda narudžbine #${order.number}` + : language === "de" + ? `Bestellbestätigung #${order.number}` + : 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, - 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, - idempotencyKey: `order-confirmed/${order.id}`, - }); + idempotencyKey: `order-confirmed/${order.id}`, + }); + } + // Always send admin notification for both ORDER_CREATED and ORDER_CONFIRMED await sendEmailToAdmin({ subject: `🎉 New Order #${order.number} - ${formatPrice(order.total.gross.amount, currency)}`, react: OrderConfirmation({ @@ -469,7 +474,7 @@ async function handleSaleorWebhook( switch (event) { case "ORDER_CREATED": case "ORDER_CONFIRMED": - await handleOrderConfirmed(order); + await handleOrderConfirmed(order, event); break; case "ORDER_FULFILLED": await handleOrderFulfilled(order);