Opportunity = Sale
Reservation → Agreement → Deed → After Sales becomes the Opportunity lifecycle. One stage is tracked once for the entire bundle.
Opportunity is the sale. Products are the physical units. Opportunity Products form the bundle. Buyers are standard people records. Custom objects only appear where real estate introduces genuinely new concepts.
The design separates physical inventory from the commercial transaction and lets Salesforce own the standard CRM behaviour.
Reservation → Agreement → Deed → After Sales becomes the Opportunity lifecycle. One stage is tracked once for the entire bundle.
Every apartment, parking bay, basement, office or shop is an independently sellable product with unit-specific metadata.
Opportunity Products replace a custom SaleUnit junction and preserve Salesforce pricing, reporting and forecasting behaviour.
Custom objects should represent concepts Salesforce does not already model rather than duplicate standard CRM structures.
Product2.Building__c as Lookup. Keep standard Product even though that means giving up master-detail here.Opportunity.StageName holds Reservation → Agreement → Deed → After Sales.The lifecycle is flattened onto Opportunity. Path gives the sales team a clear guided journey while validation rules and automation enforce the actual business requirements.
There is no separate Bundle object. Opportunity groups the individually selected physical units; automation determines whether that collection is legally and commercially valid.
Each selected Product becomes one Opportunity Product with Quantity = 1 and its negotiated sales price.
SALE-000123
Stage: Agreement
Amount: €470,000
Requires_Separate_Deed__c = TRUE.Flow / validation handles Quantity = 1, deed-required unit count, ownership = 100%, stage prerequisites, inventory status changes and required deposits/signatures.
For the actual “claim this apartment” transaction, consider Apex with row locking so two users cannot reserve the same physical Product at nearly the same time.
OWD answers “which records can I see?” Object permissions answer “what can I do with them?” Start restrictive for customer transactions, broad for shared inventory.
| Object | Purpose | Baseline access | Relationship / rationale |
|---|---|---|---|
| Opportunity | Sale / bundle | Private | Sensitive pricing, buyers, deposits and legal data. |
| Opportunity Product | Units in sale | Controlled by Opportunity | Commercial line should follow transaction access. |
| Product2 | Physical unit inventory | Public Read Only | Sales users need visibility of availability across all buildings. |
| Building__c | Development metadata | Public Read Only | Shared catalogue, with editing reserved by permissions. |
| Account | Customer / notary organisation | Private | Open access only where process requires it. |
| Contact | Buyer / notary person | Controlled by Parent | Where this fits the broader CRM contact-sharing model. |
These are the places where the model becomes a working Salesforce solution rather than just an ERD.
Maintain Product2.Availability_Status__c and an active Opportunity reference. A Product representing a physical unit can only participate in one active sale at a time.
Flow is sufficient for most orchestration, but the reservation operation is where I would evaluate Apex row locking to prevent two concurrent users claiming the same apartment.
The Opportunity is the bundle. Every Opportunity Product must have Quantity = 1, the same Product cannot appear twice, and the Opportunity may contain a maximum of one Product where Requires_Separate_Deed__c = TRUE.
Use Opportunity Contact Roles for the buyer relationship and add transaction-specific metadata such as Ownership_Percentage__c and Notary_Contact__c. Validate the total before allowing later stages.
Reservation → Agreement → Deed → After Sales is stored on Opportunity.StageName and visualised with Salesforce Path. Validation rules and Flow check the required signatures, deposits, ownership, notaries and bundle validity before allowing progression.
A concise explanation you could give before drilling into the diagram.
I would stay standard-first. The Opportunity itself represents the legal sale or bundle, and each physical apartment, parking space or basement is a Product. Price Book Entries hold list prices, while Opportunity Products represent the units selected into that transaction and their negotiated prices. The bundle is enforced rather than modelled as another object: every physical Product has quantity one, the same unit cannot participate in two active sales, and an Opportunity can contain a maximum of one Product requiring its own deed. Buyers are Contacts or Person Accounts associated through Opportunity Contact Roles, carrying ownership percentage and the notary for that buyer in that transaction. I would flatten Reservation, Agreement, Deed and After Sales onto Opportunity Stage and use Salesforce Path to guide users through the relevant signature and deposit fields. Flow handles most orchestration and validation, while I would consider Apex row locking for the actual unit reservation to protect against concurrent double-selling.
Standard Salesforce labels are shown first, with API names beneath. The lifecycle is flattened onto Opportunity, while relationship types, bundle membership and OWD are visible directly in the diagram.