Zum Inhalt springen
 Shopware 6 · 20–30 Min · fortgeschritten

Perfect Day in Shopware 6 anbinden.

Verkauf deine Perfect-Day-Coupons über deinen Shopware-6-Shop. Shopware liefert keinen Webhook mit Custom-Field-Inhalt out of the box — du brauchst eine kleine Bridge. Hinweis: Diese Anleitung gilt für Shopware 6. Für Shopware 5 kontaktiere bitte den Support.

Vorab nötig: Geh einmal die allgemeine Vorbereitung durch — Coupon anlegen, Anwendungspasswort holen, Webhook-URL bereitlegen. Dauert rund fünf Minuten und gilt für alle Shop-Systeme.

Schritt 1 — Custom-Field für die Coupon-ID anlegen

  1. Zusatzfeld-Set erstellen

    Shopware-Admin → Einstellungen → System → Zusatzfelder„Sets erstellen". Set-Name: Perfect Day. Unter Zuweisungen die Option „Produkt" auswählen.

  2. Feld hinzufügen

    Neues Feld mit diesen Werten:

    • Technischer Name: pfd_coupon_id
    • Typ: Zahl (Integer)
    • Anzeigename: Perfect Day Coupon-ID

    Speichern.

Schritt 2 — Coupon-ID pro Produkt eintragen

  1. Im Produkt-Editor eintragen

    Shopware-Admin → Kataloge → Produkte → Produkt öffnen → Reiter „Spezifikationen" → Block „Zusatzfelder". Setze „Perfect Day Coupon-ID" auf den Wert aus dem Plattform-Backoffice (z. B. 15114) und speichere.

Schritt 3 — Bridge-App installieren

Shopware liefert keinen Webhook mit Custom-Field-Inhalt mit. Du brauchst eine kleine Shopware-App, die das übernimmt. Wir haben ein App-Skelett vorbereitet — auf Support-Anfrage bekommst du es fertig. Oder du baust es nach dieser Vorlage.

  1. App-Manifest (manifest.xml)

    Das Manifest registriert die App und den Order-Paid-Webhook. Trag deine Bridge-Domain in das url-Attribut ein.

    Vollständigen Code anzeigen — XML · manifest.xml
    XML · manifest.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/platform/trunk/src/Core/Framework/App/Manifest/Schema/manifest-1.0.xsd">
        <meta>
            <name>PerfectDayConnector</name>
            <label>Perfect Day Connector</label>
            <description>Schickt Bestelldaten mit Perfect-Day-Coupon-IDs an die Plattform.</description>
            <author>DigElite</author>
            <copyright>(c) DigElite</copyright>
            <version>1.0.0</version>
            <license>MIT</license>
        </meta>
        <webhooks>
            <webhook name="order-paid"
                     url="https://DEINE-BRIDGE-DOMAIN.example/bridge"
                     event="state_enter.order_transaction.state.paid"/>
        </webhooks>
    </manifest>
  2. Bridge-Endpoint (eigener Server)

    Die Bridge nimmt den Shopware-Webhook entgegen, holt pro Position das Custom-Field, transformiert ins Perfect-Day-Format und schickt es weiter. Beispiel in PHP:

    Vollständigen Code anzeigen — PHP · bridge.php
    PHP · bridge.php
    <?php
    // bridge.php — empfängt Shopware-Webhook, ruft Shopware-API für
    // Produktdetails, leitet ans Perfect Day weiter.
    
    $rawPayload = file_get_contents('php://input');
    $payload = json_decode($rawPayload, true);
    $order = $payload['data']['payload']['order'] ?? null;
    if (!$order) { http_response_code(400); exit; }
    
    // Shopware-API-Token holen (Server-zu-Server, eigene Credentials)
    $swToken = sw_admin_token();
    
    $items = [];
    foreach ($order['lineItems'] as $li) {
        $product = sw_api_get('/api/product/' . $li['productId'], $swToken);
        $couponId = $product['customFields']['pfd_coupon_id'] ?? null;
        if (!$couponId) continue;
        $items[] = ['coupon_id' => (int)$couponId, 'count' => (int)$li['quantity']];
    }
    if (empty($items)) { http_response_code(200); exit; }
    
    $pfdPayload = [
        'shop_order_id' => $order['orderNumber'],
        'shop_type'     => 'shopware',
        'shop_domain'   => parse_url($order['salesChannel']['domains'][0]['url'], PHP_URL_HOST),
        'customer' => [
            'email'  => $order['orderCustomer']['email'],
            'name'   => trim($order['orderCustomer']['firstName'] . ' ' . $order['orderCustomer']['lastName']),
            'locale' => substr($order['language']['locale']['code'], 0, 2),
        ],
        'items'             => $items,
        'order_total_cents' => (int) round(($order['amountTotal'] ?? 0) * 100),
        'currency'          => $order['currency']['isoCode'] ?? 'EUR',
        'placed_at'         => $order['orderDateTime'] ?? gmdate('c'),
    ];
    
    $ch = curl_init('https://plattform.deinperfectday.de/wp-json/perfectday/shop/webhook/order');
    curl_setopt_array($ch, [
        CURLOPT_POST           => 1,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Basic ' . base64_encode('DEIN-USER:DEIN APP PWD'),
        ],
        CURLOPT_POSTFIELDS => json_encode($pfdPayload),
        CURLOPT_TIMEOUT    => 15,
    ]);
    curl_exec($ch);
    curl_close($ch);
    
    http_response_code(200);
  3. App-ZIP packen und installieren

    Manifest und Bridge-URL in eine app.zip packen (siehe Shopware-Docs). Dann Shopware-Admin → Erweiterungen → Eigene Erweiterungen hochladen → ZIP rein → aktivieren.

