Skip to content

Custom Objects

Also in 28 languages

Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

In a truck body shop, a custom white box body hangs on chains above a standard truck chassis, already fitted with its doors, lights and mud flaps.
Image generated with AI

Module 3 of 10 in the chapter Salesforce Data Architecture, chapter 3 of the Data Architect course. Each module stands on its own. Previous: Look to the Mothership: The Standard Data Models · Next: Where Does This Data Live?

The question this module answers: When Salesforce doesn’t have it, what do you actually get when you build your own object?

In the last module we looked at what Salesforce has already built. Sometimes it doesn’t have what you need. Steve Trucking runs trucks, and there’s no standard Truck object. So you build one: a custom object.

Here’s what I want you to see in this module. A custom object is created in metadata, like everything else in module 1, and the moment it exists it comes with a set of standard functionality. It isn’t a blank table. And the screen you fill in to create it is asking you architecture questions, whether you notice or not.

Go to Setup → Object Manager → Create → Custom Object and you get one long form. Most people fill in the first two boxes and click Save. Let’s slow down and read it.

Label and Plural Label. “Truck” and “Trucks”. These are what users see, in tabs, page layouts and reports. You can change them later without much pain.

Object Name. This one is different: it’s the API name, the name code, integrations, reports and now agents use. Type “Truck” and Salesforce makes it Truck__c. Changing it later means finding everything that refers to it, which is the Reversibility Test from chapter 1 again. Get this one right the first time.

Description. Fill it in. Every time. In module 1 I said metadata isn’t decoration any more: the next admin reads this, and so does every AI tool that tries to understand your org. A custom object with an empty description is a box with no label on it.

Record Name. Every custom object has a Name field, and this is where you decide what it is. A Text name, like “Truck 117”, or an Auto Number, like T-000184, which Salesforce fills in for you. Read the warning on that screen: if you plan to insert a high volume of records through the API, Salesforce tells you to use Text. That’s the platform telling you something about scale before you’ve created a single record.

The Record Name section of the New Custom Object screen: the Record Name box, a Data Type of Text, and the warning to use the Text data type if you plan to insert a high volume of records through the API

Salesforce Setup, New Custom Object: the Record Name section, with its warning (screenshot, 2026-10-12). Full size

Optional Features. Allow Reports, Allow Activities, Track Field History, Allow in Chatter Groups. Off by default. Each one is a capability you’re switching on for this object; decide on purpose.

Object Classification. Allow Sharing, Allow Bulk API Access, Allow Streaming API Access, all on by default. The screen says it plainly: with these on, the object is an Enterprise Application object; with them off, it’s a Light Application object. Those names line up with Salesforce’s app-subscription licenses: a Lightning Platform Light App has no record-level sharing and can’t use the Bulk API or Streaming API, and an Enterprise App can. My advice: leave them on unless you know exactly why not. Turn off Bulk API access on an object you’ll later load in volume, and you’ll find out why it mattered.

Deployment Status and Search. “In Development” hides the object from users while you build it; “Deployed” makes it live. And Allow Search is off by default, so users won’t find these records in global search until you turn it on. That one catches people every time.

The Object Classification, Deployment Status and Search Status sections: Allow Sharing, Allow Bulk API Access and Allow Streaming API Access ticked; Deployed selected; Allow Search unticked

The defaults: the three API settings on, Deployed, and Allow Search off (screenshot, 2026-10-12). Full size

Click Save, and Object Manager shows you the object: API name Truck__c, a check in Custom, the labels, the deployment status. Look down the left-hand side, though: Fields & Relationships, Page Layouts, Lightning Record Pages, Record Types, Validation Rules, Triggers, Flow Triggers, Object Access, Field Access. That list is module 1 made visible. An object isn’t just storage; it’s the place all of that behavior hangs from.

Object Manager showing the Truck object: API Name Truck__c, Custom ticked, singular and plural labels, and the left-hand list from Fields & Relationships to Validation Rules

Object Manager, Truck: the API name Truck__c, Custom, and everything that hangs off an object (screenshot, 2026-10-12). Full size

Open Fields & Relationships on a brand-new custom object, and it already has fields. Every custom object gets a standard set:

  • Name, the record name you just chose, used in page layouts, related lists, lookups and search results.
  • Owner, the user or queue that owns the record.
  • Created By and Last Modified By, the users who created and last changed it.
  • Currency, if multi-currency is on, and Division, if your org uses divisions.

And underneath, the record ID from module 1, and the created and modified dates. Export a few records with Data Loader and you’ll see them all.

One of them can disappear. Make your custom object the detail side of a master-detail relationship, and the Owner field goes away: ownership comes from the master record instead. That’s a bigger deal than it sounds, and we’ll come back to it in modules 7 and 8.

Prefixes and Suffixes: What You’re Looking At

Section titled “Prefixes and Suffixes: What You’re Looking At”

In the last module I said standard objects have no prefix and no suffix. Everything else does, and once you can read them, a field list tells you exactly what you’re looking at.

