Creator Resolution Pattern
Use this pattern at the top of any section or template to resolve the creator from either context:
{% liquid
if metaobject
assign cc_creator = metaobject
else
assign cc_handle = cart.attributes['cc-creator-handle']
assign cc_creator = metaobjects.creator[cc_handle]
endif
assign has_creator = cc_creator != blank
%}
Why two branches?
- On metaobject page templates (landing pages), the
metaobject variable is the creator — use it directly
- On all other pages (PDP, homepage, collection pages), resolve the creator from cart attributes set by the SDK
Available Fields
Out-of-the-Box Base Fields
These fields are available by default in CreatorCommerce (no additional custom field setup required).
| Group | Fields |
|---|
| Creator identity | cc-creator-id, cc-creator-first-name, cc-creator-last-name, cc-creator-email, cc-creator-handle, cc-creator-is-onboarded, cc-creator-profile-picture |
| Creator shop | cc-creator-shop-id, cc-creator-shop-handle, cc-creator-shop-title, cc-creator-shop-url, cc-creator-shop-description, cc-creator-shop-theme-primary-color |
| Collaboration | cc-collab-id, cc-collab-relationship-manager, cc-collab-tier, cc-collab-tier-key, cc-collab-discount-amount, cc-collab-discount-type, cc-collab-tier-discount-amount, cc-collab-tier-discount-type, cc-collab-affiliate-code, cc-collab-discount-code, cc-collab-affiliate-link |
| Shopify refs | cc-creator-collection, cc-creator-metaobject, cc-collab-metaobject, cc-creator-customer |
| Channel | cc-channel-handle, cc-channel-myshopify-domain, cc-channel-brandkit-primary-color, cc-channel-brandkit-title, cc-channel-brandkit-primary-logo, cc-channel-integrations-klaviyo-enabled, cc-channel-default-messaging-enabled |
| Campaign | cc-campaign-id, cc-campaign-title |
Some stores may expose legacy cc-channel-myshopify-domian alongside cc-channel-myshopify-domain. Treat the correctly spelled key as canonical and support the typo variant only for backward compatibility.
Identity
| Field | Access | Type | Example |
|---|
| Creator ID | cc_creator.cc-creator-id | Text | "6997d1305fe142fd13cff4b6" |
| First name | cc_creator.cc-creator-first-name | Text | "Sarah" |
| Last name | cc_creator.cc-creator-last-name | Text | "Jones" |
| Email | cc_creator.cc-creator-email | Text | "jill+test@creatorcommerce.shop" |
| Creator handle | cc_creator.cc-creator-handle | Text | "jill-650" |
| Shop handle | cc_creator.cc-creator-shop-handle | Text | "sarah-jones" |
| Shop title | cc_creator.cc-creator-shop-title | Text | "Sarah's Shop" |
| Shop URL | cc_creator.cc-creator-shop-url | URL | "https://drops.shop/jill-650/nuuds" |
| Shop description | cc_creator.cc-creator-shop-description | Text | "Skincare enthusiast..." |
| Is onboarded | cc_creator.cc-creator-is-onboarded | Boolean | true |
| Field | Access | Type |
|---|
| Profile picture | cc_creator.cc-creator-profile-picture | URL |
| Cover image | cc_creator.data.value['cc-creator-cover-image'] | URL |
| Theme primary color | cc_creator.cc-creator-shop-theme-primary-color | Color hex |
Collaboration (Discount & Affiliate)
| Field | Access | Example |
|---|
| Discount code | cc_creator.cc-collab-discount-code | "SARAH15" |
| Discount amount | cc_creator.cc-collab-discount-amount | "15" |
| Discount type | cc_creator.cc-collab-discount-type | "Percentage" or "Fixed" |
| Affiliate code | cc_creator.cc-collab-affiliate-code | "SARAH27668" |
| Affiliate link | cc_creator.cc-collab-affiliate-link | URL |
| Relationship manager | cc_creator.data.value['cc-collab-relationship-manager'] | "social-snowball" |
| Collab tier | cc_creator.data.value['cc-collab-tier'] | "CC // Tier 1" |
| Collab ID | cc_creator.data.value['cc-collab-id'] | "6997d1305fe142fd13cff4d7" |
| Tier key | cc_creator.data.value['cc-collab-tier-key'] | "28002" |
| Tier discount amount | cc_creator.data.value['cc-collab-tier-discount-amount'] | "20" |
| Tier discount type | cc_creator.data.value['cc-collab-tier-discount-type'] | "Percentage" |
Brand Kit (Channel)
| Field | Access |
|---|
| Brand primary color | cc_creator.cc-channel-brandkit-primary-color |
| Brand secondary color | cc_creator.cc-channel-brandkit-secondary-color |
| Brand title | cc_creator.cc-channel-brandkit-title |
| Brand description | cc_creator.cc-channel-brandkit-description |
| Brand logo | cc_creator.cc-channel-brandkit-primary-logo |
| Brand banner image | cc_creator.cc-channel-brandkit-banner-image |
| Channel handle | cc_creator.data.value['cc-channel-handle'] |
| MyShopify domain | cc_creator.data.value['cc-channel-myshopify-domain'] |
| Klaviyo enabled | cc_creator.data.value['cc-channel-integrations-klaviyo-enabled'] |
| Default messaging enabled | cc_creator.data.value['cc-channel-default-messaging-enabled'] |
Campaign
| Field | Access |
|---|
| Campaign ID | cc_creator.data.value['cc-campaign-id'] |
| Campaign title | cc_creator.data.value['cc-campaign-title'] |
Social Handles (Coming Soon)
| Field | Access |
|---|
| Instagram | cc_creator.cc-instagram-handle |
| TikTok | cc_creator.cc-creator-tiktok-handle |
| YouTube | cc_creator.cc-creator-youtube-handle |
Working with Drops
Drops are the core data structure for creator-curated product lists. They live in cc_creator.data.value['cc-creator-drops'] as a JSON array.
Drop Structure
Each drop contains:
| Field | Key | Type |
|---|
| Drop ID | cc-creator-drop-id | String |
| Handle | cc-creator-drop-handle | String |
| Title | cc-creator-drop-title | String |
| Description | cc-creator-drop-description | String |
| Collection ID | cc-creator-drop-collection-id | String (Shopify collection ID) |
| Products | cc-creator-drop-products | Array |
| Media | cc-creator-drop-media | Array |
Product Structure (within a Drop)
Each product in cc-creator-drop-products contains:
| Field | Key | Type |
|---|
| Product ID | cc-creator-drop-product-shopify-id | String (Shopify product ID) |
| Enhancement note | cc-creator-drop-product-enhancement-note | String (creator’s review) |
| Enhancement media | cc-creator-drop-product-enhancement-media | Array |
| Enhancement variant | cc-creator-drop-product-enhancement-variant | String (variant ID) |
| Product note | cc-creator-drop-product-note | String |
Iterating Drops
{% if cc_creator.data.value['cc-creator-drops'] %}
{% for drop in cc_creator.data.value['cc-creator-drops'] %}
<h2>{{ drop['cc-creator-drop-title'] }}</h2>
<p>{{ drop['cc-creator-drop-description'] }}</p>
{% for product in drop['cc-creator-drop-products'] %}
<div class="product-card">
<p>Product ID: {{ product['cc-creator-drop-product-shopify-id'] }}</p>
{% if product['cc-creator-drop-product-enhancement-note'] != blank %}
<blockquote>"{{ product['cc-creator-drop-product-enhancement-note'] }}"</blockquote>
{% endif %}
</div>
{% endfor %}
{% endfor %}
{% endif %}
Matching Current Product to a Drop
On product pages, check if the current product exists in any creator drop:
{% assign shopify_product_id = product.id | append: '' %}
{% for drop in cc_creator.data.value['cc-creator-drops'] %}
{% for cc_product in drop['cc-creator-drop-products'] %}
{% if cc_product['cc-creator-drop-product-shopify-id'] == shopify_product_id %}
<!-- This product is in the creator's drop -->
{% if cc_product['cc-creator-drop-product-enhancement-note'] != blank %}
<p class="creator-note">{{ cc_product['cc-creator-drop-product-enhancement-note'] }}</p>
{% endif %}
{% endif %}
{% endfor %}
{% endfor %}
Always convert product.id to a string with | append: '' before comparing with JSON-stored IDs. Shopify IDs are integers; JSON stores them as strings. Direct comparison will fail.
Fallback Handling
Always provide fallbacks for missing data. The fallback value should be neutral — it should make sense to a shopper even when no creator is present.
Quick Fallback Pattern
{% liquid
assign creator_name = cc_creator.cc-creator-first-name | default: 'Our Expert'
assign creator_bio = cc_creator.cc-creator-shop-description | default: ''
assign creator_color = cc_creator.cc-creator-shop-theme-primary-color | default: '#000000'
%}
Fallback Strategy by Field Type
| Field Type | Has Creator + Has Data | Has Creator + Missing Data | No Creator | |
|---|
| Name / text | Show creator value | Use ` | default:` neutral text | Use section settings value |
| Profile picture | Show creator image | Show initials or section fallback image | Show section settings image or hide | |
| Bio / description | Show creator bio | Hide element entirely | Show section settings text or hide | |
| Discount code | Show discount UI | Hide discount UI entirely | Hide discount UI entirely | |
| Discount amount | Calculate + show price | Hide price modification | Show original price only | |
| Brand color | Apply CSS variable | Use ` | default:` theme color | Use theme default |
| Drops / products | Iterate creator drops | Show section collection fallback | Show section collection fallback | |
| Social handles | Show linked icons | Hide individual missing icons | Hide social section entirely | |
Conditional Rendering Pattern
For UI elements that should only appear when data exists (not just default values):
{%- comment -%} Only show the discount banner if there's an actual code {%- endcomment -%}
{% if cc_creator and cc_creator.cc-collab-discount-code != blank %}
<div class="discount-banner">
Use code <strong>{{ cc_creator.cc-collab-discount-code | escape }}</strong>
for {{ cc_creator.cc-collab-discount-amount | escape }}% off
</div>
{% endif %}
{%- comment -%} Only show bio if it exists — don't show empty space {%- endcomment -%}
{% if cc_creator and cc_creator.cc-creator-shop-description != blank %}
<p class="creator-bio">{{ cc_creator.cc-creator-shop-description | escape }}</p>
{% endif %}
Three-State Handling
Best practice for robust sections — handle all three states:
{% if cc_creator and cc_creator.cc-creator-first-name != blank %}
{%- comment -%} State 1: Creator present, data available {%- endcomment -%}
<h2>Shop {{ cc_creator.cc-creator-first-name | escape }}'s Picks</h2>
{% elsif cc_creator %}
{%- comment -%} State 2: Creator present, specific data missing {%- endcomment -%}
<h2>Shop Curated Picks</h2>
{% else %}
{%- comment -%} State 3: No creator context at all {%- endcomment -%}
<h2>{{ section.settings.heading }}</h2>
{% endif %}
Custom Fields (Customer Fields)
Custom fields let merchants extend the creator data model with additional fields specific to their program. These fields live inside the data JSON and are accessed differently depending on their level.
Field Levels
| Level | Description | Access Pattern |
|---|
| Creator-level | Custom fields on the creator (e.g., cc-bio, cc-shoe-size) | cc_creator.data.value['cc-field-name'] |
| Drop-level | Custom fields on a drop (e.g., cc-featured-media, cc-drop-theme) | drop['cc-field-name'] (within drops iteration) |
| Product-level | Custom fields on a product within a drop (e.g., cc-shoe-size, cc-fit-notes) | product['cc-field-name'] (within products iteration) |
Accessing Custom Fields
{%- comment -%} Creator-level custom field {%- endcomment -%}
{% assign creator_bio = cc_creator.data.value['cc-bio'] %}
{% if creator_bio != blank %}
<p>{{ creator_bio | escape }}</p>
{% endif %}
{%- comment -%} Drop-level custom field {%- endcomment -%}
{% for drop in cc_creator.data.value['cc-creator-drops'] %}
{% assign featured_media = drop['cc-featured-media'] %}
{% if featured_media != blank %}
<img src="{{ featured_media }}" alt="Featured">
{% endif %}
{% endfor %}
{%- comment -%} Product-level custom field {%- endcomment -%}
{% for drop in cc_creator.data.value['cc-creator-drops'] %}
{% for product in drop['cc-creator-drop-products'] %}
{% assign shoe_size = product['cc-shoe-size'] %}
{% if shoe_size != blank %}
<span>Creator wears size {{ shoe_size | escape }}</span>
{% endif %}
{% endfor %}
{% endfor %}
Custom Fields + Filtering
Custom fields are useful for filtering creators in directories or products in grids:
{%- comment -%} Filter creators by a custom field value {%- endcomment -%}
{% for creator in metaobjects.creator %}
{% assign creator_data = creator.data.value %}
{% if creator_data['cc-specialty'] == 'yoga' %}
{%- comment -%} Show this creator {%- endcomment -%}
{% endif %}
{% endfor %}
See Custom Fields Reference for a full list of common custom field patterns.
The data JSON Field
The creator.data field contains the complete JSON representation of the Creator Primitive. While most top-level fields have their own dedicated metaobject fields, data is useful for:
- Accessing deeply nested values (drops, products, enhancements)
- Reading campaign and collab details
- Building complex conditional logic
Access pattern:
{{ cc_creator.data.value['field-name'] }}