Waarom een app en geen plugin
Een Shopware-plugin is PHP die in de shop draait; een app is een manifest dat Shopware vertelt welke URL's het moet aanroepen. Voor ordertracking is de app genoeg: Shopware stuurt ondertekende webhooks voor de events waarop je je abonneert, en er wordt niets van Track in de shop uitgevoerd. integrations/shopware/manifest.xml is dat manifest.
Registratie
Bij app:install roept Shopware de registratie-URL van de app aan met shop-id, shop-url en een tijdstempel, ondertekend in de header shopware-app-signature met het app-secret uit het manifest. De collector verifieert de handtekening, antwoordt met een proof (HMAC-SHA256 over shop-ID, shop-URL en appnaam) en een shop-secret, en Shopware bevestigt door API-credentials naar de bevestigings-URL te posten. Track gooit die credentials bewust weg: de integratie ontvangt alleen webhooks en roept nooit de API van de shop aan. Het secret dat je in de verbinding hebt opgeslagen, dient als app-secret én als shop-secret, zodat elke latere webhook wordt geverifieerd met shopware-shop-signature, de hex-gecodeerde HMAC-SHA256 van de ruwe body.
Welke events wat worden
| Shopware-event | Track-event |
|---|---|
state_enter.order_transaction.state.paid | purchase |
state_enter.order_transaction.state.refunded | refund (ordertotaal) |
checkout.order.placed | purchase, alleen wanneer de verbinding is ingesteld op het tellen van geplaatste bestellingen |
De standaard telt de betaalde transactie, niet de geplaatste bestelling. Bij shops met vooruitbetaling of betaling op factuur kan een bestelling dagenlang onbetaald blijven of nooit worden betaald; die bij het plaatsen tellen blaast de omzet op en leert advertentieplatformen het verkeerde. Shops waar het plaatsen het betekenisvolle moment is (rembours, B2B-facturatie), zetten de verbinding om naar geplaatst.
De aankoop draagt de order-ID, het ordernummer als transactie-ID, het bruto- en nettobedrag (belasting als het verschil), verzendkosten, valuta, productregels op productnummer, en het e-mailadres, de naam en de factuurplaats, -postcode en het factuurland van de bestellende klant als ruwe matchinggegevens die de router hasht. Promotie- en verzendregels zijn geen producten en worden overgeslagen.
Valuta
De events paid en refunded dragen in huidige Shopware-versies de bestelling met haar valuta-associatie. Laat een versie die weg, dan geldt de fallbackvaluta van de verbinding; ontbreekt die ook, dan wordt het event zonder valuta opgeslagen en meldt de destination-monitor het ontbrekende veld in plaats van te raden.
Het storefront-snippet
Voeg het standaard-snippet toe aan de base.html.twig van je theme, in het blok base_head. Het dekt de storefront en de afrondingspagina van de checkout, die Shopware zelf rendert, zodat de browseraankoop — met de toestemmingsregistratie en click-ID's van de bezoeker — naast de webhook bestaat. Het koppelen op order-ID laat de geverifieerde serveraankoop die toestemming vervolgens overerven; zonder browseraankoop blijft het serverrecord operationeel en bereikt het geen enkele advertentie-destination.
Instellen
- Site → Shopverbinding → Shopware 6: shopdomein, fallbackvaluta, aankoopmoment; sla een secret op (32 willekeurige tekens); kopieer de registratie-URL.
- Zet het manifest in
custom/apps/TrackSite/manifest.xml, vervang tracking-ID, padtoken en secret, en voerbin/console app:install --activate TrackSiteuit. - Markeer de transactie van een testbestelling als betaald. De verbinding meldt de registratie en de eerste webhook; de debugger toont de shopware-aankoop.
Beperkingen
- Een tweede gedeeltelijke terugbetaling op dezelfde bestelling wordt op order-ID gededupliceerd; de eerste wordt geregistreerd.
- Apps kunnen zelf geen storefront-scripts injecteren; het snippet is een theme-wijziging, gedocumenteerd in de README.
- Bestellingen die na betaling in de admin worden bewerkt, versturen het betaald-event niet opnieuw; waardecorrecties gebeuren in je eigen rapportage, niet bij de leveranciers.