What it looks likeWhat it is
Account, CaseA standard object or field: no prefix, no suffix
Truck__cA custom object, or a custom field, like Unit_Number__c
abc__Inspection__cA custom object from a managed package: abc is the vendor’s namespace
Delivery_History__bA big object (module 4)
Shipment__xAn external object: the data lives in another system (module 4)
Allergies__pcA custom contact field on a person account (module 2)
Truck__rThe relationship behind a custom lookup, when you follow it in a query

A few things to notice.

So far that’s a list. Here’s how I teach it: as layers. There are three kinds of object, standard, custom and managed package, and every one of them can have the same kinds of field on it: the standard fields it came with, and the custom fields somebody added.

Standard objects. Account has no prefix and no suffix, and neither do its standard fields: Name, Industry, OwnerId. You can add custom fields to most standard objects, and every one you add ends in __c: Region__c (Custom Fields (opens in a new tab)). That suffix is what keeps you safe. Salesforce adds new standard fields to Account in its releases, and because yours always end in __c and theirs never do, a future standard field can never collide with a field you already have.

Custom objects. Your own object ends in __c, Truck__c (Custom Objects (opens in a new tab)), and so do the custom fields you put on it: Unit_Number__c. But the fields it was born with, the ones from the last section, are standard fields: Name, OwnerId, CreatedDate, no suffix. So even on your own object, the suffix tells you who made each field.

Managed package objects. When you install a managed package from AppExchange, its objects and fields come with the vendor’s namespace prefix: abc__Inspection__c, and fields like abc__Result__c. That prefix is unique to the vendor, and it doesn’t change (Namespace Prefix (opens in a new tab)). In Salesforce’s own words, the prefix is added to each component to make it unique: name__c becomes prefix__name__c (AppExchange Object Prefixes and the API (opens in a new tab)). So two vendors can both ship an object called Invoice__c and never collide with each other, or with you. The package’s objects still have their standard fields, Name and OwnerId, with no prefix. A package can also add its own prefixed fields to standard objects, like abc__Score__c on Account. And you can add your own custom fields to a package’s objects: Depot__c on abc__Inspection__c takes your __c suffix, but never the vendor’s prefix, because you made it, not them (Known Issue: unmanaged custom field on a managed package object (opens in a new tab)).

Reading the names Three kinds of object, each read in the same four layers. A standard object, built by Salesforce: Account; its standard fields, such as Name, OwnerId and Industry, have no suffix; a managed package can add its own fields, such as abc__Score__c; your custom fields end in __c, like Region__c. A custom object, built by you: Truck__c; its standard fields, Name, OwnerId and CreatedDate, have no suffix; no package fields, because the object is yours; your custom fields end in __c, like Unit_Number__c. A managed package object, installed from vendor abc: abc__Inspection__c; its standard fields have no prefix; the package's own fields carry the prefix, like abc__Result__c; and fields you add, like Depot__c, take your __c suffix but never the vendor's prefix. Underneath: no suffix is Salesforce's, __c is custom, and abc__ is the vendor's, and it never changes. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.28.0", "built": "2026-10-15", "id": "DGM-DA-PD-31", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "comparison 0.3.0", "theme": "stevetecharc 1.4.0"} Standard object built by Salesforce THE OBJECT Account ITS STANDARD FIELDS Name, OwnerId, Industry: no suffix A PACKAGE'S FIELDS abc__Score__c, if a package adds one YOUR CUSTOM FIELDS Region__c Custom object built by you THE OBJECT Truck__c ITS STANDARD FIELDS Name, OwnerId, CreatedDate: no suffix A PACKAGE'S FIELDS none: the object is yours YOUR CUSTOM FIELDS Unit_Number__c Managed package object installed, from vendor abc THE OBJECT abc__Inspection__c ITS STANDARD FIELDS Name, OwnerId, CreatedDate: no prefix A PACKAGE'S FIELDS abc__Result__c YOUR CUSTOM FIELDS Depot__c: your suffix, never their prefix No suffix: Salesforce's. __c: custom. abc__: the vendor's, and it never changes. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Read any API name and you know who made it. No suffix: Salesforce. __c with no prefix: your org. abc__ in front: the vendor. That matters every time you plan a change. What’s yours, you can change. What’s Salesforce’s, you configure and extend. What’s the vendor’s is mostly locked: a few things, like page layouts and help text, are yours to edit, but most of the package, and every API name, belongs to the vendor, and their upgrades bring their changes (Editable Properties After Package Promotion or Installation (opens in a new tab)).

Unmanaged packages don’t. Install an unmanaged package, and its objects land in your org as if you’d built them yourself, with no prefix. If it brings a Truck__c and you already have one, you have a name collision. Check before you install.

Creating a custom object is easy; that’s exactly why I think we create too many of them. The New Custom Object screen will happily make you a Customer__c in an org that already has Account. So before you click it, ask the question from the last module: does the mothership already have this? If it does, use it. If it doesn’t, build it, and fill in the whole screen like an architect.

The next module asks an even earlier question: should this data be in Salesforce at all?

  • Whether Salesforce already has a standard object for this, before building a custom one.
  • The API name, chosen once, and a description written for people and machines.
  • The record name: Text or Auto Number, with the volume you expect in mind.
  • Which optional features, API access and search to turn on, on purpose.
  • What the suffixes in an org tell you: custom, managed, big, external, person account.
  • Whether a package you’re about to install could collide with what you’ve built.