fix(webhook): prevent duplicate customer emails by only sending on ORDER_CONFIRMED
Some checks failed
Build and Deploy / build (push) Has been cancelled
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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user