Recoma în Shopify
Shopify nu lasă pe nimeni să se bage în validarea cupoanelor la checkout — asta e o cutie închisă. Deci integrarea arată altfel decât pe WooCommerce, și e important să știi asta înainte să începi.
Cum se leagă
Creezi codul în ambele locuri, cu același nume și aceeași reducere. În Shopify, caDiscount code obișnuit. În Recoma, prin API sau din aplicație, cu persoana care îl promovează ca payee și procentul ei de comision.
Clientul folosește codul normal, la checkout-ul Shopify. Tu asculți webhook-ul orders/create și, dacă în comandă apare un cod pe care îl are și Recoma, îl înregistrezi la noi. Restul — cine a adus vânzarea, cât are de încasat, extrasul lunar — urmează de la sine.
Webhook-ul orders/create
import crypto from "node:crypto";
const RECOMA = "https://api.recoma.ro";
export async function POST(request) {
const raw = await request.text();
// Verifică întâi semnătura Shopify: acest endpoint e public.
const digest = crypto
.createHmac("sha256", process.env.SHOPIFY_WEBHOOK_SECRET)
.update(raw, "utf8")
.digest("base64");
if (digest !== request.headers.get("x-shopify-hmac-sha256")) {
return new Response("unauthorized", { status: 401 });
}
const order = JSON.parse(raw);
for (const discount of order.discount_codes ?? []) {
const res = await fetch(
`${RECOMA}/v1/codes/${encodeURIComponent(discount.code)}/redeem`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RECOMA_KEY}`,
"Content-Type": "application/json",
// Shopify repetă webhook-urile. Cu asta, o repetare nu costă
// un al doilea comision.
"Idempotency-Key": `shopify-${order.id}`,
},
body: JSON.stringify({
// Produsele înainte de reducere, fără transport.
order_value: Number(order.subtotal_price) + Number(discount.amount),
order_ref: order.name,
customer_ref: order.email,
}),
},
);
// 404 = codul nu e al nostru, e un cupon Shopify obișnuit. Normal.
if (res.status === 404) continue;
if (!res.ok) console.error("recoma redeem", await res.text());
}
return new Response("ok");
}Ascultă și refunds/create: găsești id-ul înregistrării prin GET /v1/redemptions?code=… filtrat pe order_ref, apoi apelezi /void.
Ținerea celor două coduri sincronizate
Riscul real al acestei abordări: cineva schimbă reducerea într-un singur loc. Shopify dă 20%, Recoma încă zice 10%, iar comisionul se calculează pe o bază greșită.
Două lucruri ajută. Creează codurile într-un singur pas, dintr-un script care apelează ambele API-uri. Și pune display_text în Recoma exact cum e afișat în magazin — la prima neconcordanță se vede cu ochiul liber în lista de coduri.
Reducerea reală o aplică oricum Shopify; discount din Recoma servește aici pentru a calcula corect net_amount, deci baza comisionului. Trimite order_value exact așa cum a fost, iar noi ne aliniem la el.
Dacă vrei validare în timp real
Se poate, cu Shopify Functions (planurile care le permit) — o funcție de tip discount care apelează Recoma. E semnificativ mai mult de construit și de întreținut decât varianta cu webhook, și pentru un program de recomandări rareori merită: atribuirea contează la comandă, nu la tastare.