Einfacher: Cloud-Bridge nutzen

Wenn dir eine eigene Bridge zu komplex ist, geht es auch ohne eigenen Server.

  1. Make.com, Zapier oder n8n

    Make.com: Modul „Webhooks → Custom webhook" als Trigger, „Shopware → Get a Product" zur Anreicherung, „HTTP → Make a request" als Output — rund 15 Min Setup. n8n ist selbst hostbar und damit DSGVO-freundlicher. Schick uns einen Support-Request mit deinem bevorzugten Tool, dann liefern wir einen vorkonfigurierten Workflow.

Schritt 4 — Test-Bestellung

  1. Bestellung auslösen und prüfen

    Test-Bestellung durchführen, Zahlung auf „Bezahlt" setzen. Die Bridge sollte automatisch von Shopware aufgerufen werden. Prüfen: Plattform-Backoffice → Perfect Day → Shop-Bestellungen (Eintrag mit shop_type=shopware?) und die Kunden-Mailbox auf die Brand-Mail mit Druck-Button.

Wenn etwas klemmt

Troubleshooting.

Webhook wurde nicht ausgeführt

Shopware-Admin → Einstellungen → System → Logs → App-Webhooks. Stehen dort Fehler, ist meist die App-Manifest-URL falsch oder die Bridge nicht erreichbar.

HTTP 401 am Perfect-Day-Endpoint

Username oder Anwendungspasswort im Bridge-Code falsch. wp-config.php-Konstanten sind sicherer als hardcodierte Werte.

HTTP 403 — forbidden_coupon

Die pfd_coupon_id aus dem Custom-Field gehört nicht zu deinem Anbieter-Account auf der Plattform.

Bridge-Server nicht erreichbar

Läuft die Bridge auf deinem eigenen Server: SSL-Zertifikat gültig? Server öffentlich erreichbar? Shopware muss POST-Requests von seinem Cloud-Backend an deinen Server schicken können.

Setup-Service

Lieber von uns einrichten lassen?

Shopware ist deutlich komplexer als Shopify oder WooCommerce — wegen der Bridge-Pflicht. Wir bieten dir eine fertig integrierte Shopware-App mit eingebauter Bridge, oder wir hosten die Bridge komplett auf unseren Servern. Du gibst uns nur deine Shopware-API-Zugangsdaten.

Häufige Fragen

Noch Fragen?

Geht das auch ohne eigenen Server?
Ja. Statt einer selbst gehosteten Bridge kannst du Make.com, Zapier oder ein selbst gehostetes n8n nutzen. Wir liefern dir auf Anfrage einen vorkonfigurierten Workflow.
Funktioniert die Anleitung auch für Shopware 5?
Nein. Shopware 5 hat keinen Custom-Field-Webhook-Support — dort ist ein eigenes Plugin nötig. Schick uns einen Support-Request, wenn du Shopware 5 nutzt.
Plant ihr ein natives Shopware-Plugin?
Ja, mittelfristig. Ein natives Plugin würde das Bridge-Setup überflüssig machen. Die Reihenfolge richtet sich nach der Nachfrage — meld dich, wenn du Interesse hast.

Shop verbunden — und jetzt?

Sobald der Webhook läuft, erscheinen alle Bestellungen automatisch in deinem Backoffice. Brauchst du eine weitere Anbindung, geht jeder weitere Shop in wenigen Minuten.

Zur Shop-Übersicht