Custom objects are one of Salesforce’s most powerful features - and one of the easiest to misuse. Create too many and your org becomes a tangled web of relationships that nobody understands. Create too few and you end up cramming data into standard objects where it doesn’t belong. This guide gives you a practical framework for making the right call.
The Decision Framework¶
Before creating a custom object, answer these four questions:
-
Does this data have a one-to-many relationship with an existing object? If a single Account needs multiple related records of this type (e.g., multiple Subscriptions), a custom object is appropriate. If it’s always one-to-one, custom fields on the existing object are simpler.
-
Does this data have its own lifecycle? If the records go through their own stages, have their own status tracking, or need independent reporting, they deserve their own object.
-
Would adding this as fields create excessive clutter? If you’re adding 15+ fields to an Account or Opportunity for a single use case, that’s a signal to break it out into its own object.
-
Will multiple teams need to interact with this data independently? If CS needs to manage renewals separately from sales managing new opportunities, a custom Renewal object makes more sense than overloading the Opportunity object.
Quick Decision Matrix¶
| Scenario | Use Custom Fields | Use Custom Object |
|---|---|---|
| Tracking a single data point per record | Yes | No |
| Multiple records of the same type per parent | No | Yes |
| Data has its own status or lifecycle | No | Yes |
| Only 3–5 fields needed | Yes | No |
| Cross-object reporting is critical | No | Yes |
| Data needs its own page layout and views | No | Yes |
Common RevOps Custom Objects¶
These are the custom objects that most mature RevOps teams build:
1. Subscription / ARR Tracker¶
- Related to: Account (Master-Detail)
- Purpose: Track active subscriptions, renewal dates, and ARR independently from opportunities
- Key fields: Start Date, End Date, MRR, ARR, Status, Product Line
2. Handoff Record¶
- Related to: Opportunity (Lookup)
- Purpose: Document the sales-to-CS handoff with structured fields instead of free-text notes
- Key fields: Handoff Date, Use Cases, Success Criteria, Key Stakeholders, Technical Requirements
3. Competitive Intelligence¶
- Related to: Opportunity (Lookup), Account (Lookup)
- Purpose: Track competitors encountered in deals for win/loss analysis
- Key fields: Competitor Name, Strengths, Weaknesses, Outcome, Pricing Intel
4. Territory Assignment History¶
- Related to: Account (Lookup), User (Lookup)
- Purpose: Maintain a history of territory changes for comp dispute resolution
- Key fields: Assigned Rep, Start Date, End Date, Reason for Change
Pro tip: Before building a custom object, check the AppExchange. Managed packages for common use cases (like renewals or project management) can save hundreds of hours - just evaluate whether the package’s data model fits your needs.
Naming Conventions¶
Consistency prevents confusion. Follow these rules:
- Object API name: Use PascalCase with a descriptive noun:
Subscription__c,Handoff_Record__c - Field API names: Use the object prefix:
Subscription_Start_Date__c,Subscription_ARR__c - Avoid abbreviations:
Territory_Assignment__c, notTerr_Assign__c - Use singular nouns for object names:
Subscription__c, notSubscriptions__c - Document the purpose in the object’s Description field - future admins will thank you
Relationship Types¶
Choose the right relationship type based on data dependency:
| Relationship | Use When | Behavior on Delete | Sharing |
|---|---|---|---|
| Master-Detail | Child cannot exist without parent | Child is deleted | Inherits parent sharing |
| Lookup | Records are related but independent | Child is preserved | Independent sharing rules |
| External Lookup | Connecting to external system IDs | N/A | N/A |
| Hierarchical | Self-referencing (Account hierarchy) | No cascade | Follows hierarchy |
Default to Lookup unless you specifically need cascade delete or inherited sharing. Master-Detail relationships are harder to change later and limit your flexibility on sharing rules.
Avoiding Custom Object Sprawl¶
Every custom object adds complexity. Manage it with these practices:
- Maintain an object inventory - A shared spreadsheet listing every custom object, its owner, purpose, and record count
- Quarterly usage review - Objects with fewer than 50 records after 6 months should be evaluated for deprecation
- Require approval - Custom object creation should go through your CRM governance process with RevOps sign-off
- Retire gracefully - When deprecating an object, export the data, archive it, and remove the object in a sandbox first
Key Takeaways¶
- Use custom objects when data has a one-to-many relationship, its own lifecycle, or needs independent reporting
- Default to custom fields for simple, single-value data points - avoid over-engineering
- Follow strict naming conventions and document every custom object’s purpose
- Choose Lookup relationships by default; use Master-Detail only when cascade delete and inherited sharing are required
- Maintain an object inventory and review usage quarterly to prevent sprawl