Re-architecting a Core Data Model to Unlock Enterprise Growth

Turning a simple feature request into a foundational product transformation

🧩 Snapshot

  • Company: BuildOps

  • Role: Product Manager

  • Scale: 1200+ customers | $50M+ ARR

  • Timeline: ~5 months build + 2–4 months rollout

  • Impact:

    • ↓ 95%+ support tickets

    • Enabled enterprise deals

    • Prevented churn

    • Improved CSAT

⚡ The Trigger

At BuildOps, our system was built on a simple hierarchy:

Customer → Property → Jobs/Quotes/Invoice

For a long time, this worked well.

But as we started onboarding larger, more complex customers, a recurring question kept surfacing:

“This property changed owners/management—how do we update that?”

At first, it seemed like a small feature gap.
It wasn’t.

🚨 The Real Problem

The system was built on the assumption that a property belongs to a single customer and that this relationship remains fixed over time. While this simplified the data model, it failed to reflect how the real world actually operates. In reality, properties are frequently sold, property managers change, and multiple stakeholders—such as owners, contractors, and management companies—can be associated with the same property at different points in time, or even simultaneously.

Because of this rigid structure, users were forced into inefficient workarounds whenever ownership or management changed. The only option was to create a new property under a different customer, which resulted in the loss of all historical data tied to the original property, including past jobs, invoices, and service history. Over time, this led to fragmented records, duplicated data, and increasingly inefficient workflows that made it difficult for users to maintain a clear and accurate view of their operations.

💥 Why This Became Critical

This wasn’t a niche issue—it affected every single customer.

Business impact:

  • Blocked enterprise onboarding

  • Increased churn risk

  • High volume of support + data migration requests

Internal workaround:

  • Manual scripts by engineering

  • Data team handling transfers

  • Creating new property records with same name under new customer

None of these scaled.

⚙️ Complexity Behind the Scenes

This change touched nearly every part of the system and required a fundamental rethinking of our underlying architecture. At the core, I worked closely with engineering to define new entity relationships and establish robust data contracts that could support a more flexible, many-to-many model. This foundation became critical, as multiple product teams relied on these updated structures to adapt their own features and workflows.

A significant layer of complexity also came from external integrations. Many of our customers relied on accounting systems like QuickBooks and Vista, each of which operated on different assumptions about how customer-property relationships should be structured. Introducing multiple customers per property disrupted these assumptions, particularly in billing workflows. To address this, we worked closely with the accounting team to redesign our mapping logic, enabling flexible billing across multiple customers while ensuring that all integrations remained stable and fully compatible.

🔄 Migration at Scale

  • Impacted 100% of customers

  • Designed and implemented migration scripts

  • Ensured zero data loss

🚀 Execution & Rollout

We took a phased approach:

  • Alpha → Beta → Gradual rollout (2–4 months)

My role:

  • Defined PRD and system design

  • Aligned cross-functional teams

  • Led migration strategy

  • Handled customer communication and training

  • Collected feedback and iterated

🧠 Reframing the Problem & ⚖️ The Key Decision

At a certain point, it became clear that this wasn’t simply a problem of enabling “ownership change” as a feature—it was a deeper issue with how our system modeled reality. Our data model was fundamentally too rigid to support the dynamic nature of real-world property relationships. Recognizing this, we were faced with a critical decision: either ship a quick workaround that would address the immediate need, or take a step back and re-architect the system properly. The former would save time in the short term but continue to compound technical limitations, while the latter required a significantly larger investment but would unlock long-term scalability. I chose to move forward with the long-term solution, even though it meant committing to approximately 5 months of development and delaying enterprise go-lives, because it was the only approach that truly solved the problem at its core and set the foundation for future growth.

📈 Impact

💼 Business

  • Enabled enterprise deal closures

  • Prevented churn from high-value customers

  • Removed a key adoption blocker

⚙️ Operations

  • ↓ 95%+ support tickets related to data transfer

  • Eliminated manual scripts and data team interventions

😊 Customer Experience

  • Preserved full property history

  • Enabled flexible, real-world workflows

  • Improved CSAT

🔍 Exploring Solutions

Before committing to a major change, I evaluated multiple approaches:

1. Linked Property Records (Quick Fix)

  • Connect old and new properties

Why it failed:

  • Fragmented data

  • Poor UX

  • Didn’t solve root problem

2. UI-Based Data Migration

  • Allow users to transfer data between properties

Why it failed:

  • High technical complexity

  • Risk of data inconsistencies

  • Not scalable

🏗️ The Solution

To address the limitations of the existing system, we took a step back and fundamentally redesigned how properties and customers were related to each other. Instead of continuing with a rigid one-to-many structure—where each property could only belong to a single customer—we transitioned to a more flexible many-to-many model. This shift allowed us to better reflect real-world relationships, where multiple stakeholders can be associated with a property at the same time or over its lifecycle.

This new model unlocked several key capabilities:

  • 🔁 Multi-Customer Properties
    Properties could now be associated with multiple customers simultaneously, eliminating the need to duplicate records when ownership or management changed.

  • 🧾 Customer Roles
    Each customer linked to a property could be assigned a specific role—such as owner, property manager, or contractor—bringing structure and clarity to these relationships.

  • 💳 Default Billing Logic
    To maintain consistency in financial workflows, we introduced the concept of a default customer for billing, while still allowing users the flexibility to override this when needed.

  • 🔐 Permissions and Control
    To ensure this added flexibility didn’t lead to misuse or confusion, we implemented permission controls where only admins could modify key relationships, such as changing the default customer or adding and removing customer associations.

Together, these changes transformed the system from a rigid hierarchy into a flexible, scalable foundation that could accurately model how properties are managed in the real world.

🧠 Key Learnings & 💬 Reflection

This project fundamentally changed how I think about product management. It reinforced that structural problems require structural solutions—quick fixes may provide temporary relief, but they rarely scale. It also highlighted that the right decision isn’t always the fastest one; in this case, investing time upfront in a more complex solution ultimately unlocked long-term velocity for both the product and the business.

I learned to think in systems rather than isolated features, and to balance short-term pressures with long-term vision. At its core, product management is about modeling reality—if a system doesn’t reflect how users actually operate, friction is inevitable.

This project pushed me to lead cross-functional execution on a deeply technical, platform-level change, aligning multiple teams around a shared vision. In the end, this wasn’t just about enabling ownership changes—it was about building a system that could scale with the real world.

Next
Next

Raman Buildwell: Reshaping a Legacy Real Estate Business