01What Stripe does each billing period
When you create a subscription, Stripe's documentation says Stripe generates invoices, attempts payment collection and manages the subscription's status through its whole life. When the subscription is charged automatically, the first invoice stays open for 23 hours. If the customer pays in that window, the subscription becomes active. If not, it expires and the invoice is voided. After that, each billing period brings a new invoice and a charge on the payment method on file. Your site does not run this loop. It listens. Stripe sends webhook events, such as invoice.paid and invoice.payment_failed, because most subscription activity happens asynchronously, and your site must verify that each event really comes from Stripe. This is where people get tangled. Stripe holds the billing truth. Your site holds a copy, and events keep the copy current.
- Stripe creates the invoice, tries the charge and moves the subscription through its statuses
- First invoice of an automatically charged subscription: 23 hours for the customer to pay, otherwise it expires and the invoice is voided
- Your site learns what happened from webhook events, because most subscription activity is asynchronous
- Verify every event's signature before you act on it
02What happens when a payment fails
Cards expire and get declined. Stripe's documentation says Stripe Billing can retry failed subscription payments automatically. It recommends Smart Retries, with a recommended default of 8 tries within 2 weeks, and you can instead set custom rules of up to three retries. Some declines cannot be retried. If the card issuer returns a hard decline code, such as a lost or stolen card, Stripe cannot execute a retry until you obtain a new payment method. While payments are failing, the subscription sits in past_due. When the retries end, you choose the outcome in the Dashboard: cancel the subscription, mark it unpaid, leave it past due, or pause it if it is eligible. Stripe's webhook guide says to notify the customer when a subscription goes past_due and to revoke access when it becomes canceled or unpaid. Stripe can also send the emails: one after each failed card payment, a reminder before renewal, and one a month before a card on file expires, each switched on in the Dashboard. The emails link to a page where the customer can update the payment method.
- Smart Retries: recommended default of 8 tries within 2 weeks; custom rules allow up to three retries
- Hard declines, such as a lost or stolen card, wait for a new payment method
- After the last retry you choose: cancel, unpaid, past due or pause
- Failed-payment, renewal and expiring-card emails are switches in the Stripe Dashboard
- Decide in writing how long a member keeps access while a payment is past due
03What members can do without asking you
Stripe's customer portal lets customers update their billing information and payment methods, change or cancel their subscriptions, and view and download invoices. You activate it from the Dashboard. Romanian is among the languages it supports, and portal sessions are temporary. It has limits. If a subscription uses multiple products, usage-based billing, trial offers or invoices sent for collection, the customer can cancel it in the portal but cannot update it. The portal also cannot be displayed inside an iframe. These are the requests that would otherwise land in your inbox. We have not measured how many support messages it saves, so we quote no figure.
- The portal is activated from the Stripe Dashboard
- Customers update payment methods and billing details, cancel now or at the end of the period, and see their invoices
- Romanian is among the supported languages
- Limits: it cannot be shown in an iframe, and subscriptions with trials or multiple products can be canceled there but not changed
04When to stay on the ready-made version
If you have few members and one price, you may need no custom build at all. Stripe's Dashboard can create subscriptions, send the emails above and host the customer portal. Start there. A custom platform earns its cost when members need a login, a private area, or something of yours has to change along with billing: access that switches on and off, reports uploaded for a member, a list for your staff. SunVolt Club has a member area and uploaded reports, but its case study does not say access follows billing status. At PROOF48 that kind of work is not the 48-hour offer, which covers a website of up to about five pages or a landing page, at 500 to 2,500 EUR. A membership platform is a larger or custom project. It is scoped and quoted separately, our terms say it may require a deposit as agreed, and web apps in general start at 5,000 EUR. The AUTOMATE plan, 2,997 EUR a month, includes two custom automations a month and is the wrong spend for billing alone. This post covers card billing through Stripe only. Romanian invoicing rules are not covered here: read our e-Factura post and ask your accountant. A WhatsApp or phone reminder to a member whose card failed would be a custom build, on request. We did not check Stripe's fees for this post, so read their pricing page before you decide.
- Few members, one price: use the Stripe Dashboard, its emails and the portal, and stop there
- A custom build earns its cost when access, member data or staff tools depend on billing status
- Not the 48-hour offer (a site of up to about five pages or a landing page, 500 to 2,500 EUR): larger or custom projects are scoped and quoted separately and may need a deposit as agreed
- AUTOMATE, 2,997 EUR a month, is the wrong spend for billing alone
A paid annual membership, live, with Stripe checkout and signature-verified webhooks
SunVolt Club is the membership programme of SunVolt Energy UAB, a solar energy company. PROOF48 built the platform that sells and runs it: a 99 EUR annual membership, live at club.sunvoltenergy.eu in Romanian and English. The case study lists a Stripe checkout for the annual membership with signature-verified webhooks, a member area with login, password reset and account management, and an admin area for managing members and uploading their energy reports. It does not say how renewals, retries or a customer portal are set up, so we claim none of them here. We do not publish SunVolt's member count or revenue, because those are theirs to disclose.
See the build: SunVolt ClubQuestions, answered
Do I need a custom build to bill members?
Not to start. Stripe's Dashboard can create subscriptions, send failed-payment and renewal emails, and host a customer portal. A custom build matters when your own site has to react to billing status, for example by switching member access on and off.
What happens to a member whose card fails?
Per Stripe's documentation, the subscription goes past_due and Stripe may retry, with a recommended default of 8 tries within 2 weeks. After the last retry the subscription follows your setting: canceled, unpaid, past due or paused. How long the member keeps access in the meantime is your decision.
Can PROOF48 send a WhatsApp reminder when a payment fails?
Not as part of AUTOMATE, which covers site chat, DM, email, booking and CRM. A WhatsApp or phone reminder would be a custom build, scoped on request.
Does this post cover Romanian invoicing and e-Factura?
No. For this post we read Stripe's documentation only. Check your invoicing obligations with your accountant.
Where PROOF48 fits
Subscription billing automation is Stripe running the invoice, the charge and the retries, while your site reacts to its events: access on when the subscription is active, off when it is canceled or unpaid. Start with Stripe's Dashboard, its emails and the customer portal. Build custom only when access or member data depends on billing. PROOF48 built a member platform with Stripe checkout for SunVolt Club, and a membership platform is scoped and quoted separately.
Cosmin Tiu · Founder, PROOF48
Cosmin has worked in online marketing and software development since 2018, and has built with AI every day since January 2023. He still writes code from scratch daily, in Python, React, Rust and C#. PROOF48 ships business websites in 48 hours and invoices afterwards, so every opinion on this blog was paid for in real builds, not in theory.