Web Development

Why I'm Done Selling Clients Off-the-Shelf Themes

A

Adil Sher

Author

Nov 2, 2026
5 min read
0 views
Why I'm Done Selling Clients Off-the-Shelf Themes

I had this conversation last month with a real estate agent in Rawalpindi. She wanted a website, found a "premium" template on ThemeForest, and asked if I could just install it. The template looked polished, smooth animations, modern design, the works. I said yes, and three weeks after launch, she called saying the listing filters were broken after a plugin update and nobody knew how to add new property types without hiring a developer again.

That call made me realize I've been approaching this wrong for years. I've built plenty of themed sites that looked great on day one and turned into maintenance nightmares by month six. The problem isn't the templates themselves, it's that they abstract away ownership. Once you hand over control to a monolithic theme, you're permanently dependent on someone else's assumptions about how data flows, how forms work, and what a property listing actually looks like.

The Real Cost of Themes

Here's what I see when I inherit a themed real estate site: the listing grid expects data in one shape, but the agent's MLS feed delivers something completely different. So someone writes a custom mapper that lives nowhere in the codebase, breaks silently when the MLS vendor changes their schema, and nobody documents it. The contact forms are generic, they capture name, email, message. But a seller inquiring about valuation is fundamentally different from a buyer asking about financing. Both get the same form, both disappear into the same inbox.

And the animations? They're window dressing. Things fade in when you scroll, but the page itself is static. Filter by price and the whole thing reloads instead of responding in real time.

The real problem is that a theme is a contract written in code. Someone decided your layout, your color system, your form handler, and how everything connects. The day you need to change one piece, you discover they're all welded together.

Building with Blocks Instead

The article frames something I've started doing on my own projects: treating a real estate site as a collection of independent components, not a unified theme. Each block is a single TypeScript file you own, you pass data as props, and when the client wants something different, you edit the source. No theme to update. No surprise breaking changes.

Think about the actual user journey on a real estate site. A buyer hits the hero, searches for homes, sees a grid, reads testimonials, maybe plays with the mortgage calculator. A seller sees the same hero, but then goes to the valuation funnel, that's their entry point. These are genuinely different experiences that shouldn't be forced into the same template.

The article outlines ten blocks: hero with search, agent card, listing grid, stats band, testimonials, valuation funnel, mortgage calculator, FAQ, contact, and footer. Ten well-designed pieces that compose into a complete site without pretending to be universal.

Where the Block Approach Shines

I'm genuinely convinced this works because data ownership becomes clear. You define what a PropertyListing looks like once, type, price, beds, baths, status, and every component that needs property data reads from the same structure. No more impedance mismatch between your data source and your UI.

For a solo agent with twenty listings, you keep a JSON file in the repo. For a brokerage with an MLS feed, a server component fetches and maps the data once. The grid doesn't care which. You've decoupled the data layer from the presentation.

The lead capture strategy is particularly smart: the valuation funnel asks for address first (low commitment), then property details, then contact information (after they've invested time). Compare that to a generic contact form that treats a seller inquiry like a parking question. You're actually acknowledging that different visitor types have different needs.

What I'd Actually Do Differently

I agree with the philosophy, but I have questions about scale. The article works perfectly for a single agent or small brokerage. But what happens when you need this across fifty agents, each wanting slight variations? Do you fork the component for each client, or do you parameterize aggressively and end up recreating the theme problem at a smaller scale?

I'd also want to think harder about the data mapping layer. For an MLS feed, the transformation from vendor schema to PropertyListing is non-trivial. The article mentions it casually, but I've seen that complexity destroy projects. I'd probably build a dedicated adapter layer, versioned separately.

One more thing: saved homes in localStorage is convenient for demos, but it's brittle. Real clients want to see their saved homes across devices. That's a small database. I'd plan for that from the start, not treat it as a future edit.

Moving Forward

I'm going to use this approach on my next agent site. I'll build the ten blocks, own the data shape completely, and resist the urge to make them configurable enough for everyone. Sometimes constraint is better than flexibility.

What's your experience with templates versus custom components? Have you hit the same breaking points, or am I overthinking this?

Source: This post was inspired by "Real estate website template for Next.js: blocks, not a theme" by Dev.to. Read the original article

Share this article

Written by Adil Sher

Full stack developer building high-traffic platforms, AI services, and custom web applications. Explore my portfolio, learn about my background, or get in touch.

Related Articles

Why I'm Rethinking How We Handle AI in Production Apps
Web Development Nov 1

Why I'm Rethinking How We Handle AI in Production Apps

Last month, I was sitting in a standup meeting when someone asked how we'd handle our LLM API if the provider went down. The room went quiet. We'd built our entire feature around OpenAI's reliability, with barely a fallback in sight. That conversation stuck with me, mostly because...

Stop Pretending Your RAG System Knows What It Doesn't
Web Development Oct 31

Stop Pretending Your RAG System Knows What It Doesn't

Last month, a client asked me to build a "smart document search" for their internal knowledge base. I nodded, quoted them a timeline, and started architecting the usual suspects: vector embeddings, semantic search, a language model API call. Two weeks into development, during a d...

I Started Using AI to Code Faster, Then I Lost Control of My Own Project
Web Development Oct 30

I Started Using AI to Code Faster, Then I Lost Control of My Own Project

Last month, I spent two hours debugging a feature in a client's dashboard that I'd generated entirely through Claude. The irony hit me hard: I was staring at my own code, code I'd "written"-and I couldn't immediately explain why a filter wasn't working. I had to ask the AI to expl...