M's Works

Parliamo su

Case study2026

A subscription platform, rebuilt on infrastructure they own

Out of the no-code generator it was born on. Paid content is genuinely restricted, the archive moves without losses, and every staff action leaves a trace.

Members area: the platform's news section
The platform landing page on a phone
Client
Finanzamille Inc.
Sector
Subscription finance community · Rancho Palos Verdes, CA
Services
Web & App Development · GDPR & Privacy · Security Audit
The context

News, courses, analysis documents, live chat and model portfolios, on a platform generated by a no-code service. Reviewing the code page by page, before writing a new line, turned up fifteen structural problems. The worst one: a decorative subscription that displayed a badge without protecting any content.

The problem
  1. Non-paying users saw everything: the subscription showed a label, it didn't close a door.

  2. Everything depended on the service that had generated the platform, authentication included.

  3. Invitations and password resets came from a sender the client didn't control.

  4. Subscription status was asked of Stripe from the browser, with no webhooks: a cancellation could go unnoticed.

  5. No log of what publishers, moderators or role administrators did.

The decisions, and why

Every choice has a constraint behind it

The constraint

News, courses, documents and community were readable by any registered user, subscriber or not.

The choice

Two independent gates: the page stops before the database, and each server action answers «paywall» on its own.

Why

A visual overlay protects nothing: the text still ships inside the page and can be read from the source. And hiding a button doesn't close the endpoint that button writes to.

The constraint

Permissions lived in database rules, which the new data-access tool bypasses by design.

The choice

Permissions in the application, in a single service layer, with the database rules left on as a second net.

Why

The alternative was fighting the tool on every query and maintaining two security models that eventually diverge. The price is stated openly: no query outside the service layer. Two independent reviews then went looking for exactly those violations.

The constraint

Courses had to host directly uploaded video, «compressed». The existing file store keeps files but doesn't re-encode them.

The choice

Compression in the uploader's browser, before sending. No new video vendor, no new credentials.

Why

A specialised video service cost between $2 and $23 a month and included multi-quality re-encoding. The client ruled it out to avoid widening the set of vendors touching their data, and the trade-off was written down rather than discovered later: one quality for everyone.

The constraint

Live data stayed on the old platform for the whole build, and could not be written to even by accident.

The choice

A replayable migration: run once to develop against real data, identical to the final cutover run.

Why

A one-shot migration gets written under go-live pressure, in the single run you can't redo. The first pass already surfaced the surprises — columns authentication computes itself, rows pointing at users deleted years earlier — and the second starts from a tested procedure.

The constraint

A dashboard of usage statistics was needed: logins, courses watched, messages, subscriber trends.

The choice

Statistics built in-house on the activity log, with a daily rollup for the aggregate views.

Why

An external analytics tool installs in an afternoon and has better charts, but it would send every member's behaviour to one more vendor — on a platform whose own privacy notice says it doesn't profile. The price is that we write the aggregations ourselves.

What we built

Members-only area

Stripe subscriptions with checkout, billing portal and webhooks — absent in the previous version.

Editorial desk

Rich-text editor, Unsplash covers with photographer credit, comments at the foot of the article.

Realtime community

Chat, board, comments and replies that appear at once, with notifications on mentions.

Courses with video and files

Video compressed in the browser, PDF and Excel attachments, resume from where you left off.

One admin dashboard

Users, roles, subscriptions, documents, portfolios and statistics in one place, with every action logged.

The outcome

0,2%

rows dropped when migrating the archive, all of them users deleted years earlier: none lost to a fault in the procedure

17

security problems found and fixed across two independent reviews, including an admin who could create an account with more power than their own

−84%

the weight of a course video after in-browser compression, measured on a real file: 29.3 MB down to 4.8 MB, in 5.6 seconds

Content no longer reachable without a subscription: blocked pages don't even read the data from the database

No dependency left on the no-code generator: authentication, email and AI services on vendors contracted by the client

Privacy notice, cookie policy and terms written from the code's actual behaviour, with sections for the EU, UK, California and Australia

Technologies

Next.jsTypeScriptPrismaSupabaseStripeTailwind CSS

Other projects

Next step

Got a similar project?

Tell us where you're starting from. We'll reply with a clear proposal and realistic timelines, no commitment.