# Custom attributes on system object types

*B2C Commerce Developer Study Guide · Data Management Using Business Manager Usage · Last updated November 3, 2026 · https://www.certifyforce.com/study-guide/b2c-commerce-developer/data-management-using-business-manager-usage/custom-attributes-on-system-object-types*

Adding a field to Product, Content or another system object: attribute definitions and the groups that make them visible in Business Manager, value types and per-type limits, the Externally Managed flag, reading set and enum values safely in script, site custom preferences, and exposing the value through SFRA models and OCAPI's c_ properties.

- Certification: Salesforce B2C Commerce Developer
- Exam section: Data Management Using Business Manager Usage
- Study guide: https://www.certifyforce.com/study-guide/b2c-commerce-developer

**Official exam objective:**

> Given business requirements, extend the storefront to expose a new attribute on an existing system object type.

## What the exam expects

- Add a custom attribute to an existing system object type and make it visible to merchandisers through an attribute group.
- Choose a value type deliberately, knowing that changing type or language loses existing values, and apply the per-object definition limits.
- Protect feed-owned values with the Externally Managed flag.
- Read and write set-of and enum attributes correctly in script, and store per-site settings as SitePreferences custom attributes.
- Show the value on an SFRA page (model extension plus template override) and recognise it in OCAPI documents.

Key terms: **system object type** (a platform-defined object such as Product, Content or SitePreferences that you can extend but not create); **attribute definition** (the ID, display name and value type of one attribute); **attribute group** (the Business Manager grouping an attribute must belong to before it appears on a page); **Externally Managed** (a flag telling Business Manager users not to edit a feed-owned custom attribute); **custom preference** (a custom attribute on SitePreferences or OrganizationPreferences).

## Key facts

| Fact | Detail | Source |
|---|---|---|
| Business Manager visibility | Attribute must belong to an attribute group | [Use Custom Object Definitions](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-business-objects.html) |
| Changing type or language | Existing values are lost | [Use Custom Object Definitions](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-business-objects.html) |
| Product limit | 500 custom attribute definitions, localizable included | [Use Custom Object Definitions](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-business-objects.html) |
| Content and most system objects | 50 custom attribute definitions | [Use Custom Object Definitions](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-business-objects.html) |
| Externally Managed | Custom attributes only; clear it to fix a bad feed value | [Use Custom Object Definitions](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-business-objects.html) |
| Multi-value reads | Java-backed copies; reassign to update | [Class CustomAttributes](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-script-api/dw.object.CustomAttributes.html) |
| Unset enum | EnumValue with a null base value | [Class EnumValue](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-script-api/dw.value.EnumValue.html) |
| Missing custom preference | `getCustomPreferenceValue` returns null | [Class Site](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-script-api/dw.system.Site.html) |
| OCAPI property name | `c_` prefix | [OCAPI Custom Properties](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-commerce-ocapi/customproperties.html) |

## Check yourself

- What is the cap on custom definitions for the Line Item Tax object?
- Why can't you set Externally Managed on a standard product field?
- When does `Array.isArray()` return false for a value read from a product?
- What does `Site.getCustomPreferenceValue()` return for a preference ID that was never defined?

## Sources

- [Use Custom Object Definitions](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-business-objects.html)
- [B2C Commerce Business Objects (Trailhead)](https://trailhead.salesforce.com/content/learn/modules/cc-digital-for-developers/digital-business-objects)
- [Class CustomAttributes](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-script-api/dw.object.CustomAttributes.html)
- [Class EnumValue](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-script-api/dw.value.EnumValue.html)
- [Class Site](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-script-api/dw.system.Site.html)
- [Customize SFRA](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-customizing-sfra.html)
- [OCAPI Custom Properties](https://developer.salesforce.com/docs/commerce/b2c-commerce/references/b2c-commerce-ocapi/customproperties.html)
- [Why Use SCAPI](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/why-use-scapi.html)

## About the full unit

The "Core concepts", "Exam traps" and "Worked scenario" sections of this unit, its 9 linked practice questions, and unlimited timed mock exams are included with the B2C Commerce Developer pack (USD $19): https://www.certifyforce.com/practice-exams
