WIP: Online Payments #653
No reviewers
Labels
No labels
API
Billing
UI/UX
dependencies
bug
change
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
servala/servala-portal!653
Loading…
Reference in a new issue
No description provided.
Delete branch "design/online-payments"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Relates to #634
98edc1020atoc4fcae8031Payment provider evaluation: Payrexx vs wallee
Recommendation: wallee. It wins on the one API capability the design's safety model depends on, and it is cheaper at every volume we are likely to see. The cost advantage is contingent on the acquiring negotiation rather than published, which is the main thing to verify before committing.
Constraints that narrowed the field
What the implementation requires from a provider
The
PaymentProviderABC insrc/servala/core/payments/base.pydemands:find_transaction(reference): lookup by our own merchant referencedelete_token()API comparison
The decisive requirement:
find_transaction(reference)The double-charge safety model rests on this. After a crash we may hold no provider transaction id, only our own
invoice-<id>-attempt-<n>reference, and we must ask the provider "do you already know this?" before charging again.wallee exposes
merchantReferenceas a first-class filterable field viaPOST /transaction/searchwith anEntityQueryFilterleaf (EQUALS,fieldName: merchantReference). An exact, indexed lookup, which is precisely the call the ABC wants.Payrexx's list-transactions endpoint accepts only
filterDatetimeUtcGreaterThan/filterDatetimeUtcLessThan,filterMyTransactionsOnly,orderByTime,offsetandlimit. There is noreferenceIdfilter.find_transactionwould become a paged date-window scan with client-side matching, on exactly the recovery path that three adversarial review rounds existed to harden. That alone is close to disqualifying.Feature matrix
POST /transaction/search,merchantReferencefilterableToken/TokenVersion,TokenServicecreate and deletecustomersPresence = NOT_PRESENT+processWithoutUserInteractionwallee-payment/python-sdk)referenceId, which cannot be queriedOpen technical questions
amounton the gateway and never documents CHF 0. wallee'stokenCreationMode = FORCE_CREATIONwith a zero line item is connector-dependent and may silently become a small authorization plus void. This is a design-level assumption and needs confirming with the provider and the acquirer before anything else. If it does not hold, the registration flow changes (CHF 1 auth plus reversal).merchantReferenceuniqueness. Ourfind_transactionmust sortcreatedOn DESCand handle multiple hits rather than assume one.preAuthorization=1means tokenization, while a true authorization hold isreservation=1. Easy to get wrong.Cost comparison
The two price on completely different structures, which matters more than the headline rates.
Payrexx bundles acquiring into one all-in percentage, committed up front.
Other Payrexx rates: TWINT 1.25-1.30%, bank transfer 0.50-0.60%, QR-invoice via Payrexx Pay 0.50% (Standard/Premium). Discounts: 50% off subscription for non-profits, 30% for startups under 5 years.
wallee never charges a percentage. It charges a flat fee per authorized transaction; the percentage comes from the acquirer (Concardis/Nexi) under a separate contract.
Plus a one-off CHF 95 payment-processor configuration, and optional Advanced Support at CHF 74/month. Notably no fee for failed charges, which matters directly for our three-attempt dunning ladder.
Worked comparison
Effective blended rates: Payrexx Standard 1.65% + 0.18, Payrexx Premium 1.35% + 0.18, wallee Basic ~0.9% + 0.40 (CHF 0.20 wallee + CHF 0.20 acquirer).
wallee wins at every scale, and the gap widens with volume, roughly CHF 430/month cheaper than Payrexx Premium at CHF 100k. The driver is entirely the 0.75-point spread between 1.65% and ~0.9%.
Three caveats that could flip the cost picture
Open questions before committing
Sources
View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.