Ferri Schoedl Advocacia · Institutional site with shop and courses · 2026
A law firm that is also a publisher and a school.
Institutional site for a São Paulo law firm with a legal bookstore, preparatory courses and publications — Stripe payments and protected reading.
- E-commerce
- Paid content
- Stripe
- Client
- Ferri Schoedl Advocacia, São Paulo
- Status
- In production; real shipping calculation in progress.

Homepage — practice areas, publications and shop.
Context
A firm with six practice areas and a partner who has authored 10 books and 23 articles wanted a site that was simultaneously business card, publisher and school: selling print and digital books and courses with per-lesson materials.
The problem
Someone buying a legal book doesn't want to create an account before paying, but after paying they need one to read. The flow had to convert guest into user without friction.
Purchased PDFs and ePubs must sit behind authentication and be tied to the purchase.
My role
Sole developer, including DNS, domain and transactional email setup on a subdomain isolated from the client's legacy hosting.
Constraints
- Buy without an account; read after buying with one. The flow had to convert without friction.
- Transactional email on a subdomain isolated from the client's legacy hosting.
Solution
Next.js with live Stripe checkout, Purchase model, book reader, protected download routes, OTP checkout gate (verify email → sign in or register), guest-to-user conversion with post-purchase password setup, and an admin panel for books, courses, articles, site content and orders.
What was built
- Six practice areas with their own pages; publications page with 10 books and 23 articles.
- Courses with PDF materials per lesson.
- Light/dark theme, LGPD compliance.
- Resend on a dedicated subdomain (send.) with DKIM, without touching corporate email on cPanel.
Key decisions
OTP before payment, password after
Email is verified by code before checkout. If an account exists, sign in; if not, the purchase creates it and the password is set afterwards. Nobody abandons the cart because of a sign-up form.
Outcome
Site and shop in production with Stripe sales; panel operated by the firm's team.
Stack
Next.js 15 · TypeScript · MongoDB · NextAuth · Stripe · Resend · Cloudinary · Tailwind CSS v4 · Vercel
