SEPA Direct Debit payment method for Shopware 6.7 with mandate management, IBAN validation and PDF export.
This plugin is NOT a Payment Provider!
The plugin only provides capture and management of SEPA mandates. It does NOT include:
- No automatic debiting - You must submit direct debits to your bank yourself
- No risk or credit check - There is no fraud detection or scoring
- No payment guarantee - Chargebacks are possible and must be managed yourself
The plugin is ideal for merchants who already have direct bank access for direct debit collection and want to integrate mandate management into Shopware.
Installation via the Shopware Store is recommended. After purchase, you can install the plugin directly via the backend.
Add the private Composer repository to your shop's composer.json:
{
"repositories": [
{
"type": "composer",
"url": "https://packeton.markus-michalski.net"
}
]
}
Note: Repository credentials will be provided after license purchase.
composer require mmd/sepa-payment
Enter the credentials you received with your license when prompted.
bin/console plugin:refresh
bin/console plugin:install --activate MmdSepaPayment
bin/console database:migrate MmdSepaPayment --all
bin/console cache:clear
bin/build-storefront.sh
Update to the latest version:
composer update mmd/sepa-payment
bin/console database:migrate MmdSepaPayment --all
bin/console cache:clear
Plugin configuration in Shopware Admin under:
Settings > Extensions > SEPA Direct Debit
| Setting | Required | Description |
|---|---|---|
| Creditor Name | Yes | Your company name for the mandate |
| Creditor ID | Yes | SEPA Creditor Identification Number |
| Creditor IBAN | Yes | IBAN of your business account |
| Creditor BIC | No | BIC/SWIFT (optional for domestic payments) |
Request Creditor ID: You can request the Creditor Identification Number from the Deutsche Bundesbank: bundesbank.de
| Setting | Default | Description |
|---|---|---|
| Mandate Text | Default | Legal text displayed at checkout |
| Reference Prefix | SEPA | Prefix for mandate references |
After ordering, you can find the mandate data:
The plugin dispatches an event when a SEPA mandate is created. This allows other plugins to react to mandate creation - ideal for integrations with ERP, CRM, accounting or other systems.
Event Name: mmd.sepa_payment.mandate.created
Event Class: Mmd\SepaPayment\Event\MandateCreatedEvent
| Method | Return | Description |
|---|---|---|
getMandateId() |
string |
UUID of created mandate |
getCustomerId() |
string |
UUID of customer |
getOrderId() |
string |
UUID of associated order |
getContext() |
Context |
Shopware Context |
getMandate() |
SepaMandateEntity\|null |
Complete mandate entity |
<?php
namespace MyPlugin\Subscriber;
use Mmd\SepaPayment\Event\MandateCreatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SepaMandateSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly MyErpService $erpService,
) {}
public static function getSubscribedEvents(): array
{
return [
'mmd.sepa_payment.mandate.created' => 'onMandateCreated',
];
}
public function onMandateCreated(MandateCreatedEvent $event): void
{
$mandateId = $event->getMandateId();
$customerId = $event->getCustomerId();
$orderId = $event->getOrderId();
$mandate = $event->getMandate();
// Example: Send to ERP system
$this->erpService->syncMandate([
'mandate_reference' => $mandate->getMandateReference(),
'account_holder' => $mandate->getAccountHolder(),
'signed_at' => $mandate->getSignedAt(),
]);
}
}
If your plugin should only optionally support the SEPA plugin (not as required dependency):
<!-- services.xml -->
<service id="MyPlugin\Subscriber\SepaMandateSubscriber">
<argument type="service" id="my_service"/>
<tag name="kernel.event_subscriber"/>
</service>
// Use event name as string (no hard dependency on event class)
public static function getSubscribedEvents(): array
{
return [
'mmd.sepa_payment.mandate.created' => 'onMandateCreated',
];
}
public function onMandateCreated(object $event): void
{
// Type as object, not MandateCreatedEvent
$mandateId = $event->getMandateId();
// ...
}
Use the service for mandate operations in your plugin:
<?php
use Mmd\SepaPayment\Service\Contract\SepaMandateServiceInterface;
class MyService
{
public function __construct(
private readonly SepaMandateServiceInterface $mandateService,
) {}
public function getCustomerMandate(string $customerId, Context $context): ?array
{
$mandate = $this->mandateService->getMandateByCustomerId($customerId, $context);
if ($mandate === null) {
return null;
}
return [
'reference' => $mandate->getMandateReference(),
'iban_masked' => $this->mandateService->getMaskedIban($mandate),
'iban_decrypted' => $this->mandateService->getDecryptedIban($mandate),
'account_holder' => $mandate->getAccountHolder(),
'bic' => $mandate->getBic(),
'signed_at' => $mandate->getSignedAt(),
'status' => $mandate->getStatus(),
];
}
}
| Method | Description |
|---|---|
getMandateByCustomerId() |
Get active mandate for customer |
getMandateById() |
Get mandate by UUID |
hasActiveMandate() |
Check if customer has active mandate |
getDecryptedIban() |
Get decrypted IBAN |
getMaskedIban() |
Get masked IBAN (DE89****3456) for display |
The event enables various integrations:
Automatically update customer master data in SAP, DATEV, Lexware or other ERP systems when a new mandate is created.
Send mandate data to Salesforce, HubSpot, Pipedrive or other CRM systems for complete customer data.
Notification to sevDesk, FastBill, QuickBooks when new direct debit mandates are available.
Logging of all mandate creations for SEPA compliance and audit trails.
Automatic email confirmation to customers upon successful mandate creation.
Connect with Zapier, Make (Integromat), n8n for any automations.
Commercial license - Single installation license includes:
See LICENSE file for full terms.
For questions and support:
Markus Michalski
Email: support@markus-michalski.net