Monthly subscriptions with host approval on a Sharetribe storage and parking marketplace
Monthly billing that only starts once the host says yes. How we added recurring rentals to a Sharetribe marketplace built for one-off bookings, without double charges or double bookings.
- Client
- Storage and parking rental marketplace
- Platform
- Sharetribe marketplace, Stripe Billing
- What we built
- Subscription checkout, host approval, renewals & cancellation
Overview
A storage and parking rental marketplace came to Devsoop with a gap in its platform. Hosts list storage units and parking spaces by the hour, by the day or by the month. Hourly and daily bookings worked out of the box, but monthly rentals, the bulk of storage demand, did not.
The marketplace runs on Sharetribe, which handles one-off bookings well but has no built-in recurring billing. There is no app to install for this, so the answer was a custom build: a monthly subscription flow that fits the way the marketplace already works. The host approves every request, the renter pays monthly until they cancel, and the space stays booked for as long as they do.
This is the kind of custom marketplace development we take on when a platform covers most of a business model but not the part that makes the money.
The challenge
A monthly rental looks simple to the renter: pick a start date, pay, keep paying until you leave. Behind it, the marketplace and the payment provider each keep their own record, and those two records had to stay in step for months or years. That raised problems in five places:
- Host approval. Hosts approve every request. The renter shouldn't be charged, and billing shouldn't start, for a request the host might decline.
- The first month. The first payment is taken at checkout, then renewals take over. Get the handover wrong and the renter pays twice for the same month.
- One renter per space. A storage unit can't be rented to two people. Once a space has an active subscription, nobody else can book it.
- Renewals that fail. Cards expire and payments bounce. The booking has to reflect what's happening with the money, and recover when the payment goes through on retry.
- Cancellation. A renter who cancels mid-month has already paid for that month. The space should stay theirs until the period ends, then free up on its own.
Our approach
We mapped the life of a subscription from request to final month: requested, approved or declined, renewed, overdue, recovered, cancelled and expired. Then we decided which system owns what:
- The marketplace owns the rental. The booking, its status, the host's approval and the space's availability live in Sharetribe, through a custom transaction process, so the host and renter see one record.
- Stripe owns the billing. Monthly charges, retries, card updates and sales tax run through Stripe Billing, which is built for exactly that.
- Nothing bills before the host says yes. The recurring subscription is created only when the host approves the request.
- Every step that touches money is safe to run twice. If the host clicks approve twice, or a payment notification arrives more than once, the renter is still charged once.
The renter sees one monthly rental. Behind it, two systems have to agree, every month, for as long as they stay.
Keeping that boundary clean is what makes a Sharetribe customization like this maintainable. The marketplace never tries to be a billing engine, and Stripe never tries to decide whether a space is available.
The solution
Checkout with a hold, not a charge. The renter picks a start date and sees the first payment, broken down by month, marketplace fee and sales tax. Their card is authorised but not charged. The host has six days to respond, matching the marketplace's existing booking window, so the hold never lapses unanswered.
Host approval. When the host approves, the first payment is captured and the monthly subscription is created in Stripe. If the host declines, or doesn't answer in time, the hold is released and the renter is refunded in full. Staff can approve or decline on a host's behalf.
No double charge on the first month. The first month is paid at checkout, so Stripe's first renewal is scheduled for one month after the start date, on the same day each month after that.
One renter per space. As soon as a space has an active subscription, the Book button is disabled for everyone else. The renter who holds it sees a link to their booking; other visitors see that the space is taken, without seeing whose booking it is. The server enforces the same rule, so it holds even if two people try at once.
Renewals that follow the money. Each paid renewal extends the booking by a month. A failed payment marks the subscription overdue while Stripe retries, recovers it when a retry succeeds, and ends it if every retry fails.
Cancellation at period end. Cancelling records the request straight away, so the renter and host both see the end date, but the space stays booked until the paid month runs out. Renters can also cancel, resume or update their card in Stripe's billing portal, and those changes show up on the booking too.
Sales tax on every month. Tax is calculated from the facility's address, not the renter's, and applied to renewals as well as the first payment. That became a project of its own, which we wrote up in the Sharetribe sales tax case study.
Clear emails at every step. We wrote 31 notifications covering requests, approval, decline, renewal, failed payments, cancellation and expiry, each with a receipt that matches checkout line for line.
Results
- Monthly storage and parking can be booked online, alongside hourly and daily rentals.
- Renters are never charged for a request the host declines or ignores.
- The first month is never billed twice.
- Each space can only be held by one subscriber at a time.
- Renewals, failed payments and cancellations update the booking automatically.
- Renters manage cancellation and card changes themselves, without contacting support.
Tech stack
- Sharetribe Web Template (React, Node.js)
- Sharetribe custom transaction process
- Sharetribe Integration API
- Stripe Billing, Billing Portal and webhooks
- Stripe Tax
- Automated test suite (Jest)
Selling rentals by the month?
If your marketplace needs recurring payments, host approval or subscriptions your platform doesn't support, tell us how your rentals work and we'll show you how we'd build it.