Connect Perfect Day to other shops.
Do you use Wix, Squarespace, Jimdo, Webflow Ecommerce, or a self-built shop? As long as your shop can send a webhook with every paid order—directly or via a service like Make.com—Perfect Day can be integrated.
Required beforehand: Go once the general preparation This involves creating a coupon, obtaining the application password, and providing the webhook URL. It takes approximately five minutes and applies to all shop systems.
The minimum requirements
-
Your shop must be able to do three things.
- Trigger order webhook when "order paid"„
- HTTP POST with Basic-Auth header send
- JSON payload construct in our format
Can your shop only send order emails and nothing else? Then use a bridge service like Zapier or Make.com, which parses the order email and makes the HTTP call.
The required JSON body
No matter where the data comes from — in the end, this JSON body must go to the webhook.
-
Payload format
Required fields:
shop_order_id,shop_type,shop_domain,customer.email,items[].coupon_idanditems[].count. Optional arecustomer.name,customer.locale,order_total_cents,currencyandplaced_at.{ "shop_order_id": "1042", "shop_type": "custom", "shop_domain": "shop.example.com", "customer": { "email": "kunde@example.com", "name": "Max Mustermann", "locale": "de" }, "items": [ { "coupon_id": 15114, "count": 1 } ], "order_total_cents": 5000, "currency": "EUR", "placed_at": "2026-05-14T10:42:00Z" } -
Auth-Header
Standard HTTP Basic Auth. You calculate the value from the username and application password.
Authorization: Basic Content Type: application/json -
Generate Base64 value
On Mac/Linux in the terminal — the result appears after
basic:echo -n "your-name:xxxx xxxx xxxx xxxx xxxx xxxx" | base64
Bridge options for shops without native webhook functionality
-
Option 1 — Zapier or Make.com
Both offer triggers for many shop systems plus an HTTP action for POST requests. Example workflow (Make.com): Trigger „Watch new orders", optional action „"Get product details"" for the coupon ID lookup, then „"HTTP → Make a request"" to the webhook URL. The free Make.com plan is sufficient for approximately 1,000 orders per month.
-
Option 2 — IFTTT, n8n, Pipedream
Same workflow, different interface. n8n It is self-hostable and therefore more GDPR-friendly. IFTTT is more limited (no complex JSON mapping).
-
Option 3 — Dedicated Bridge Server
For a custom webhook URL: Cloudflare Workers (free up to 100k requests/day), Vercel Serverless Functions, AWS Lambda, or your own Node/PHP server. Example code for Cloudflare Workers:
View full code — TypeScript · Cloudflare Worker
export default { async fetch(req: Request): Promise<Response> { if (req.method !== 'POST') return new Response('Method not allowed', { status: 405 }); const shopPayload = await req.json(); const pfdPayload = mapToPerfectDay(shopPayload); const auth = btoa('DEIN-USER:DEIN APP PWD'); const res = await fetch( 'https://plattform.deinperfectday.de/wp-json/perfectday/shop/webhook/order', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Basic ' + auth, }, body: JSON.stringify(pfdPayload), } ); return new Response(await res.text(), { status: res.status }); }, }; function mapToPerfectDay(shopPayload: any) { return { shop_order_id: shopPayload.orderNumber, shop_type: 'custom', shop_domain: shopPayload.shop?.domain, customer: { email: shopPayload.customer?.email, name: shopPayload.customer?.name, locale: 'de', }, items: shopPayload.lineItems.map((li: any) => ({ coupon_id: parseInt(li.metadata?.pfd_coupon_id, 10), count: li.quantity, })).filter((it: any) => it.coupon_id > 0), order_total_cents: Math.round(shopPayload.totalAmount * 100), currency: shopPayload.currency, placed_at: shopPayload.paidAt, }; }
Coupon ID mapping for shops without custom fields
-
Maintain mapping in the bridge
If your shop doesn't support custom fields per product (some very basic shop builders don't), you manage the mapping directly in the bridge. Prerequisite: your shop product slug must be unique and stable.
const COUPON_MAPPING: Record = { 'gutschein-25-eur': 15114, 'gutschein-50-eur': 15115, 'gutschein-100-eur': 15116, }; // In mapToPerfectDay(): const couponId = COUPON_MAPPING[li.productSlug];
Test order
-
Place and check order
Regardless of the bridge variant: Place a test order and access the platform back office under Perfect Day → Shop orders on the entry with
shop_type=customPlease wait. Check your customer mailbox for the brand email.
Troubleshooting.
The webhook cannot reach the platform server.
The platform only accepts HTTPS POSTs. Does your bridge server have a valid SSL certificate and is it publicly accessible? Test from an external connection: curl -v https://plattform.deinperfectday.de/wp-json/perfectday/shop/webhook/order must return a 401 — not „Connection Refused".
Auth is not working
The username is the WordPress username (user_login), not the email. With Base64 encoding echo -n use (without newline characters).
Other error codes (400, 403, 429)
400 = invalid JSON body (often missing customer email), 403 = the coupon ID does not belong to your account, 429 = rate limit, wait a moment and resend.
Would you prefer us to set it up for you?
Is your shop not listed here, or are you stuck during the bridge setup? Send us a support request with your shop system details, native capabilities (webhooks, custom fields, API), and sample data from a test order. We'll provide you with a pre-built mapping template or help you with your own code.
Still questions?
Which shops are "other shops"?
How much does a bridge cost via Make.com?
What if my shop doesn't support webhooks at all?
Shop connected — and now what?
Once the webhook is running, all orders will automatically appear in your back office. If you need another connection, each additional shop can be set up in just a few minutes.
Go to shop overview