On 29 September 2026, mildredcerda.com switched from its old Drupal site to a new bilingual platform. Thirty days earlier, the starting point was a polished prototype that looked like a finished website but couldn't yet capture a lead, measure a campaign or publish an article without a developer. This is how the rebuild went, what shipped, and the practices that made the timeline possible.
The brief: a prototype that had to start earning its keep
Mildred Cerda Soto is a digital transformation and growth consultant with more than 18 years in Latin American financial services, including over a decade leading digital transformation, with work spanning banks, remittance companies and assistance businesses. Her website has one job: turn a senior executive's curiosity into a conversation.
She came to us with two things. The first was a prototype, built quickly on an AI app-building platform, with the right editorial look, Spanish-first content and a working shell in React and FastAPI. The second was a detailed 2026 requirements pack: a brand book, an SEO and lead-generation checklist, a functional specification for a digital maturity calculator, a blog and newsletter architecture, tracking IDs and written acceptance criteria.
The gap between the two was the whole project. The prototype ran on an in-memory store, every page shared a single title tag, the headline figures were illustrative, and nothing told Mildred who had visited, where they came from or what they wanted. The brief, in one sentence: make it a platform she can run herself, that produces qualified leads and the data to prove it.
What shipped
A digital maturity calculator that generates leads, not just scores
The calculator is the site's main lead magnet, so it got the most engineering. Visitors answer seven questions across the dimensions in Mildred's specification: commercial strategy, strategic priorities, customer experience, data, automation, talent and innovation. They get a score out of 100, a maturity level and a radar chart compared with a Latin American benchmark. Behind the scenes, the platform generates a branded three-page PDF report, emails it through Brevo, stores the result and segments the contact by company size, maturity level and weakest dimension. The homepage's maturity index is now calculated from real submissions instead of a placeholder figure.
One lead record per person, scored and attributed
Every capture point (contact form, calculator, newsletter) feeds a single lead model. Leads are deduplicated across sources, scored from 0 to 100 on nine signals, and stamped with their acquisition channel: UTM campaign, landing page, referrer and device. Mildred has her own admin panel with filters, a touchpoint timeline per lead, status updates and CSV or Excel export. A lead who first downloads a maturity report and later books a call appears as one person with two touchpoints, not two strangers.
Content she publishes herself
We replaced the prototype's hard-coded blog with an editorial CMS and added a "Resources" feed for short, LinkedIn-style posts with images and hashtags, both managed from the same admin login. Publishing a post triggers a production build automatically, so every new article is prerendered, appears in the sitemap and shows a proper preview when shared on WhatsApp or LinkedIn. She doesn't need to message a developer.
Measurement from the first visit
A single tracking function sends each event to two places: our own backend, which powers lead scoring, and Google Tag Manager's data layer, where GA4, Meta and TikTok pick it up. Conversion events (form submissions, completed assessments, newsletter sign-ups and Calendly bookings) were defined as key events in GA4 on launch day. When Mildred adds a new campaign channel later, the events are already there to trigger it.
Search visibility built in
Every page now has its own title, description, canonical URL, Open Graph card and schema.org structured data for her professional service, her profile and each article. Because the site is a single-page React app, we prerender each route at build time with Puppeteer, so crawlers and link-preview bots that don't run JavaScript still receive the real metadata. During staging validation, Lighthouse scored the homepage 100/100 for SEO.
How 30 days actually broke down
- 30 August to 1 September: brand identity migrated to her blue palette and typography, navigation rebuilt, real database persistence restored, the maturity calculator rebuilt end to end, the lead and attribution model in place, real case studies with an industry filter, her timeline and 13 credentials, and a first blog.
- 2 to 4 September: real logos and photography, and technical SEO across every page, including build-time prerendering.
- 7 to 10 September: the editorial CMS, the Brevo integration (live in production on 9 September), the Resources feed, security hardening, a CI pipeline that deploys the frontend on every merge, and the leads and calculator admin panel.
- 21 to 28 September: Mildred's review round. Her feedback became tracked issues, which we worked through: the calculator redesigned to her mockup, Home, Cases and Contact rebuilt to match her layouts, a full analytics pass, responsive fixes and a privacy policy updated for every tracker.
- 29 September: final review fixes and go-live on the main domain.
The quiet stretches in that list matter as much as the busy ones. Between build phases, the work sat on a staging site where Mildred reviewed it as a real website, not a set of mockups.
Key insight
Speed came from scoping, not from cutting corners. Each piece of work was defined before it was built and reviewed before it was merged, including every round of client feedback. The 30 days held because scope never drifted silently.
The practices that made the timeline possible
1. Write the spec before the code
Every substantial sub-project, from the visual identity to the CMS and the leads panel, went through the same cycle: written specification, implementation plan, build on its own branch, review. Smaller changes were scoped as tracked issues instead. The specifications live in the repository next to the code. When a question came up three weeks later ("why does the resend endpoint work like this?"), the answer was a file away, not buried in someone's memory.
2. Use AI agents, but keep a human on the merge button
We build with AI coding agents. They implement against the written plan, a separate review pass checks each branch, and a person approves every merge to the main branch. That discipline is what turns AI-assisted speed into software you can maintain, rather than a faster way to create technical debt.
3. Never let a third party slow the visitor down
Syncing contacts to Brevo and sending report emails happen in background tasks. If the email provider is slow or down, the visitor still gets an instant response and the lead is still saved. The same thinking drove rate limiting on every public form, file-type and size validation on uploads, and cache rules tuned separately for each image endpoint.
4. Make the client independent on day one
A website that needs a developer to publish a post or export a lead list becomes a bottleneck within a month. The CMS, the Resources feed and the leads panel were not extras. They were the point of the project.
5. Migrate without losing what the old site earned
The old Drupal site had years of indexed URLs. Before switching, we mapped its paths (services, blog posts, portfolio pages, the English section) to their new equivalents with permanent 301 redirects. We moved the old site to a legacy subdomain hidden from search engines and took full backups of files and database. Nothing was deleted, and nothing that already ranked was thrown away.
6. Test what the visitor will actually touch
Beyond the 199 backend tests, each feature was verified in a real browser at desktop and mobile widths. That is how we caught radar-chart labels being clipped on narrow phones, and a structured-data bug where the search markup appeared twice and briefly not at all. The CI pipeline proved its worth on its first run, catching a lint error that had never surfaced locally.
The results so far
The new site has been live for days, not months, so we won't quote conversion rates yet. What we can say is what Mildred now has that she didn't have before:
- every enquiry, assessment and newsletter sign-up captured as a scored, attributed lead in one place;
- a lead magnet that delivers a branded diagnostic report to the prospect's inbox and segments them for follow-up automatically;
- content she publishes herself, prerendered and shareable;
- GA4, Meta and TikTok fed from the same events, ready for paid campaigns;
- a bilingual site that kept the search equity of the one it replaced.
Every number she will need to judge the site's return is now being recorded. We'll come back to them once they have something to say.
The stack
- Frontend: React 19, React Router 7, Tailwind CSS, Framer Motion and Recharts, with build-time prerendering via Puppeteer.
- Backend: FastAPI on Python 3.12 with MongoDB, server-side PDF generation and session-based admin authentication.
- Integrations: Brevo for email marketing and transactional email, Calendly for bookings, and Google Tag Manager for GA4, Meta and TikTok.
- Delivery: GitHub Actions deploying the frontend on every merge, and an automatically deployed API.