From e08e919e83fea0044a125b7b45eebe2b23ac91f9 Mon Sep 17 00:00:00 2001 From: Unchained Date: Wed, 25 Mar 2026 15:10:45 +0200 Subject: [PATCH] fix(webhook): handle Saleor subscription payload format (array) Saleor sends webhook payloads as arrays in subscription format. This fix extracts the order from the array or object format. --- src/app/api/webhooks/saleor/route.ts | 29 +++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/app/api/webhooks/saleor/route.ts b/src/app/api/webhooks/saleor/route.ts index 965ee40..7e1e138 100644 --- a/src/app/api/webhooks/saleor/route.ts +++ b/src/app/api/webhooks/saleor/route.ts @@ -400,12 +400,24 @@ export async function POST(request: NextRequest) { console.log(`Received webhook: ${event} from ${domain}`); console.log("Headers:", { event, domain, apiUrl, hasSignature: !!signature }); - console.log("Payload keys:", Object.keys(body)); + console.log("Payload:", JSON.stringify(body).substring(0, 500)); - if (body.order) { - console.log("Order ID:", body.order.id); - console.log("Order number:", body.order.number); - console.log("User email:", body.order.userEmail); + // Handle Saleor subscription payload format (array of events) + let order = null; + if (Array.isArray(body)) { + // Find the order in the array + const orderEvent = body.find((item: any) => item.order); + if (orderEvent) { + order = orderEvent.order; + } + } else if (body.order) { + order = body.order; + } + + if (order) { + console.log("Order ID:", order.id); + console.log("Order number:", order.number); + console.log("User email:", order.userEmail); } if (!event) { @@ -420,9 +432,12 @@ export async function POST(request: NextRequest) { return NextResponse.json({ success: true, message: "Event not supported" }); } - const payload = body; + if (!order) { + console.error("No order found in webhook payload"); + return NextResponse.json({ error: "No order in payload" }, { status: 400 }); + } - await handleSaleorWebhook(normalizedEvent, payload); + await handleSaleorWebhook(normalizedEvent, { order }); return NextResponse.json({ success: true }); } catch (error) {