Daniel IoniFrom Open Source Marketplace to Real Payments: Integrating Stripe into MyZubster Building...
Building features is one thing.
Building a system that can actually generate its first verified revenue is another.
Today, MyZubster reached an important milestone: we completed the integration of a real Stripe-powered subscription flow for MyZubster Seller.
The Seller Membership is priced at:
€9.90/month
This may look like a small technical step — adding a payment provider — but for an open-source ecosystem, it changes something fundamental.
We are moving from:
“The platform can theoretically monetize.”
to:
“The platform has the infrastructure required to accept and verify recurring payments.”
MyZubster is an open-source ecosystem that I’m building around marketplaces, digital services, communities and, progressively, immersive experiences.
The project is developed publicly on GitHub.
One of the main goals is to avoid building monetization as an afterthought.
Instead, the business model, backend architecture, security controls and product experience should evolve together.
That led to the next important milestone:
Connect Seller Membership to a real payment infrastructure.
The current commercial model includes a Seller subscription:
MyZubster Seller — €9.90/month
The important part isn't just displaying a pricing card.
A production marketplace needs to know whether a user has actually paid.
That means Seller privileges cannot simply be activated by the frontend.
The backend needs an authoritative source of truth.
For MyZubster, that source is now Stripe.
The implementation introduces two main endpoints.
POST /api/marketplace/seller/checkout
This endpoint requires an authenticated MyZubster user.
The backend creates the Stripe Checkout Session using the configured recurring Seller price.
The browser therefore doesn't decide whether the user becomes a Seller.
It only starts the payment process.
POST /api/marketplace/seller/webhook
Stripe sends subscription and payment lifecycle events to this endpoint.
MyZubster currently handles events including:
checkout.session.completed
customer.subscription.created
customer.subscription.updated
customer.subscription.deleted
invoice.paid
invoice.payment_failed
These events allow the backend to synchronize the Seller membership with the actual Stripe subscription.
This was one of the most important design decisions.
A request coming from the frontend should never be able to say:
paymentSuccessful = true
and unlock Seller functionality.
Instead:
User
↓
MyZubster
↓
Stripe Checkout
↓
Payment
↓
Stripe Webhook
↓
Signature Verification
↓
MyZubster Backend
↓
Seller Membership State
The server determines the entitlement based on verified Stripe information.
Accepting a webhook endpoint without validating its origin would create an obvious attack surface.
MyZubster therefore verifies Stripe webhook signatures before processing the event.
The implementation uses the raw HTTP request body together with the webhook signing secret.
It also applies a five-minute timestamp tolerance to reduce replay risk.
Conceptually:
Incoming webhook
↓
Read raw payload
↓
Verify Stripe signature
↓
Validate timestamp
↓
Parse event
↓
Update subscription state
An invalid signature doesn't change membership state.
A subscription isn't simply:
ACTIVE
or:
INACTIVE
Payments fail.
Subscriptions expire.
Customers cancel.
Renewals happen.
So MyZubster maps Stripe subscription lifecycle information into the Seller entitlement.
For example, when a payment fails, Seller access can be suspended rather than allowing the application to assume the subscription remains valid forever.
Cancellation is also handled through Stripe's subscription lifecycle, including cancellation at the end of the paid period.
The Seller Membership model can retain Stripe identifiers associated with the subscription lifecycle, such as the customer, subscription, Checkout Session, price and last processed event information.
This matters because payment systems need to be diagnosable.
When something goes wrong, we need to answer questions such as:
Revenue infrastructure without traceability becomes painful very quickly.
Another principle we adopted is simple:
Missing payment configuration should disable automated checkout, not accidentally grant access.
The production environment therefore requires the Stripe configuration needed by the payment flow, including the secret API credential, Seller Price ID and webhook signing secret.
Secrets stay outside the repository.
Interestingly, introducing Stripe didn't require removing the existing manual Seller verification mechanism.
Instead, the system distinguishes between manually managed and Stripe-managed memberships.
That gives MyZubster a useful fallback while the automated revenue path matures.
It also makes incremental migration possible.
Before merging the Stripe implementation, the branch went through the project's automated gates.
The final checks included:
CI – Test e Lint ✅
Security Audit ✅
Continuous Evidence Gate ✅
Locally, the test suite also completed successfully:
Test Suites: 118 passed, 118 total
Tests: 476 passed, 476 total
Snapshots: 0 total
During this process, the security audit detected moderate dependency vulnerabilities.
Rather than ignoring the failing gate just to ship the feature, the dependencies were updated and the audit was run again.
Only after the security workflow returned green was the Stripe pull request merged.
The implementation was developed through:
PR #900 — feat(marketplace): automate Seller payments with Stripe
It is now merged into the main MyZubster codebase.
For me, this milestone is more important than the number of lines of code involved.
It connects three things that projects often keep separate:
PRODUCT
+
ENGINEERING
+
ECONOMICS
The €9.90/month Seller Membership is no longer just an idea documented in a business model.
There is now real backend infrastructure behind it.
The next objective isn't adding another hundred features.
It's validating the complete production loop:
Visitor
↓
Account
↓
Seller Checkout
↓
Stripe Payment
↓
Verified Webhook
↓
Seller Activation
↓
Recurring Subscription
↓
Verified Revenue
After that, the interesting metrics start becoming real:
Until payments exist, many of those numbers are theoretical.
Once the first real customer pays, they become business data.
MyZubster is still evolving.
There are many things left to improve, and that's exactly why I'm building it publicly.
The goal isn't to pretend that an early-stage platform is already a finished company.
The goal is to progressively turn architecture, code, economics and real user behavior into one coherent system.
This Stripe integration represents another step in that direction.
From code.
To product.
To payment.
And eventually, to a sustainable open-source ecosystem.