Proposals & Invoices ยท Article 5.6
Online payment via Stripe Connect โ Direct Charges, fees, 3DS, refunds
When you connect Stripe, your clients can pay invoices by card on a Clozo-hosted page. Charges go directly to your Stripe account (Direct Charge architecture); Clozo takes no platform fee on payments. Stripe's standard processing fees apply.
Stripe Connect is the architecture that lets Clozo offer card payments without ever holding your money. Once you complete the Stripe onboarding flow at /settings/payments, your business has its own Stripe account; payments your clients make flow into that account, and Stripe pays out to your bank on your normal Stripe payout schedule (typically T+2 to T+7 depending on your country and risk profile). Clozo just provides the checkout surface and the audit trail.
Step by step
Connect Stripe.
Open
/settings/paymentsand clickConnect with Stripe. You're redirected to Stripe's hosted onboarding flow. Bring an ID document and your business IBAN.Wait for
charges_enabled.When Stripe sends the
account.updatedwebhook withcharges_enabled=true, Clozo records it (apps/webhooks/views.py:548). Your/settings/paymentspage flips to a green "Stripe connected โ accepting payments" banner.Enable on a proposal.
When you create a proposal, the
online_payment_enabledtoggle is on by default. If you want SEPA only (no card), turn it off in the wizard.Send the proposal.
The deposit invoice email after signing now includes a prominent "Pay โฌX now" button alongside the SEPA QR code โ both options are presented; the client picks.
Client pays.
Stripe handles the checkout, 3DS challenge if required, and notifies Clozo via webhook (
payment_intent.succeeded). Status flips toDeposit paidtypically within 2 seconds of the client's success page.
in /settings/payments, a "Stripe connected" badge with charges_enabled and payouts_enabled status indicators. On any proposal with online payment enabled, the Documents and Actions menus include payment-status callouts. When a payment lands, the proposal Timeline gets a "Payment received via Stripe โ โฌX โ pi_*****" event with the PaymentIntent ID linked to your Stripe dashboard.
Why this works this way
Direct Charge architecture explained. Stripe Connect supports three patterns: Direct Charges, Destination Charges, and Separate Charges and Transfers. Clozo uses Direct Charges [D-012], implemented in apps/public/views.py โ see the comment "A-005: Direct Charge โ money goes to freelancer's connected account":
``python
payment_intent = stripe.PaymentIntent.create(
amount=int(amount_cents),
currency=currency.lower(),
stripe_account=proposal.user.stripe_account.account_id, # โ Direct Charge
metadata={...},
automatic_payment_methods={'enabled': True},
)
``
The stripe_account parameter is the freelancer's connected-account ID. Stripe creates the PaymentIntent on that account, not Clozo's platform account. Money never transits through Clozo's books. This has three important consequences:
1. Clozo collects no platform fee on your payments. There is no application_fee_amount on the PaymentIntent (verify in apps/public/views.py). Clozo's revenue comes from your subscription, not from your transactions.
2. Stripe's processing fees apply to the connected account, not to Clozo. You see them on your Stripe dashboard. Typical EU rates: ~1.5% + โฌ0.25 for EEA cards, ~2.5% + โฌ0.25 for non-EEA. Exact rates depend on your country and Stripe pricing tier.
3. Refunds and disputes belong to your connected account. When a client requests a refund, the refund is initiated on your account; the funds debit your balance. Clozo never holds the money to refund. See article 8.2 for the refund flow.
3D Secure 2 (PSD2 SCA). EU law (PSD2 + SCA Regulatory Technical Standards) requires Strong Customer Authentication on most consumer card payments above โฌ30. Stripe handles this automatically via 3DS2 (Three-D Secure version 2): the client's bank may issue a step-up challenge (push notification to the bank app, SMS code, biometric prompt). Stripe's automatic_payment_methods={'enabled': True} config opts you into Stripe's optimised 3DS routing โ they only challenge when required, not on every charge, which improves conversion vs always-challenge mode.
What payment methods are offered. With automatic_payment_methods enabled, Stripe auto-selects the best methods for the client's country and amount: cards (Visa, Mastercard, Amex), and where eligible, SEPA Direct Debit, iDEAL (NL), Bancontact (BE), Giropay (DE), EPS (AT), Przelewy24 (PL), and others. The set of methods you see on your Stripe dashboard is a subset of these; you can disable specific methods in your Stripe account settings.
Onboarding requirements. Stripe runs KYC/KYB at onboarding under EU AMLD5: business name + address, ID document (passport or national ID), proof of bank account (IBAN), beneficial-owner declaration. Until charges_enabled=true flips on your account, you cannot accept card payments โ the Clozo proposal email still goes out, but the "Pay with card" button is hidden and only SEPA + EPC QR remain visible. Onboarding usually completes in 5โ10 minutes; for some businesses Stripe requests additional documents and it can take a few business days.
Troubleshooting
Keep reading
Configuration
Stripe Connect: enabling card payments end to end
Five minutes through Stripe's onboarding turns on card payments for every future proposal โ no extra config, no separate Stripe dashboard to manage, payouts land in your IBAN.
Lifecycle
Status: Deposit paid โ work can start
The deposit landed (Stripe webhook or manual confirmation). Clozo flips the status, queues the deposit receipt PDF, and starts a behind-the-scenes job to pre-render the final invoice. You can begin the work.
Proposals & Invoices
SEPA bank transfer with EPC QR โ when offered, how it works, what to put on the invoice
Every Clozo invoice includes IBAN, BIC, and an EPC-format QR code that any modern EU banking app scans into a pre-filled SEPA transfer. Works with or without Stripe enabled.
Refunds & Notifications
Stripe automatic refund (Direct Charges via Connect)
When the original deposit was paid via Stripe, the refund is automatic. Clozo issues a Refund on the freelancer's connected account, watches for the `refund.updated` webhook, and flips the credit note to `succeeded` once Stripe confirms โ typically within 3โ5 business days for the cash to reach the client.
Refunds & Notifications
Refund stages: issued โ requested โ succeeded (or manual)
The credit note moves through up to four states from creation to settled. Each state corresponds to a specific point in the refund lifecycle, with predictable UI badges and email triggers.