# Welcome

Since the earliest days of ecommerce, one thing has been clear - *merchants need more.* More freedom, more flexibility, more ways to shape their stores into reflections of their brand.

The cornerstone of all customization is **data**.

It’s the thread that ties together flexibility, design and operations. But without structure, data is just noise.

That’s where **Accentuate** found its purpose.

Accentuate is more than just an app, it’s a tool designed to help you get the most out of Shopify and *out of your ideas.*

**Metafields** and **Metaobjects** are the foundation of Accentuate - the structures that *turn ideas into reality.*

### Vision behind Accentaute

1. **Centralize your operations** – Connect every part of your store under one system. All of your data, templates and content are manageable from one app.<br>
2. **Build your own Content Management System (CMS)** – Create, manage and modify digital content without coding required.<br>
3. **Display content on your storefront without limitations**

### The Foundation: Metafields & Metaobjects

At its core, Accentuate is built on **two key pillars:** Metafields and Metaobjects.

Think of **Metafields** (custom fields) as **invisible sticky notes attached to your products.** Each one holds **specific**, **customizable information**.

Metafields come in **different types**, such as text, number, date, image or URL. These "types" help Shopify understand exactly **how to use the information** stored in the Metafield. To illustrate:&#x20;

* **Text**: *"Handmade with love"*
* **Number**: *40 (hours of burn time for your candle)*
* **Date**: *\*"2024-12-25" (holiday release date)\**
* **Image**: *An extra product close-up*
* **URL**: *Link to a detailed care guide*

Shopify doesn’t come with a built-in “burn time” field but Metafields let you create it yourself. That means you can answer customer questions before they’re even asked.

Accentaute takes this concept further with **Metaobjects**. Think of Metaobjects as **organized collections** or **"bundles" of information**. They were created to make **reusing** information easy or to build **content templates** (size guides, material lists, specifications).&#x20;

Suppose you sell clothing and need a detailed size guide for shirts. Create a "Shirt Size Guide" Metaobject:

* **Chest Width**: *S (36"), M (38"), L (40")*
* **Sleeve Length**: *S (25"), M (26"), L (27")*
* **Material**: *100% organic cotton*

Once created, whenever you list a new shirt, you can simply reference this size guide. Updates to the size guide automatically reflect everywhere - no duplicates, no inconsistencies.

Now, take that idea and apply it across your products, collections and orders.&#x20;

To make this even easier, Accentuate includes **Bulk Reference Manager** - a tool built to manage references between scopes at scale. It keeps your data consistent, connected and effortlessly reusable. Bulk Reference Manager offers capabilities that are currently unparalleled in the Shopify ecosystem.&#x20;

### Made for Everyone - From Beginners to Experts

Accentuate is designed to grow with you. Simple enough for beginners, powerful enough for complex stores. Our features adapt to your needs. Once you understand how it works, you’ll wonder how you ever ran your store without it.

So why settle for the default when you can **accentuate** everything?

*Once you have it, you’ll love it.*

\
\ <br>


# What are Metafields

### Metafields: The Missing Piece in Your Shopify Store

As your store grows, so does the complexity of the information you want to show your customers. Shopify gives you the basics: a title, a price, a description. Enough to list a product but *not enough to explain it.*

What if your candle has a 40-hour burn time?

What if your shirts need size charts?

What if your beauty products include ingredients that matter?

Your customers want more than a summary. They want **clarity**, **context** and **confidence** before they buy.

Shopify won’t stop you from sharing that information. But it won’t tell you where to put it either. That’s where Metafields come in. They’re how you **organize**, **structure**, and **display** the details that don’t fit anywhere else *(and they’re one of the most powerful tools Shopify offers).*

Despite their importance, Metafields are often misunderstood - Too technical. Too abstract. Too confusing.

This guide aims to eliminate the confusion. Whether you’re new to Shopify or have been managing your store for years, by the end of this article, you’ll understand exactly what Metafields are, how they work and why they matter.

### What Are Metafields?

Think of **Metafields** (custom fields) as **invisible sticky notes attached to your products.** Each one holds **specific**, **customizable information**.

You decide what each one stores. You decide how it’s used. You decide where it shows up.

They’re the missing pieces that bring your store to life. Specific, structured details that give context and clarity to what you’re selling. Here’s what that can look like:

* Burn time of a candle (40 hours)
* Fragrance notes of a perfume (vanilla)
* Fabric content of a shirt 100% COTTON
* Care instructions for an electronic device
* Launch dates of a holiday collection&#x20;
* Supplement facts&#x20;

None of this belongs in the product title. Trying to cram it into the description leads to cluttered layouts, inconsistent formatting and a poor experience for both you and your customers.

Good ecommerce isn’t about throwing more information at people. It’s about giving them the right details at the right time and in the right place - Metafields make that possible.

Metafields come in **different types**, such as text, number, date, image or URL. These "types" help Shopify understand exactly **how to use the information** stored in the Metafield. To illustrate:&#x20;

* **Text**: *"Handmade with love"*
* **Number**: *40 (hours of burn time for your candle)*
* **Date**: *\*"2024-12-25" (holiday release date)\**
* **Image**: *An extra product close-up*
* **URL**: *Link to a detailed care guide*

Shopify doesn’t come with a built-in “burn time” field but Metafields let you create it yourself. That means you can answer customer questions before they’re even asked. That means fewer questions from customers, faster decisions and a cleaner path to purchase.

At first glance,  Metafields might seem small in isolation. But once you start using them, they quietly transform the way your store works. Hence, adding structure, enabling smarter design and unlocking features that scale with your catalog.

And once your data is structured, everything else becomes easier: sorting, filtering, translating, multi-store syncing and creating dynamic storefronts. All of it starts here.

### Scope: Where Metafields live&#x20;

**Metafields don’t just belong to products. They can be attached to nearly every part of your store.**

In Shopify, the part of your store a Metafield is attached to is called a **scope**. A scope defines where the data lives and where that information can be used.

Shopify’s Default Scopes:

* Products
* Variants
* Collections
* Pages
* Blogs
* Articles
* Orders
* Customers
* Shop (anything related to the store as a whole)

Extra Scopes (available via Accentuate)

* **Vendors** – useful for adding vendor-specific information, like custom size charts or warranty policies
* **Locations** – ideal for warehouse data, working hours, delivery access or logistics-related info
* **Product types** – helpful for naming or grouping items by custom categories or styles (e.g., tagging all men’s long-sleeve shirts as “LSM”)

These scopes unlock a wide range of use cases:

* **Products and variants** → burn time, materials or sizing details
* **Collections** → seasonal styling tips or visual banners&#x20;
* **Pages** → unique content blocks or custom messages
* **Articles and Blogs** → author bios or related reading suggestions
* **Orders** → gift messages or delivery instructions
* **Customers** → loyalty tiers, preferences or past interactions
* **Shop** → global content like return policies, disclaimers or storewide messaging
* **Vendors** →  warranty terms to all items from that specific vendor
* **Locations** → warehouse hours, delivery access or contact information
* **Product types** → category-level labeling, filters or grouping logic

Wherever your store needs more context, Metafields can follow.

### How merchants are using Metafields&#x20;

Across industries, the goal is the same: provide context, remove confusion and let the content adapt to the customer’s needs.

Here’s how store owners are using Metafields today:

| Jewelry store     | Custom product options (engraving, monogramming)                                                      |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| Candle shop       | Burn time, scent profile, wax type                                                                    |
| Beauty brand      | Formula details, finish type, vegan certifications                                                    |
| Food store        | nutrition info, ingredients list, frequently bought products (wine with cheese)                       |
| Toy store         | Game instructions, age guidelines                                                                     |
| Electronics store | Tech specs, warranty info, setup guides                                                               |
| Sports shop       | Video product demos embedded in product pages                                                         |
| Clothing store    | displays dynamic sizing guides for each garment based on type (jeans vs. jackets), model measurements |
| Home decor store  | FAQ sections, event or seasonal tags (Holiday Decor)                                                  |

### **Why should you use Metafields?**&#x20;

Because this is what happens when Metafields and Accentuate work together:

**1. Structure to your content and your own CMS**

Metafields let you store data where it belongs, not buried in descriptions or scattered across spreadsheets. With Accentuate, that structured data becomes part of a unified system. Products, collections, vendors, orders - everything is centralized, searchable and easy to manage.

Accentuate acts as your custom CMS (Content Management System) on top of Shopify. Built for your content, your workflows and your store’s growth.

**2. Build once, reuse everywhere**

Reusable content like size charts or brand warranties shouldn’t be duplicated across 50 products - Accentuate turns it into templates. Update it once and it updates everywhere. No errors, no manual copy-paste.<br>

**3. Fully custom storefronts, display exactly what you need**

Metafields make your storefront dynamic - content that changes by product, customer, language or location. Accentuate gives you full control over the layout and logic.

**4. Scale without breaking your workflow**

As your catalog grows, so does the pressure to keep content accurate and consistent. Accentuate gives you a system that scales with you. It’s built for teams, multiple storefronts and fast-changing catalogs.

Metafields give your store flexibility. Accentuate gives that flexibility a system.

*And that’s what makes the difference.*

### Getting Started

If you’re new to Metafields, **don’t overthink it.** Start with one thing your store is missing:

* A tab for care instructions
* A spec list for electronics
* A vendor-specific warranty field<br>

Then give it structure. Define it once. Use it again and **again**.

From there, everything else builds naturally. You’ll find new ways to organize. New ways to automate. New ways to scale.

Whether you're a small store owner or scaling across multiple markets, mastering Metafields will give you a strong competitive advantage.

Metafields aren’t a "nice-to-have." They’re the missing layer between Shopify’s basics and what your store truly needs to thrive:

* Clarity for customers.
* Control for your team.
* Creativity for your brand.

The real question isn’t **why use Metafields.**

*It’s: How did I ever run my store without them?*

<br>

<br>


# What are Metaobjects?

### Metaobjects: The smarter way to reuse content on Shopify

Once you’re comfortable with individual Metafields, something shifts. You stop thinking about one product page, one piece of info, one exception.

**You start thinking in systems.**

How can I reuse this information across similar products?\
What if my care guide changed — can I update it in one place?\
Can I build a content model that works for every collection?

That’s the power of treating your store like a **structured platform**, not a set of disconnected pages.

As your store grows, so does the amount of information you need to manage - care instructions, size charts, product FAQs, testimonials… and often, the same content appears over and over again.

Copying and pasting? That’s a recipe for **errors**, **clutter** and **wasted time**.

That’s where **Metaobjects** come in. Think of them as reusable, structured content blocks that you can define once and use anywhere. If Metafields are sticky notes for specific product details, **Metaobjects are your content binders**. Neatly organized, fully structured and always up to date.

### What Are Metaobjects?

Metaobjects are bundles of related information - think templates like a Size Guide, FAQ section or Testimonial. You define the structure once (fields like "Chest Width," "Sleeve Length" or "Customer Name"), then create entries with real data and reference them across products, collections or pages.

Let’s see what that looks like in action:

#### 1. Size Guide for Clothing:

Suppose you sell clothing and need a detailed size guide. Create a "Size Guide" Metaobject:

* **Chest Width**: *S (36"), M (38"), L (40")*
* **Sleeve Length**: *S (25"), M (26"), L (27")*
* **Material**: *100% organic cotton*

Now, whenever you list a new shirt, you simply reference this size guide. Updates to the size guide **automatically** reflect everywhere.

#### 2. FAQ Sections:

Maybe your customers ask similar questions about your products:

* **Q:** **Do you offer international shipping?**

* *A:* *Yes, we ship worldwide!*

* **Q: What is your return policy?**

* *A: Returns accepted within 30 days*.

Create an "FAQ" Metaobject once, and easily add this FAQ section to any product page or category.

#### 3. Product Care Instructions:

If you sell delicate items, like handmade pottery:

* **Care Instructions:** *Hand wash only, no dishwasher. Avoid extreme temperatures.*

You create a "Care Instructions" Metaobject and reuse it across multiple pottery items.

#### 4. Customer Testimonials:

Boost customer trust by displaying testimonials:

* **Name**: *Sarah J.*

* **Review**: *"Love the quality, will buy again!"*

* **Name**: *Mike T.*

* **Review**: *"Excellent service and fast delivery."*

Create a "Testimonials" Metaobject, and easily add testimonials to a product page or homepage.

### Why Use Metaobjects?

Because your content deserves structure. And your team deserves better tools.

Metaobjects give you:

* **Saved time** – Define once, reuse everywhere.
* **Consistency** – Make one update and have it reflected across your store.
* **Better organization** – Keep your store neat and clean by managing detailed information centrally.<br>

If you’ve ever copied a size chart into ten product descriptions and then had to update it manually — you already know why Metaobjects matter.

**Accentuate Supercharges Metaobjects**

With Accentuate Custom Fields, Metaobjects become **more than just reusable content**. They become a core part of how your store works — **fast**, **scalable** and **easy to maintain**.

*Here’s how:*

* **Version Control** – Stay confident when making changes.

Mistakes happen. Products evolve. And sometimes, you just want to roll back to how things were last week. With Version Control, every change to your Metaobjects is tracked automatically. You can view the history, compare versions and restore older versions with a single click. It’s peace of mind, especially when managing complex content or with multiple team members.<br>

* **Bulk Reference Manager** – Link Metaobjects across multiple entries (products, collections, blogs) in seconds.

Let’s say you create a “Brand Warranty” Metaobject. Now you want to apply it to 120 products. Doing it one by one? That’s tedious.

Bulk Reference Manager lets you link Metaobjects to dozens, or even hundreds, of products, variantsa and collections in one action. You save hours, eliminate human error and ensure consistent information across your storefront.<br>

* **Import & Export** – Add or edit Metaobjects in bulk with CSV files&#x20;

Have a lot of Metaobjects to create? Need to update them in bulk?

With Accentuate, you can import and export your Metaobjects via CSV. This is perfect for larger teams or stores working with product feeds, external content creators, or localization workflows. You can prepare everything in a spreadsheet, upload it in minutes, and skip the manual data entry.

Whether it’s a size guide, a brand’s warranty policy or a curated FAQ, Metaobjects help you scale without losing control.

### Getting Started with Metaobjects

Start simple. Pick one thing you repeat a lot, such as care instructions or a FAQ block.

Define the structure. Add your content. Link it to products.

Once you’ve built your first Metaobject, you’ll start seeing opportunities everywhere to streamline and organize.

With **Metafields**, you control the **details**.\
With **Metaobjects**, you control the **system** behind them.

And with Accentuate, you bring it all together: flexible, scalable, and built for the way you manage your store.

<br>


# Getting started with ACF

### What is a custom field?

A custom field is a placeholder for data, you cannot fit it into Shopify's existing fields for pages, products, collections, etc. available in your Shopify admin detail pages.\
\
Typical custom fields are extra product description fields such as origin details, materials, ingredients, and care instructions as well as fields for holding specific information in your area of business, such as product retail prices, specifications, dimensions, weight, etc. \
\
You can also create extra fields to control your design layouts such as creating linked products, custom product filters, hiding specific products or articles from searches, or call-to-action text on buttons.

### How do I create a custom field in ACF?

In ACF, you start by *defining* your field for the relevant type of object (for example a product, a collection, a page, etc).\
\
A field definition is needed to tell ACF the type of data the field is supposed to hold - a text, a number, a reference to (another) product, an image, or whatever you need - so when you edit your custom fields for e.g. a specific page, the ACF editor knows how to present your input field (including a title and instructions for the intended use) and accept new values being inputted.

{% hint style="info" %}
Any number of custom fields can be defined. While there is no set upper limit, there certainly is a practical upper limit if the field list gets very long and as a result hard to manage.
{% endhint %}

Once a field definition has been created for a certain *scope* (e.g. products), you can use the ACF editor to enter values for this field for each of your products.\
\
You can launch the editor from the list of field definitions using the "Edit values" button but for some object types (like products and pages), you can also launch the editor from Shopify's admin pages. Look for the **More actions** dropdown near the top of the page and then choose **Custom Fields**.

### What is a namespace?

Name*spaces* - together with keys - are an integral part of Shopify metafields and are therefore used as a mechanism for defining ACF custom fields, that ultimately will end up as Shopify metafields.\
\
Namespaces can be used to ensure one app's metafields won’t clash with other apps’ metafields e.g. Shopify Reviews, which uses a namespace of "spr". Using the default **Accentuate** namespace will ensure you are defining a separate set of Metafields, but you can always override this on a field-by-field basis if you like.\
\
It is also a great way to (technically) group sets of fields that naturally belong together. \
\
If you for example need to have two fields, "title" and "rating" for videos, you could opt for grouping them under the namespace "video" giving you two fields called "video.title" and "video.rating". \
\
Then if you need the same two fields for an image, you could place these under the namespace "image" giving you "image.title" and "image.rating" that don't collide with the video fields.\
\
If you need to use ACF to manage Metafields created from other apps, you can match the namespace and key for the fields when defining the field type and ACF will automatically use any existing values going forward. Just take care to define a field type that makes sense with regard to any existing data.

{% hint style="info" %}
Some namespaces are reserved for internal ACF use and cannot be used for field definitions. The field definition dialog will not allow you to define fields using the namespaces *acf\_settings, product\_types, vendors, locations* or *globals*
{% endhint %}


# ACF starter guide

This guide follows the typical process you'll use when working in Accentaute Custom Fields (ACF). Whether you're adding extra product information, customizing content for collections or building structured Metaobjects, here’s how to get started.

The tabs under the **App features** section on the **app's dashboard** follow the typical process of creating a Metafield or Metaobject in Accentuate.&#x20;

{% embed url="<https://drive.google.com/file/d/12_kBGRkham5UUWEaHKykWCqpkDTuSDNJ/view?usp=sharing>" %}

Steps we’ll cover:

1. **Create your first Metafield or Metaobject definition**&#x20;
2. **Add data to your Metafield or Metaobject**
3. **Display it on your storefront**

{% hint style="success" %}
If you’re new to Metafields and Metaobjects, we recommend reading these first:

* [Welcome to Accentuate](https://help.accentuate.io/)
* [What are Metafields?](/introduction/what-are-metafields)
* [What are Metaobjects?](/introduction/what-are-metaobjects)
  {% endhint %}

Let’s get started.

## Step 1: Create a definition (Templates tab)

Go to the **Templates tab** under **App features**. Here, you define **what type of data** you want to store and **how it will be organized**. Think of this step as getting an empty box, labeling it and deciding what will go inside. At this stage, **you are not adding any content yet**.

This box is called a Metafield or Metaobject **definition**.&#x20;

Depending on your goal, you’ll create either a Metafield or a Metaobject template. This is the first and most important step before anything can appear on your storefront. By setting up a definition, you're giving Accentuate the instructions it needs to handle your data.

### Instructions for Metafields

1. Go to the **Templates** tab in the **App features** section.
2. Choose **where** you want to apply it by selecting a [**scope**](https://help.accentuate.io/metafield-definitions/scope) (for example, Product)

<figure><img src="/files/5Xwda7Flbxb7SsybNHfk" alt=""><figcaption></figcaption></figure>

3. Click **Add new field** and configure:
   1. **Label & Name / Key** - internal identifiers you’ll see inside the app to help you stay organized (Shirt material)
   2. **Filed applies to** - lets you choose which types of products the Metafield should apply to (You configure this on the product page under **Product organization → Type**)

<figure><img src="/files/pP8Vb6kDhuT8T8S4q3yT" alt=""><figcaption></figcaption></figure>

&#x20;        c. **Field data type** - choose what type of data you want to store (text, image, URL and more)

<figure><img src="/files/07XiJjZ1eIxLHzVbsl4i" alt=""><figcaption></figcaption></figure>

&#x20;        d. Once you're done, just hit **Save**

{% hint style="info" %}
**Want a deeper dive?** Check out our [**Create a Metafield definition**](/metafield-definitions/create-a-metafield-definition) article for a more in-depth walkthrough, including tips and examples.
{% endhint %}

### Instructions for Metaobjects

[Metaobjects](https://help.accentuate.io/introduction/what-are-metaobjects) are bundles of connected information - think templates like a Size Guide, FAQ section or Testimonial.&#x20;

Unlike Metafields, Metaobjects are independent. You don’t need to attach them to a specific location right away - they can be connected to any scope later.

1. Click on [**Add metaobject**](https://help.accentuate.io/metaobjects/metaobject-definitions) and give your metaobject a label (FAQ Section)
2. Click on **Add metaobject field** and define the fields that make up your template (Label: “First Question”, Type: Text)

Once saved, you’ve created a **reusable template** that you can use every time you need to add an FAQ section.

## Step 2: Add values (Values tab)

To start this process, you will move onto the **Values** tab under **App features**.&#x20;

In this step, you’ll fill in data (content) into the boxes you created in the previous step. What you put into these fields, *your customers will be able to see.*

This data entry is done inside the **Editor**, which is the main workspace in the app for managing and populating your Metafields or Metaobjects. The Editor dynamically adapts to your field structure, making it easy to input, update or validate content for each item.

### Metafields

For Metafields – using the shirt example – go to **Edit values**, find the **“Shirt material” field** and enter your data (silk).

<figure><img src="/files/DbGcadczs20AagEt8V6Y" alt=""><figcaption></figcaption></figure>

### Metaobjects

For Metaobjects – using the FAQ example – go to **Edit metaobjects** and begin filling in your entries (your questions).

<figure><img src="/files/bErZ2Vdd7nkNzr8TlrBn" alt=""><figcaption></figcaption></figure>

### Other tools to explore

The Values tab, also, offers an array of possibilities to manage your data:

* [**Filter & Group**](https://help.accentuate.io/dashboard/filter-and-group/filter-editor) - quickly find and organize your fields by filtering and grouping based on scope, type, status, naming and more. Use this feature to keep your data manageable
* [**Reference Manager**](https://help.accentuate.io/dashboard/reference-manager) - use this tool to connect your reusable content to multiple products, collections or variants all in one place. For example, link the “FAQ section” metaobject to as many products as you want.&#x20;
* [**Import**](https://help.accentuate.io/bulk-import-and-export/import-custom-field-values) & [**Export**](https://help.accentuate.io/bulk-import-and-export/export-custom-field-values) - bulk update or transfer your data using CSV files.

## Step 3: Display on your storefront (Display tab)

This is the final step, making your metafields or metaobjects visible on your store.

Head to the **Display** tab under **App features**. From here, you’ll choose how and where your content appears on the storefront.

Next, go to your **Online store** and pick a place where you want to showcase your Metafied or Metaobject.

There are three ways to display your data:

### **Liquid code**&#x20;

Use Shopify’s theme code to place your metafields exactly where you want them. Just copy the Liquid reference for your metafield and paste it into your theme file.

<figure><img src="/files/lex6t1q6aEsVkKwoRcc6" alt=""><figcaption></figcaption></figure>

### **Theme extensions**

Accentuate offers three built-in, code-free ways to display content:

1. [**Sticky promo bar**](https://help.accentuate.io/theme-extensions/sticky-promo-bar) - use this feature to display attention-grabbing **banners** across your storefront. Whether you're announcing a flash sale, limited-time offer or new product launch, the Sticky promo bar **stays visible** on your site as customers scroll, keeping important messages front and center.
2. [**SEO keywords**](https://help.accentuate.io/theme-extensions/seo-keywords) - add relevant, product-specific keywords to your product pages. These keywords aren’t just for search engines, they help *your customers* quickly understand what the product is about. This improves **product clarity**, helps guide purchase decisions and can reduce bounce rates by giving customers the info they need at a glance.
3. [**Products promotion**](https://help.accentuate.io/theme-extensions/products-promotion) - **highlight** related or complementary **products** on any product page using custom fields for upselling and cross-selling. This helps **increase average order value** by surfacing the right products at the right time - curated by you, not an algorithm.

In the video below, we walk you through how to set up and use each of these features step by step.

{% embed url="<https://www.youtube.com/watch?v=1P_XAWJMLcs>" %}

### **Customization services**

*Don’t want to handle the setup yourself?*&#x20;

Our team can do it for you. Just reach out through the chat beacon in the corner and we’ll take care of the implementation.


# Field scopes

Throughout our help articles, we use examples showcasing Metafields for the product scope, i.e. custom fields for products.\
\
This is done to maintain consistency between the different code snippets.\
\
Please know that every example, that uses the **product** scope can just as well use any of the other 8 scopes available:

* **variant** (product.variants)
* **collection**
* **page**
* **blog**
* **article**
* **order**
* **customer**
* **shop**

so this example use of a product Metafield:

```liquid
{{ product.metafields.accentuate.my_custom_field }}
```

could just as well be written as:

```liquid
{{ page.metafields.accentuate.my_custom_field }}
```

or:

```liquid
{{ collection.metafields.accentuate.my_custom_field }}
```

depending on which scope "my\_custom\_field" was created for using ACF and the context of its use within the theme.

### Global fields

Global fields in ACF work similarly to shop fields and the two can be used interchangeably. \
\
One crucial difference is that global fields can be referenced from field definitions belonging to other scopes such as products, collections, pages, etc. using a "Reference fields: Globals" type.\
\
This allows you to use global fields as puzzle pieces for building your field definitions for a specific scope, making it a breeze to maintain cross-site content of any type. \
\
You define and edit global fields as you would for any other scope in ACF. This allows you to store content globally available (within your shop, that is)&#x20;

{% hint style="info" %}
Custom fields for the global scope are saved as shop-level Metafields and have their namespace locked to **globals.** You cannot create global fields with another namespace and you cannot use the **globals** namespace for shop-level custom fields.&#x20;
{% endhint %}

### Aggregate scopes

ACF supports the creation of custom fields for Shopify-specific entities, that don't in themselves serve as scopes in Shopify and thus cannot be directly used as a target for metafields.\
\
These entities or "aggregate scopes" are:

* **product types**
* **vendors**
* **locations**

For each of these scopes, you can define custom fields as usual and edit the values for each "instance" ie. a particular product type, a specific vendor or a location, just as you would for a product or a collection in ACF. \
\
This allows you to store content where it makes the most sense, for example, vendor information at a higher level than your individual products, making it easier to maintain your field values.\
\
Custom fields for aggregate scopes are stored with the "shop" scope in Shopify and have their namespaces locked to a specific value depending on the scope:

* **types** is a reserved namespace for product type fields&#x20;
* **vendors** is a reserved namespace for vendor fields&#x20;
* **locations** is a reserved namespace for location fields&#x20;

You cannot create product type, vendor or location fields with other namespaces than the above and you cannot use these namespaces for other shop-level custom fields.

### Accessing Metafields for types, vendors, and locations

To access a custom field value for an individual product type, use this construct:

```liquid
shop.metafields.types.my_field_name['cars'] 
```

Similarly for vendors:

```liquid
shop.metafields.vendors.my_field_name['microsoft']
```

{% hint style="info" %}
**Note:** the value used as the last parameter for types and vendors must be a handleized value. These shop-level metafield constructs work in a similar way as Liquid's global objects "all\_products", "collections" etc.
{% endhint %}

Access to Metafields for locations follows the same general principle but uses Shopify's internal id numbers for its location objects. You don't have direct access to your shop's locations from Liquid, but you can copy a specific location's id from your shop's admin interface and use it to access the location's custom field:

```liquid
shop.metafields.locations.my_field_name[1234567890]  
```

### Examples

Showing the vendor's logo (stored in a Media v2 field) when viewing a specific product:&#x20;

```liquid
{% assign vendor_handle = product.vendor | handleize %}
{% assign logo = shop.metafields.vendors.logo[vendor_handle] | first %} 

<img src="{{ logo.src }}" alt="{{ logo.alt }}"/>
```

Showing a product's type's care instructions when viewing a specific product:

```liquid
{% assign product_type_handle = product.type | handleize %}

<p>{{ shop.metafields.types.care_instructions[product_type_handle] }}</p>
```


# How to show fields in your storefront

### Showing your custom fields

To actually show your custom fields' values on your storefront, you need to edit your Shopify theme. Your theme determines where and how various Shopify bits and pieces go on which pages. "Bits and pieces" also include your new custom fields a.k.a Metafields.\
\
There are several ways to edit a theme, but the most straightforward way is to use the built-in theme editor in your Shopify admin:

![](/files/UtNi0adh5aY8OFp8wSC7)

If you click on "Edit code" under the "Actions" button, you'll be taken to the theme editor.

{% hint style="info" %}
Editing a theme requires some proficiency with HTML/CSS as well as the [Liquid](https://shopify.dev/api/liquid) templating language. If you are not comfortable doing this and do not have a developer on hand, we can recommend getting in touch with an ACF Expert or a [Shopify Expert](https://experts.shopify.com/services/development-and-troubleshooting/add-custom-features-or-code). Either way will get you connected with skilled Shopify developers in no time.
{% endhint %}

As you know, you can choose from a wide range of themes from the Shopify Theme Store and also have a given theme customized to your specific needs. Or you can have a theme completely custom-built for your store.\
\
As a result, every theme structure is different and every one of our customers' field setups and needs are different. \
\
In this help center, we provide you with small general snippets of code as examples of how to use Shopify Metafields in different contexts and leave the actual implementation details (theme changes) up to you as the store owner and/or your developers. Please see Shopify's [Editing theme code](https://help.shopify.com/en/manual/using-themes/change-the-layout/theme-code) article on the subject.\
\
Too specific and detailed instructions for which theme files you should edit in your theme could potentially be misleading, but we'll give a simple example here anyway. Just note, that your theme's list of files and the contents of those will almost certainly be different from our examples but the overall principle is the same.

{% hint style="success" %}
Before making any changes, it is a good idea to [duplicate your theme](https://help.shopify.com/en/manual/using-themes/managing-themes/duplicating-themes) to create a backup copy. This makes it easy to discard your changes and start again if you need to
{% endhint %}

### Example

In this example, we have created a "Washing Instructions" HTML type field for products called *accentuate.washing\_instructions* (namespace-dot-name syntax) and we want to display it below the product description already present in the theme.

![](/files/FKF6EOp9MnkfpWz2BMcb)

Open your theme editor and it looks something like this:

![](/files/xZ0IkY7IMv8MUxhSprh7)

Click on the **product.liquid** file under **Templates**:

![](/files/hLW13PkKpKsesh3qV3RZ)

This file determines the overall structure of how a product is displayed on your storefront and we can see that it is comprised of a single section called **product-template**. So we find the **product-template.liquid** file under **Sections** and can now see a bunch of HTML code mixed with Liquid instructions:\
\
In this file, we need to find where the display of the product's description is handled. In our example, this is in lines 158-160:

![](/files/Nt9DvaolRtVBrSN4ngtX)

We don't change how the product description is displayed but need to add in our new field, but only where there actually is something to display.

Add the following code:

```liquid
{% if product.metafields.accentuate.washing_instructions %}
 <div>
   {{ product.metafields.accentuate.washing_instructions }}  
  </div>
{% endif %}
```

making the final code look like this:

![](/files/C3bs6DNj6ziL4jU8TxBF)

Save your changes and that's it! Your products now show washing instructions where these are available.


# Reference Manager

**Reference manager** is a tool that allows you to bulk apply references to your existing Metaobjects for selected items (products).  This feature is ideal for merchants who manage large catalogs and need to quickly update references without manually editing each item individually.

### What is the Reference Manager used for?

{% hint style="info" %}
A **Metaobject reference** acts as a bridge, linking your items to data stored in your shop’s Metaobjects
{% endhint %}

Imagine you run an online clothing store with separate size charts for men's, women's, and children's clothing. Before Reference Manager, adding the men's size chart to each product had to be done manually, one by one. Now, with Reference Manager, you can assign it to all relevant men's products in one go.

Simply select all the men's products and apply the men's size chart Metaobject to them in one action. In just a few clicks, every product displays the correct sizing information. It's designed to handle simple and complex references.

To access the feature, simply navigate to the sidebar within your Shopify admin, and click on **Reference Manager** under the **Accentuate** app section.

<figure><img src="https://cdn-std.droplr.net/files/acc_1266781/KjfMXy" alt=""><figcaption></figcaption></figure>

## Working with the Reference Manager

### Step 1: Select Items

In the left section, you can choose which items (products) you want to edit. You have two options:

1. **Manually Select Products**: Browse through your product list and select one or more products.
2. **Utilize Filter & Group**: Use Accentuate’s advanced filtering feature to select products based on specific criteria such as tags, collections, or attributes. This is especially useful for bulk actions.

<figure><img src="https://cdn-std.droplr.net/files/acc_1266781/4Cks0p" alt=""><figcaption></figcaption></figure>

### Step 2: Select Reference Metafield you want to edit values for

On the right section of the screen, under References, you'll find a dropdown list of reference Metafields for the selected scope. These include:

**• Metaobject References**

**• Mixed References**

{% hint style="info" %}
**Mixed references** allow you to reference Metaobjects from more than one definition
{% endhint %}

These references are taken directly from the Metafield definitions on your store.

<figure><img src="https://cdn-std.droplr.net/files/acc_1266781/YuTqLz" alt="" width="563"><figcaption></figcaption></figure>

If needed, you can create a **new Metaobject** or **mixed reference Metafield** directly from this page by clicking the "[**Create New Reference**](/dashboard/reference-manager/creating-a-new-reference-within-reference-manager)**"** button.

### Step 3: Select Metaobject Entries

After selecting the desired reference Metafield, the Reference Manager will display all available entries for the chosen Metaobject definition. You can:

• Select **one** or **multiple** entries, depending on whether the Metafield is configured to accept a list of values.

<figure><img src="https://cdn-std.droplr.net/files/acc_1266781/oqBZtp" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Each item can reference **up to 128 entries** for any given reference. This is a Shopify platform limitation, and attempting to exceed this limit will result in an error when saving your changes
{% endhint %}

Once you’ve selected your entries, press **Save** to apply these values to the selected products or all products within the chosen filter.

For large numbers of items and Metaobject entries, this operation might take some time. To ensure smooth processing, Accentuate sends this bulk operation to the **Activity Log**, where you can track the progress of the update in real time.

There’s no need to wait on the page for the process to complete - simply continue with other tasks while the system handles the bulk editing in the background.<br>


# Creating a new reference within Reference Manager

If you want to make a **new reference** within the Reference Manager, click on the “Create new reference” button in the upper-right corner.

<figure><img src="https://cdn-std.droplr.net/files/acc_1322003/d5wj2K" alt=""><figcaption></figcaption></figure>

This will lead you to a pop-up where you will be able to name your reference and select which type of reference you want it to be.

<figure><img src="https://cdn-std.droplr.net/files/acc_1322003/CRaNMA" alt=""><figcaption></figcaption></figure>

You can choose between **Metaobject reference** which would be selecting one Metaobject and **Mixed reference** which means that you want to select more than one Metaobject.&#x20;

<figure><img src="https://cdn-std.droplr.net/files/acc_1322003/EsWP9W" alt=""><figcaption></figcaption></figure>

When you select a type, you should be able to click on “Metaobject definitions” and select the one you want to be applied. When you are happy with your settings, go on and save.

<figure><img src="https://cdn-std.droplr.net/files/acc_1322003/6RV8Wn" alt=""><figcaption></figcaption></figure>


# Filter & Group


# Filter editor

### What is ACF Filter & Group?

Manipulating data can sometimes be an exhausting process. To make it easier, more intuitive and effective, we’ve created an optimal solution to get the data in almost no time - ACF Filter & Group. This functionality allows for swift querying within the data encompassed by the following scopes:

* Products
* Variants
* Collections
* Orders

### How to access Filter & Group?

Accessing Filter & Group is straightforward - simply click on the dropdown menu as shown below, and you'll find Filter & Group among the available options.

### How to utilize ACF Filter & Group?

Upon entering Filter & Group, you'll be greeted by the Filter list page. At the top, there's a banner providing information about Filter & Group and its capabilities.

<figure><img src="/files/JgLVYX403rKUwvDY291C" alt=""><figcaption></figcaption></figure>

To create a new query, simply click either the button with the label “**new**”, or the hyperlink down the filters list segment and you’ll be redirected to the Query Builder Page, which should look like this.

<figure><img src="/files/sPbebI9ubZiMVxywclwk" alt=""><figcaption></figcaption></figure>

Let’s break the page's functionality into pieces to make it easier to understand each segment. First of all, the top of the page contains action buttons: new (creates a completely new filter), duplicate (duplicates current filter), preview (shows a modal that includes all the affected items by the desired filter) and finally save, which saves the current filter.

Next up, it’s time to choose one of the available scopes from the dropdown menu (in this case, the chosen scope is products). We encourage you to give filters descriptive names in order to make it easier to use them later.

If you accidentally make a mistake that makes the query unavailable to run, Filter & Group will warn you about it in the status bar (in case everything seems okay, the All good label will appear).

The selector dropdown menu enables you to choose from 10 distinct selectors (with the total number varying based on the scope). Depending on the selected selector and the logical operators available, the value type is dynamically adjusted. Utilizing the plus button on the right side enables the addition of another statement to the current query.

Note that the individual filters order can be rearranged by simply dragging and dropping them in the desired place. Also, it’s possible to toggle the operator value (AND/OR) by clicking the ![](https://lh7-us.googleusercontent.com/8URchTHNq2LeSUEHgE8PpuNjFwuw24bRrCV5-2Z24KNYvLNfNmGzb1ud9OGKvKSN72YBcZ5yYulKEocFcyeZTiUU0QA6yqG8XxDO1BxdAYc52yoxkafEjh1EEzA1kgmi4SXKJ0oATTvkRLglj_FHh3k)icon. Add more menu options allows you to add AND/OR operators, as well as bracket symbols.

### Grouping the queries

In case you have to manipulate more than one segment of queries, there is an option to group filters. To achieve that, you have to select the desired filters and click the “**Group by**” button.

### Previewing affected items

When you're done editing your filter we recommend you preview the affected items to double-check your results before going on to save your filter. Some mistakes might have flown under your radar and this is a great way to catch them.

<figure><img src="/files/ZmBmIYOHfmUcpLXEaSpF" alt=""><figcaption></figcaption></figure>

<br>


# Filter usage

When you save the filter, it will be added to the filter list. From here, you can see all the necessary info about the filter itself, including the filter's name, scope and the number of affected items.&#x20;

<figure><img src="/files/l8LYqNwvIRkVpMCS0Fqv" alt=""><figcaption></figcaption></figure>

From here, you can see all the uses of filters:

* **Preview affected**: This allows you to see the affected items and open each one in Shopify's editor.
* **Open in Shopify**: This opens all your products that were selected by the filter in Shopify's search, enabling you to easily bulk edit them, export their product data, add tags, add them to a collection and much more.
* **Edit items**: This opens the selected items in the ACF bulk editor so you can easily edit their metafield data.
* **Export Items**: Exports affected items in a CSV format.
* **Edit filter**: Takes you back to the editor and enables you to change query parameters as desired.
* **Delete filter**: Completely removes the selected filter.

Ultimately, all exported data will be accessible in CSV format, ready for use according to your specific requirements.

You can also combine multiple filters of the same scope together into a single filter. By default, it will select all items affected by one OR the other filter, but that behavior can be easily tweaked in the filter editor.

<figure><img src="/files/bd5mh3YKTeX58BESYeYJ" alt=""><figcaption></figcaption></figure>


# Activity log

ACF features an activity log that keeps track of all of your imports and exports of your custom fields, and is available on both the dashboard and just below in the export/import buttons in the fields overview:

![](/files/jaKaIBfhuK9SoIDnorJK)

The activity list shows both completed and currently running exports and imports along with their current status. The page refreshes automatically every two minutes but you can also click the refresh icon in the top right corner of the list of manually refresh the list.

In case of any import errors you will also be able to view them from the activity log.

It is also possible to download any files you have previously exported or imported in ACF making it easy to manage your activities.

![](/files/FS80mMQ29PE1sslfuY51)

&#x20;


# App settings

You can manage various settings related to your ACF installation directly from the admin side menu:

<figure><img src="/files/y5tZ39omGkfiEOaX7iTK" alt=""><figcaption></figcaption></figure>

In the settings menu you will be able to:

* Change your subscription plan.
* Set up languages for multi-language fields and translations.
* Link multiple stores together for easy field definition synchronization.
* Change the split character for the automatic tagging feature.
* Change settings for HTML fields and dropdown menus in the editor
* Enable automatic handling of large sets of layouts


# Scope

Metafields aren’t **just** for products; they can be attached almost anywhere in your Shopify store.&#x20;

The part of your store where a Metafield lives is called a **scope**. Understanding scopes is key to using Accentuate Custom Fields (ACF) effectively, whether you're creating global data, organizing vendor-specific information or referencing Metafields across multiple areas of your store.

However, throughout our help articles, we use **examples** showcasing Metafields for the **product scope**, i.e., custom fields for products. This is done to maintain consistency between the different code snippets.

### Shopify’s default scopes

Please know that every example that uses the **product** scope can just as well use **any of the other 8 scopes available:**

* **Variant** (product.variants)
* **Collection**
* **Page**
* **Blog**
* **Article**
* **Order**
* **Customer**
* **Shop** (anything related to the store as a whole)

These scopes let you manage and present content in many parts of your store, supporting a diverse range of use cases. For example:

* **Products and variants:** burn time, materials, sizing
* **Collections:** banners or seasonal tips
* **Pages:** custom blocks or messages
* **Articles and blogs:** author bios, related links
* **Orders:** gift messages or delivery instructions
* **Customers:** loyalty tiers, preferences
* **Shop:** disclaimers or return policies

### Global fields

Global fields in ACF work similarly to shop fields and the two can be used interchangeably.&#x20;

The key difference lies in how you can use them: **global fields can be referenced** from field definitions in other scopes (like products, collections, or pages) using the “Global reference” field type, while **shop fields are used directly** without referencing.\
\
This allows you to use global fields as puzzle pieces for building your field definitions for a specific scope, making it a breeze to maintain cross-site content of any type. \
\
You define and edit global fields as you would for any other scope in ACF. This allows you to store content globally available (within your shop, that is).

{% hint style="info" %}
Custom fields for the global scope are saved as shop-level Metafields and have their namespace locked to **globals.** You cannot create global fields with another namespace and you cannot use the **globals** namespace for shop-level custom fields.&#x20;
{% endhint %}

### Extra scopes available via Accentuate (Aggregate scopes)

ACF goes *further* by supporting the creation of custom fields for Shopify-specific entities that aren’t officially available for Metafields but are incredibly useful.&#x20;

For each of these scopes, you can define custom fields as usual and edit the values for each just as you would for a product or a collection in ACF.\
\
These entities or "aggregate scopes" are:

* **Vendors** – useful for adding vendor-specific information, like logos or warranty policies
* **Locations** – ideal for warehouse data, working hours, contact data or logistics-related info
* **Product types** – helpful for naming or grouping items by custom categories or styles (e.g., tagging all men’s long-sleeve shirts as “LSM”)

They help you to store content **where it makes the most sense** to you because aggregate scopes allow you to define custom fields for higher-level grouping and content organization.

Custom fields for aggregate scopes are stored with the "shop" scope in Shopify and have their namespaces locked to a specific value depending on the scope:

* **types** is a reserved namespace for product type fields&#x20;
* **vendors** is a reserved namespace for vendor fields&#x20;
* **locations** is a reserved namespace for location fields&#x20;

You cannot create product type, vendor or location fields with other namespaces than the above and you cannot use these namespaces for other shop-level custom fields.

## Accessing Metafields in Liquid

Every scope has a different Liquid syntax. Let’s take a look at examples of Metafields in action:

### **Standard scopes**

```liquid
{{ product.metafields.accentuate.my_custom_field }}
```

{% hint style="info" %}
This is a **Liquid** code snippet used in Shopify themes to **retrieve and display a custom field (Metafield) value**.

Let’s break it down:

* **`product`**: refers to the scope of your Metafield
* **`metafields`**: This is the container where all custom data will be stored
* **`accentuate`**: This is the **namespace** used to group Metafields created by the Accentuate Custom Fields app. Think of it like a folder name
* **`my_custom_field`**: This is the **key** (label) of the specific Metafield you created, a unique identifier for the data you want to access (like `subtitle`, `feature_icon` or `care_instructions`)
  {% endhint %}

```liquid
{{ page.metafields.accentuate.my_custom_field }}
```

```liquid
{{ collection.metafields.accentuate.my_custom_field }}
```

### **Aggregate scopes**

To access a custom field value for an individual product type, use this construct:

```liquid
shop.metafields.types.my_field_name['cars'] 
```

Similarly for vendors:

```liquid
shop.metafields.vendors.my_field_name['microsoft']
```

{% hint style="info" %}
**Note:** the value used as the last parameter for types and vendors must be a handleized value. These shop-level Metafield constructs work in a similar way as Liquid's global objects "all\_products", "collections" etc.
{% endhint %}

Access to Metafields for locations follows the same general principle but uses Shopify's internal id numbers for its location objects. You don't have direct access to your shop's locations from Liquid, but you can copy a specific location's id from your shop's admin interface and use it to access the location's custom field:

```liquid
shop.metafields.locations.my_field_name[1234567890]  
```

### **Extra examples**

Showing the vendor's logo (stored in a Media v2 field) when viewing a specific product:&#x20;

```liquid
{% assign vendor_handle = product.vendor | handleize %}
{% assign logo = shop.metafields.vendors.logo[vendor_handle] | first %} 

<img src="{{ logo.src }}" alt="{{ logo.alt }}"/>
```

Showing a product's type's care instructions when viewing a specific product:

```liquid
{% assign product_type_handle = product.type | handleize %}

<p>{{ shop.metafields.types.care_instructions[product_type_handle] }}</p>
```


# Fields & Sections

## **Fields**

Fields are the essence of ACF. They are called "Metafields" and are stored as information tied directly to your own individual objects such as your products, collections, pages, etc.&#x20;

![](/files/TEhyMF6eh1EW4CzOO4nN)

You can use fields to store information, media, references, etc. that are relevant to help you better describe your objects in your storefront. Also, you can use it as an admin tool to store important backend information related to your exact business processes - the use cases can be whatever you want them to be essentially.

### Adding a new field definition

Before being able to add any values to a field, it first needs to be defined with a name, field type, and any relevant settings related to the chosen type.

1. Click on "Add field" from the top menu bar
2. Give your field a relevant label. The field's name will automatically be generated based on this, but you can also edit that if you want.

![](/files/PwkFG5SwXIGMk1IhAd1Y)

3\. On the next page you can choose the field's data type:

![](/files/eK7ZQyXMJKBsclep3Qan)

You can read more about the various field types [here](/metafield-definitions/deciding-on-a-field-type).

4\. On the last page you can select various settings related to your chosen field type.

![](/files/J58clrADuTVhloCqWlGa)

5\. Click on "Done" and then be sure to hit the "Save" button in the right sidebar.

Your field is then ready to use in the editor.

{% hint style="success" %}
If you are looking for inspiration for what you can do with your custom fields, try having a look at our various [field types](/metafield-definitions/deciding-on-a-field-type). If you have a certain feature in mind, and you are unsure how to set up your fields in order to achieve it, reach out to us. We would be happy to help you figure out the optimal solution for you.
{% endhint %}

## **Sections**

Sections are used for two purposes:

1. To visually and logically group fields in the editor and to control the section's fields when the section is defined as [repeatable](/the-editor/repeatable-fields)
2. To group fields for the purpose of creating a [custom layout](/the-editor/layouts) per individual object (e.g. a page or a product)

{% hint style="info" %}
Sections are not custom fields (Metafields) in their own right but rather control elements for the value and layout editor respectively. If you need to loop over the contained fields, please see [this article](/liquid-guides/access-field-definitions).
{% endhint %}

### Adding a new section

To add a new section you can click on the "Add section here" on a field definition to add a section below the field. If you do not have any fields for the scope, the "Add section" button will also be available in the top menu bar.

![](/files/Lg0w0ezLG2HAZoqlTyKH)

{% hint style="info" %}
You can prefix a section's title with a "-" (dash) if you need the section to appear visually as a "sub-section" of another section in the editor
{% endhint %}


# Create a Metafield definition

### **Fields**

Fields are the essence of ACF. They are called "Metafields" and are stored as information tied directly to your own individual objects such as your products, collections, pages, etc.&#x20;

![](/files/TEhyMF6eh1EW4CzOO4nN)

You can use fields to store information, media, references, etc. that are relevant to help you better describe your objects in your storefront. Also, you can use it as an admin tool to store important backend information related to your exact business processes - the use cases can be whatever you want them to be essentially.

### Anatomy of a Metafield

The image below illustrates the full anatomy of a Metafield. While this may look complex at first glance but don’t worry! We’ll walk through each element in detail over the next few articles to ensure you fully understand how Metafields work and how to use them effectively.

<figure><img src="/files/HE0ItKxgpS3DD6Mw3IRm" alt=""><figcaption></figcaption></figure>

### How do I create a custom field in ACF?

This is the first and most important step before anything can appear on your storefront. By setting up a definition, you're giving Accentuate the instructions it needs to handle your data.

In this step, you define **what type of data** you want to store and **how it will be organized**. Think of this step as getting an empty box, labeling it and deciding what will go inside. At this stage, you are not adding any content yet.

This box is called a Metafield definition.&#x20;

Before you read this article, make sure that you’ve read our article [**Scope**](https://help.accentuate.io/metafield-definitions/scope) and that you know where you want to apply your Metafield.&#x20;

For this example, we will be using the **Product scope.**&#x20;

***

**By this point, you should have already:**

* [x] Navigated to the **Templates** tab in the **App features** section
* [x] Selected your desired **scope**
* [x] Clicked **Add new field**

***

In the next few articles, we’ll guide you through each step of the field creation process. You’ll learn about setting the label and name, namespace, configuring where the field applies and selecting the appropriate field data type.

{% content-ref url="/pages/zFdawzI5qURUrUqoMAUf" %}
[Label & Namespace](/metafield-definitions/create-a-metafield-definition/label-and-namespace)
{% endcontent-ref %}

{% content-ref url="/pages/Knoz3GJsDjvp6BX4Af3B" %}
[Field contexts (Field applies to)](/metafield-definitions/create-a-metafield-definition/field-contexts-field-applies-to)
{% endcontent-ref %}

{% content-ref url="/pages/1NFHEJrWZzHSciX70mlK" %}
[Field data type](/metafield-definitions/create-a-metafield-definition/field-data-type)
{% endcontent-ref %}


# Label & Namespace

### What is a label in Metafields?

**Label** - internal identifier you’ll see inside the app to help you stay organized.&#x20;

**Name / Key** - automatically generated based on the label, but you can also edit it if you want.

<figure><img src="/files/28yLw9s7vZK3MbiQVxy9" alt=""><figcaption></figcaption></figure>

### What is a namespace?

In Shopify Metafields, a **namespace** works together with a **key** to define and organize custom fields. Think of it as a way to group and separate your fields so they don’t clash with fields from other apps.

By default, Accentuate uses the **accentuate** namespace to keep your Metafields organized and separate. That’s why setting a namespace is optional, unless you have a specific reason to customize it, **Accentuate takes care of it for you.** However, you can override this and set your own namespace for any individual field if needed.

<figure><img src="/files/Q4rVI1DgRGIdGLMDXhUS" alt=""><figcaption></figcaption></figure>

It is also a great way to (technically) group sets of fields that naturally belong together. For instance:

* Use `image.title` and `image.rating` for image-related fields
* Use `video.title` and `video.rating` to group video-related fields

If you need to use ACF to manage Metafields created from other apps, you can match the namespace and key for the fields when defining the field type and ACF will automatically use any existing values going forward. Just take care to define a field type that makes sense with regard to any existing data.

{% hint style="info" %}
Some namespaces are reserved for internal ACF use and cannot be used for field definitions. The field definition dialog will not allow you to define fields using the namespaces *acf\_settings, product\_types, vendors, locations* or *globals*
{% endhint %}


# Field contexts (Field applies to)

## How to apply fields to specific objects in a scope

When you define custom fields for a specific scope (such as **products**), those fields don’t always need to apply to every object (product) within that scope (products). For example, custom fields relevant to **shoes** might not make sense for **furniture**.

To solve this, Accentuate Custom Fields provides a **Field applies to** setting that allows you to control which objects (specific products) a section or field should appear for in the editor (the place you add actual values to your Metafields).

<figure><img src="/files/DO6fJ4MIW687IN7diSrj" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The selection values in the dropdown depend on the scope you are defining fields for
{% endhint %}

## How the “Field applies to” Setting Works

### Sections and Fields

You can apply the filter at two levels:

* **Section level** – all fields within the section will inherit the section’s filter.
* **Individual field level** – each field can have its own filter if no section-level filter is applied.

Both sections and individual fields can have applies-to settings. If a section has an applies-to setting, this setting will be inherited by all the section's fields. Otherwise, each individual field can have an applies-to setting on its own.

### Contextual dropdown options

The values available in the **Field applies to** dropdown will depend on the scope you're working with. For the product scope, you’ll typically be able to filter by **product types**.

You can add product types on your **Product page** by entering the **type** in **Product organization**.

<figure><img src="/files/rEQF1mEhfB6oiLyw1Tt1" alt=""><figcaption></figcaption></figure>

If the expected filter options don’t appear in the **Field applies to** dropdown, simply click the **Refresh** button to reload the available values.

<figure><img src="/files/Qa66CYWjVsFTDaph11Ul" alt=""><figcaption></figcaption></figure>

## How to filter with Field applies to

You can select multiple values to filter the section or fields by. If an object fits at least one of the **Field applies to** conditions, it will be shown.

<figure><img src="/files/eTG9oI2GOxcF22DKoN3L" alt=""><figcaption></figcaption></figure>

Therefore, when you select the "Earrings" field context, you'll see only the sections and fields that are specifically configured to apply to that context.<br>


# Field data type

When defining a custom field, selecting the correct **field data type** is essential because it determines **what kind of data** you want to store.&#x20;

ACF supports a wide variety of field types, including: simple **text** fields, **images**, **URLs**, **HTML**, **rich text**, **file uploads**, **number** inputs, **dropdowns**, **references** and more. Each serves a specific purpose depending on the kind of data you need to capture.

For example:

* Want to upload a product demo video? Use a **Media v2** field.
* Need a short description? Use a **Single-line text** field.
* Referencing another object like a global FAQ? Use a **Reference** field.

{% hint style="info" %}
When adding a new field, ACF may restrict its field type to a specific selection. If you have a Shopify Metafield definition in place for the chosen name and namespace combination, this definition will determine your field's type for you, so the Shopify and ACF field definitions are aligned (as they should be).
{% endhint %}

To help you visualize your options, here’s a preview of the field type selector in ACF:

<figure><img src="/files/bxsyswZggcCiADnfejZn" alt=""><figcaption></figcaption></figure>

You can explore all available field types in more detail in our dedicated articles:

{% content-ref url="/pages/fnv9GsX63A9b8Y8LLzzw" %}
[Shopify Field types](/metafield-definitions/create-a-metafield-definition/field-data-type/shopify-field-types)
{% endcontent-ref %}

{% content-ref url="/pages/tsNcBk94gelc39Kz38O2" %}
[ACF Field types](/metafield-definitions/create-a-metafield-definition/field-data-type/acf-field-types)
{% endcontent-ref %}

Having a clear understanding of these types will help you avoid having to restructure data later.

### Shopify Native Fields vs. Accentuate Fields: What’s the difference?

In ecommerce, data is power but **only if it’s structured the right way.**

Whether you’re adding extra product details, building content templates or creating custom workflows, the fields you use will determine how easily (or how painfully) you can manage your data over time.

When working with **Accentuate Custom Fields**, you’ll often come across two types of fields:

* **Shopify native fields**
* **Accentuate fields**

Both play important roles, but they’re **not the same.**

Let’s break down what each does, why the difference matters and how to decide which one fits your needs.

### The evolution of Metafields

In the early days of Shopify Metafields, things were a bit different. Using unstructured metafields was the norm. With these types of Metafields, merchants could store any data they wanted but there were no guardrails.

For instance, if you wanted to showcase burn times for candles, you needed to manually enter data, no matter their format (text, number, etc). This could lead to inconsistencies, as someone may enter “40hrs”, another “about 40 hours” or “40h”.

All of these mean the same thing to a human, but to Shopify, they were **completely different inputs.** This sometimes led to errors, differences or display issues. It was flexible, sure. On the other hand, sometimes brought challenges.

By building on top of unstructured Metafields, Accentuate introduced **predefined ACF field types** long before Shopify provided official definitions. That is why all **Accentuate fields** **remain unstructured by design.** While these custom definitions served merchants well in the past, most of them are now considered outdated.&#x20;

Now, the new standard is structured Metafields. Shopify lets you create **Metafield definitions to help standardize custom data.** Think of these as **templates that enforce rules:**

* **Type of content** (text, number, file, reference, etc.)
* **Namespace and key** (how Shopify organizes custom data)
* **Validation rules** (what’s allowed and what isn’t)

Using the same example, if you create a Metafield for **burn time**, Shopify can restrict the input to **numbers only.** No more "about 40 hours." Just **40**.

With native Metafields, Shopify prompts users for the correct type of input, ensuring consistency across all your entries. You’re no longer relying on memory or internal documentation to get it right. Shopify handles the structure for you.

This shift from **unstructured to structured** data helped merchants stay consistent, avoid errors, and made fields easier to use across products, collections, orders and more.&#x20;

### Which should you use?

At Accentuate, we don’t believe in one-size-fits-all solutions. Both **structured** and **unstructured** fields serve important purposes.

Accentuate supports all of Shopify’s native fields and still utilises Accentuate fields since they give you **more control** over your custom data.

Both approaches have **benefits** and **limitations**, it’s all about what fits your store’s needs. Here’s a good rule of thumb:

* **Use Accentuate fields** when you need advanced field types such as **HTML** or **Media v2**, or when you’re managing complex content structures that go beyond Shopify’s native capabilities.

We generally recommend using Shopify's native Metafield definitions when creating new Metafields, as they offer better consistency, validation and integration within Shopify.&#x20;

{% hint style="info" %}
In Accentuate, definitions marked with **Shopify >>** are native and recommended for new fields.
{% endhint %}

If you’re ever unsure about how to set things up, **reach out to our team.** We’re happy to help you make the right decision from the start.

### Multiple selections or repeatable?

While the two settings can from time to time achieve the same result, it is also relevant to consider when it is right to use one over the other.

Enabling multiple selections for a field is recommended if you need multiple values for just one field. If you have a group of fields that you need multiple values for, making the overall section of the fields repeatable would be the recommended way to go.

In general, we recommend not enabling any settings you won't need. It is much better to keep it simple and build your setup bit by bit once the needs present themselves.


# Shopify Field types

### Shopify Metafield definitions

Via your Shopify admin Settings » Custom data, you can optionally create a Metafield definition for a certain namespace + key combination. With a definition in place, the field can be referenced from within Shopify's Theme Customizer as a Dynamic data source and also be "pinned", making it easier to edit the Metafield values in context from your Shopify admin detail page.&#x20;

{% hint style="success" %}
**Do** make sure that any Shopify Metafield definitions and the corresponding ACF field definitions use the same data type. If they do not match, Shopify will **block** ACF from doing updates to the underlying Metafields.

\
Also, Shopify Metafield definitions need to be in place for any *Shopify » Metaobject reference* or *Shopify » Mixed reference* fields you define. These definitions are responsible for selecting the type of Metaobject(s) that ACF will show the entries for when working in the editor
{% endhint %}

{% hint style="danger" %}
**Do not** create Shopify Metafield definitions for any fields in ACF that are not defined as Shopify » ... types (Text, HTML, etc). This will cause Shopify to **block** ACF from doing updates to the underlying Metafields
{% endhint %}

ACF will automatically check if a field's data type matches the Shopify Metafield definition (for the namespace + key combination) and show either a green checkmark or a warning icon in the list of defined fields for a scope.

If you have defined a field where no Shopify Metafield definition exists, ACF will just show a grey checkmark to indicate that the field type is valid.

### Metafields without definitions

Via your Shopify admin detail page, you can edit metafields regardless of whether a definition is in place or not (section Metafields » View all). For Metafields without a definition, Shopify will make an educated guess of each Metafield's content type.

{% hint style="warning" %}
Please be careful when editing non-Shopify types this way, since ACF's data validation rules are not in effect here
{% endhint %}

### Using Shopify Metafields from Liquid

Metafield values created using a "Shopify » ..." type do not return the value using the normal syntax in Liquid. Rather, these types return a [Metafield object](https://shopify.dev/api/liquid/objects/metafield) with two properties: *type* and *value*.\
\
The *value* property returns the actual value, like this:

```
<h3>{{ product.metafields.accentuate.subtitle.value }}</h3>
```

### Repeatability

{% hint style="warning" %}
While Shopify » ... (List) types are repeatable by definition, they cannot be part of a repeatable section. This is a restriction in ACF, which will be addressed in an upcoming version.
{% endhint %}

### Transferability

{% hint style="warning" %}
Shopify **reference field** values cannot successfully be transferred to other stores due to the use of internal Shopify ids, which will vary across stores. **File reference** fields are an exception here if the same file names exist in the target store.
{% endhint %}


# Shopify » Single line text

A Shopify Single line text works similar to the ACF type Text.\
\
There is no functional difference, but the Liquid code has a new syntax. Being a Shopify data type, that returns a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value:

```liquid
<h3>{{ product.metafields.accentuate.subtitle.value }}</h3>
```


# Shopify » Multi-line text

A Shopify Multi-line text works similar to the ACF type Text (with its "Lines" setting set to more than 1 line).\
\
There is no functional difference, but the Liquid code has a new syntax. Being a Shopify data type, that returns a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value:

```liquid
<h3>{{ product.metafields.accentuate.subtitle.value }}</h3>
```

{% hint style="info" %}
A Shopify Multi-line text cannot store more than 65,535 characters (this includes any HTML tags)
{% endhint %}

### Storing HTML in a Multi line text field

Since the Shopify field types don't yet offer a 'html' option, we have made it possible to treat the Multi line text field as HTML:liquid

![](/files/XV5rtrBDQYd7OZcSZiF0)

With this setting enabled, you get the same editing functionality from ACF as for our [native HTML field type.](/metafield-definitions/create-a-metafield-definition/field-data-type/acf-field-types/html)


# Shopify » Boolean

A Shopify Boolean works similar to the ACF type Checkbox\
\
There is no functional difference, but the Liquid code has a new syntax. Being a Shopify data type, that returns a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value:

```liquid
{% if product.metafields.accentuate.display_vendor.value %}
<p>{{ product.vendor }}</p>
{% endif %}
```


# Shopify » Color

A Shopify Color works similar to the ACF type Color and gives you a convenient control to select a color and store the result as a string in hex RGB format such as #000000, #e9e9e9, #ffffff etc. \
\
Example use:

```html
<button style="background-color: {{ product.metafields.accentuate.background_color.value }}">Click</button>
```

Also, you can use [Liquid Color filters](https://shopify.dev/api/liquid/filters/color-filters) to perform operations on the color such as converting to HSL, lighten or darken the color etc.

{% hint style="info" %}
**Note:** while the *value* property used as shown above returns a string in hex RGB format, the Shopify Color type actually returns [a Color object](https://shopify.dev/api/liquid/objects/color) with access to the selected color's underlying properties such as the *red*, *blue* and *green* components.
{% endhint %}


# Shopify » Custom objects (JSON)

A Shopify JSON field works similarly to the ACF JSON type, albeit without restrictions regarding outermost arrays.\
\
The type allows you to enter field values as raw JSON. As long as you adhere to valid JSON syntax, you are free to define anything you like in your very own structure.\
\
Being a Shopify data type returning a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value in Liquid.\
\
So, if you have a JSON field with this content:

```json
{
  "make": "Audi",
  "model": "RS6" 
}
```

You can use it directly in Liquid:

```liquid
{% assign car = product.metafields.accentuate.specs.value %}

<p>My car is the brand new {{ car.make }} {{ car.model }}</p>
```

If you need the custom field as a client-side JavaScript variable, you can do this:

```javascript
<script>
  let car = {{ product.metafields.accentuate.specs.value }}
  alert('My car is the brand new ' + car.make + ' ' + car.model);
</script>
```


# Shopify » URL

A Shopify Url field type basically behaves just like a Text (or Shopify Single line text) field, allowing you to enter a URL.\
\
Defining the field as a URL type ensures that the content is a fully qualified URL complete with a protocol scheme (https\://, http\:// etc.):

```liquid
<a href="{{ product.metafields.accentuate.instructions.value }}">Click to view instructions</a>
```


# Shopify » Date

A Shopify Date works similar to the ACF type Date but always stores the date in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format (YYYY-MM-DD) without a presumed timezone.\
\
A field of type Shopify » Date can be subject to date filters in Liquid:

```liquid
{{ product.metafields.accentuate.published_date.value | date: "%a, %b %d, %y" }}
```

Please see [Understanding Date Formats in Liquid and Shopify](https://www.shopify.com/partners/blog/liquid-date-format)


# Shopify » Date and Time

A Shopify Date and Time field always stores the date and time in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format without a presumed timezone (YYYY-MM-DDThh:mm:ss+00:00) \
\
Note that ACF doesn't allow for selection of seconds in the time part of the field - this will always be '00'.\
\
A field of type Shopify » Date and Time can be subject to date filters in Liquid:

```liquid
{{ product.metafields.accentuate.published_date_time.value | date: format: 'long' }}
```

Please see [Understanding Date Formats in Liquid and Shopify](https://www.shopify.com/partners/blog/liquid-date-format)


# Shopify » Integer

A Shopify Integer works similar to the Decimal type, but only allows for input of a number without decimals.\
\
The *value* property returns a numeric value directly, allowing you to do numeric comparisons directly:

```liquid
{% assign rrp = product.metafields.accentuate.rrp_price.value %}
{% if rrp > 100 %}
    <p>RRP is {{ rrp }}</p>
{% endif %}
```


# Shopify » Decimal

A Shopify Decimal works similar to the ACF type Number, allowing for input of a number with decimals.\
\
The *value* property returns a numeric value directly, allowing you to do numeric comparisons directly:

```liquid
{% assign rrp = product.metafields.accentuate.rrp_price.value %}
{% if rrp > 100 %}
    <p>RRP is {{ rrp }}</p>
{% endif %}
```


# Shopify » Weight

A Shopify Weight type allows you to select a unit and a decimal value to go with that unit.\
\
Weight units can be any of **oz**, **lb**, **g** or **kg**.\
\
The entered weight is then available as a JSON structure with *unit* and *value* properties, for example:

```liquid
{% assign weight = product.metafields.accentuate.weight.value %}
<p>The weight is {{ weight.value }}{{ weight.unit }}</p>
```

Referencing *.value* alone will render the output as "*value*\<space>*unit*", so this works as well:

```liquid
<p>The weight is {{ product.metafields.accentuate.weight.value }}</p>
```


# Shopify » Volume

A Shopify Volume type allows you to select a unit and a decimal value to go with that unit.\
\
Volume units can be any of **ml**, **cl**, **l**, **m3** (cubic meters), **us\_fl\_oz**, **us\_pt**, **us\_qt**, **us\_gal**, **imp\_fl\_oz**, **imp\_pt**, **imp\_qt** or **imp\_gal**.\
\
The entered volume is then available as a JSON structure with *unit* and *value* properties, for example:

```liquid
{% assign volume = product.metafields.accentuate.volume.value %}
<p>The volume is {{ volume.value }}{{ volume.unit }}</p>
```

Referencing *.value* alone will render the output as "*value*\<space>*unit*", so this works as well:

```liquid
<p>The volume is {{ product.metafields.accentuate.volume.value }}</p>
```


# Shopify » Dimensions

A Shopify Dimension type allows you to select a unit and a decimal value to go with that unit.\
\
Dimension units can be any of **in**, **ft**, **yd**, **mm**, **cm** or **m**.\
\
The entered dimension is then available as a JSON structure with *unit* and *value* properties, for example:

```liquid
{% assign dimension = product.metafields.accentuate.dimension.value %}
<p>The dimension is {{ dimension.value }}{{ dimension.unit }}</p>
```

Referencing *.value* alone will render the output as "*value*\<space>*unit*", so this works as well:

```liquid
<p>The dimension is {{ product.metafields.accentuate.dimension.value }}</p>
```


# Shopify » Reference fields

A Shopify Reference field works similarly to the ACF reference type.\
\
From an editor's perspective, there is no functional difference, but the Liquid code now returns the referenced object directly without the need to do a lookup via a global object using a handle.\
\
So for example a Product reference returns the referenced product directly:

```liquid
{% assign ref_product = product.metafields.accentuate.ref_product.value %}
<p>The referenced product is {{ ref_product.title }}</p>
```

If you are referencing a file or an image from your Files list in Shopify, you can get the associated URL using the [Liquid filters *file\_url* and *file\_img\_url*:](https://shopify.dev/api/liquid/filters/url-filters#file_url)

```liquid
{% assign url = product.metafields.accentuate.ref_file.value | file_url %}
<p>The referenced file is {{ url }}</p>
```

{% hint style="warning" %}
Shopify reference field values cannot successfully be transferred to other stores due to the use of internal Shopify ids, which will vary across stores
{% endhint %}

{% hint style="success" %}
However, using ACF, you can choose to export Shopify Product references and Shopify Collection references using their respective handles, which you can then import into another store assuming the handles match across your stores
{% endhint %}


# ACF Field types


# Text

The value of custom fields of type Text is represented as you may expect - as Metafields with string values matching the value of their respective custom fields

```liquid
<h3>{{ product.metafields.accentuate.subtitle }}</h3>
```

If you need to display multi-line texts on your storefront, you can take advantage of the *newline\_to\_br* filter, so line breaks will be formatted correctly:

```liquid
<h3>{{ product.metafields.accentuate.subtitle | newline_to_br }}</h3>
```


# Markdown text

In a Markdown type field, you can enter text in [Markdown syntax](https://www.markdownguide.org/basic-syntax/) and ACF will automatically render it as HTML in a separate property in the Metafield.\
\
A Markdown field contains two properties:

> markdown&#x20;

Your markdown as entered in the editor

> html

The HTML derived from your Markdown, ready to show in the browser:

```html
<h3>{{ product.metafields.accentuate.markdown_title.html }}</h3>
```


# HTML

Editing HTML in custom fields is done via an advanced editor - the Froala WYSIWYG editor.\
\
Via the individual HTML fields' setup or the settings dialog (available from the admin side menu), you can choose to have either the full toolbar or a simplified version.\
\
The Settings dialog also allows you to turn on "paste as plain text" so that pasting HTML from other sources (such as Word) won't carry over any formatting but will keep the structure.

![](/files/1F5Lt5dNf5j2N84UnH5U)

### Preserving the HTML look on your storefront

Depending on the options used for aligning blocks of text, embedding videos, styling images, and tables, etc., the HTML itself may contain references to CSS classes defined by Froala.\
\
To preserve the look of the edited HTML outside of the editor (ie on your storefront) you **may have** to include the following CSS file in your theme.liquid file:

```html
<link href="https://app.accentuate.io/assets/css/froala@3.1.0/froala_style.css" rel="stylesheet" type="text/css" />
```

Note the version number 3.1.0 in the URL. This can change over time, so if anything looks out of place, check your used version number vs the above.\
\
Also, make sure that you place the edited content inside an element that has the class *fr-view*:

```html
<!-- Here comes the HTML edited with the Froala rich text editor --> 
<div class="fr-view">
   {{ product.metafields.accentuate.my_html_description }} 
</div>
```


# Checkbox

A checkbox can hold two states - checked or unchecked. \
\
The Metafield value of a checked checkbox (!) is represented as a string value of "true" but an unchecked checkbox will cause the underlying Metafield to be deleted rather than contain a value of "false". \
\
Accordingly, we can test for it being checked or not this way:

```liquid
{% if product.metafields.accentuate.washable %}
  <p>{{ product.title }} can be washed</p>
{% else %}
  <p>{{ product.title }} can NOT be washed</p> 
{% endif %}
```


# Selection

A field of type Selection gives you either a dropdown-style or a table-style way of selecting one or more predefined values.

{% hint style="info" %}
You can mark values to be suggested when editing a product, a page, etc. that doesn’t have a value for that field already. If you would like a default value of "Blue" to be suggested by default in a selection of "Red, Green, Blue", just prefix the option with a colon: ":Blue" in the field definition
{% endhint %}

{% hint style="info" %}
You can opt to have selections use another value than the one presented in the ACF editor by separating the value and the presentation string with double colons - "value::string".&#x20;

To have e.g. a color code stored for a selection of a named color, enter "#0000ff::Blue". This will show the option as "Blue" in the ACF editor dropdown but actually store the value "#0000ff" in the Metafield
{% endhint %}

The selection is represented as a Metafield with its string value matching the selected value:

```html
<p>You have selected the value: {{ product.metafields.accentuate.selection }}</p>
```

Or, in case of multiple selected values, with each value listed using the "pipe" symbol ("|") as a separator token. \
\
You can use Liquid's 'split' filter on the Metafield to separate the values - like this:

```liquid
{% assign selected_values = product.metafields.accentuate.selection | split: '|' %}

{% for selected_value in selected_values %} 
  <p>{{ selected_value }}</p> 
{% endfor %}
```


# Tags

Tags behave similarly to Selection types (see separate article) with the only difference being that you define the values for every instance of your Shopify object as opposed to the selection lists' predefined options.

A tag field, where you have entered only a single value, is represented as a Metafield with its string value matching your input, and as with selections, if you have entered multiple values, each value is listed with the "pipe" symbol ("|") as a separator token.


# Number

All ACF custom fields are stored as strings - even numeric types like Number to allow for decimal points. \
\
Liquid handles this quite nicely with one exception: you cannot do a direct comparison between a number and a string\
\
So while this is possible:

```html
<p>We have {{ product.metafields.accentuate.stock | plus: 100 }} in stock</p>
```

You need to convert it to a number if you want to do a numeric comparison with the field's value beforehand, like this:

```liquid
{% assign in_stock = product.metafields.accentuate.stock | plus: 0 %} 

{% if in_stock < 5 %}
  <p>Product is low on stock</p>
{% endif %}
```

{% hint style="info" %}
the " | plus: 0 " converts the string into a number type in Liquid
{% endhint %}


# Date

A custom field of type Date can be subject to date filters in Liquid:

```liquid
{{ product.metafields.accentuate.published_date | date: "%a, %b %d, %y" }}
```

To ensure that Liquid's date filters work as expected, consider using a universal, numbered format like 2019-09-14 for your custom field values.\
\
More info on that subject can be found in this article:

{% embed url="<https://www.shopify.com/partners/blog/liquid-date-format>" %}


# Color

A Color type gives you a convenient control to select a color and store the result as a string in hex RGB format such as #000000, #e9e9e9, #ffffff etc. \
\
Example use:

```html
<button style="background-color: {{ product.metafields.accentuate.background_color }}">Click</button>
```

Note that you can use Liquid color filters to change or extract properties from these color strings:

{% embed url="<https://shopify.dev/docs/themes/liquid/reference/filters/color-filters>" %}


# Media v1 (legacy)

When defining fields of the 'Media (legacy)' type, you are able to upload files of different media types. Each field is defined together with a set of allowed file extensions, so you can control the type of file uploaded via the editor.\
\
Uploaded media are automatically uploaded to a secure Google Cloud Platform bucket and the corresponding URL pointing to the file is stored in the Metafield, ready to use:

```html
<img src="{{ product.metafields.accentuate.extra_image }}"/>
```

The URL in the Metafield will have the form:

```html
https://cdn.accentuate.io/12345678/12345678/filename-v12345678.ext
```

Where '12345678/12345678' is a set of internal Shopify IDs designating which Shopify resources it belongs to and 'v12345678' is a random version number assigned by ACF to the uploaded filename to keep it unique and ensure any new files will reach your visitors' browser.\
\
Where possible, the uploaded media's **original** dimensions in "width x height" format are appended as a query string to the URL stored in the Metafield. \
\
If you need to extract the dimensions in Liquid for layout purposes, you can split the URL by the '?' sign and the 'x' separating the dimensions. Example URL:

```
https://cdn.accentuate.io/12345678/12345678/filename-v12345678.ext?100x300
```

{% hint style="info" %}
ACF currently has a limit of \~50MB per media upload. You will typically only reach this limit when uploading video files. Take care not to force your visitors to download assets of this size but consider using a streaming service for large video files (like YouTube)
{% endhint %}

Media uploads are served directly via world-class software services with very low network latency. ACF also employs performance optimization techniques similar to Shopify when fetching images via [cdn.accentuate.io](https://cdn.accentuate.io), including transforming images to WEBP format for supporting browsers (WEBP is only served if the resulting image is in fact smaller than the original image after optimisation)

While the performance of our media delivery has been optimized on a general level, you should still consider [further optimizations](https://blog.cloudflare.com/optimizing-images/).


# Media v2

Media v2 fields offer the upload of multiple media in a single field, which can be arranged in order and more easily managed in the editor. Each media also offers properties for easy access to structured information about media type, image dimensions, aspect ratio, ALT text, etc.

{% hint style="success" %}
This is the recommended way to create fields for uploading images, videos or other types of media.
{% endhint %}

![](/files/HwHd0OGXgZdL63rlcIdw)

Media v2 fields support a variety of file types such as:

* JPG/JPEG, PNG, ICO, TIF, WEBP, GIF and SVG images
* PDF, CSV, TXT, ZIP and JSON files
* AI, PS and EPS (Postscript) files
* MP3, MP4, WEBM and MOV (Quicktime) files
* GLB files (3D images used in Shopify)
* Font files (WOFF, WOFF2, TTF and OTF)

When defining fields, you determine the set of allowed filetypes to be uploaded via the editor.

{% hint style="success" %}
If you need a media type not currently available, get in touch and we'll add it for you.
{% endhint %}

Uploaded media are automatically stored in our highly secure cloud bucket (with full redundancy and daily backup). The corresponding link to the file is stored in the Metafield, ready to use in Liquid.\
\
Part of the field definition is whether or not the field supports the upload of multiple media to the same field. If multiple media are allowed, you can upload more than one media in the same field.

### Media properties

The media information is stored as JSON objects with the following properties:

> id

*For internal ACF use only.* This uniquely identifies the individual media.

> scope

*For internal ACF use only*. This is the scope for which the media is uploaded (e.g. a product id when uploaded for a product)

> key

*For internal ACF use only*. This is the uploaded media's filename appended to a combination of the scope and the media's id (e.g. which field in which product;

> src

The URL points to the uploaded media.\
\
Use this as the value for referring to the media source over HTTPS e.g. in the "src" attribute in image tags etc. You can optionally append transformation options to this URL for resizing and cropping - please see [Resize & crop images](/liquid-guides/resize-and-crop-images)

> original\_src

This is basically the same as src, but the domain is here **original.accentuate.io** rather than **cdn.accentuate.io**, which provides access to your original (and unoptimized, see below) media. This should normally not be used for other purposes than redownloading the original media, since performance will not be as good as its src counterpart.

> cloudinary\_src

A special URL for ease of use of our previous integration with Cloudinary for resizing, cropping, etc. of images. This property will continue to be available and in working condition but we do offer new resizing options - see the .src property above.

> filename

The name of the media, when it was uploaded to ACF (including the extension, but excluding any folders)

> handle

The media's handle is a string version of the media's id. This is used when doing lookups using a Media Reference field

> mime\_type

The mime type of the uploaded media, identifying exactly which type of media is contained in the file. Example: "image/jpg", "video/mp4" etc.

> media\_type

Contains the general type of the media such as "image", "video", "audio", "pdf" etc.

> media\_inline

Contains the actual file content of an uploaded SVG file, if the option to store it inline was enabled at the time of upload.

> alt

For media of media\_type "image", an ALT text can be provided in the ACF editor and is made available via this property.

> width

The width of the image in pixels.&#x20;

> height

The height of the image in pixels.

> aspect\_ratio

The aspect ratio ( width / height ) of the image, which tells the orientation of the image:

* less than 1.0 is a **portrait** image
* exactly 1.0 is a **square** image
* greater than 1.0 is a **landscape** image

### Examples&#x20;

{% hint style="info" %}
The underlying Metafield value will always be an **iterable array**. If just a single media is uploaded, the array will only have one entry. This allows for consistent use of [Liquid's array filters](https://shopify.dev/docs/liquid/reference/filters/array-filters) such as first, last, sort, where, etc no matter how many media are uploaded.&#x20;
{% endhint %}

{% hint style="info" %}
If you define a Media v2 field as repeatable, you will essentially get an array of arrays in the underlying Metafield value
{% endhint %}

*Basic list of all uploaded images:*

```liquid
{% for image in product.metafields.accentuate.multi_images %}
  <img src="{{ image.src }}" alt="{{ image.alt }}"/>
{% endfor %}
```

*Basic list of all uploaded images in a **repeatable** media v2 field:*

```liquid
{% for multi_images in product.metafields.accentuate.repeatable_multi_images %} 
  {% for image in multi_images %} 
    <img src="{{ image.src }}" alt="{{ image.alt }}"/>
  {% endfor %}
{% endfor %}
```

*Resizing the first image to 200 pixels wide, keeping the aspect ratio:*

```liquid
{% assign img = product.metafields.accentuate.multi_images | first %} 
<img src="{{ img.src | append: '&transform=resize=200' }}" alt="{{ img.alt }}"/>
```

*Filtering uploaded medias by media type:*

```liquid
{% assign doc_files = product.metafields.accentuate.doc_files | where: 'media_type', 'pdf' %}
{% for pdf in doc_files %} 
    <a href="{{ pdf.src }}">{{ pdf.filename }}</a> 
{% endfor %}
```

**Note:** Media are served directly via world-class software services with very low network latency. ACF also employs performance optimization techniques similar to Shopify when fetching images via cdn.accentuate.io, including transforming images to WEBP format for supporting browsers.\
\
While the performance of ACF's media delivery has been optimized for a balance of speed and quality, you should still consider [further optimizations](https://blog.cloudflare.com/optimizing-images/).[<br>](https://github.com/aFarkas/lazysizes)\
ACF currently has a limit of \~50MB per single media upload. You will typically only reach this limit when uploading video files. Take care not to force your visitors to download assets of this size but consider using a streaming service for large video files (like YouTube, Vimeo, etc.)


# Custom Object (JSON)

Defining a field as a Custom object allows you to enter field values as raw JSON.\
\
As long as you adhere to valid JSON syntax, you are free to define anything you like in your very own structure.\
\
If you have a JSON field with this content:

```json
{
  "make": "Audi",
  "model": "RS6" 
}
```

you can use it directly in Liquid:

```liquid
{% assign car = product.metafields.accentuate.specs %}

<p>My car is the brand new {{ car.make }} {{ car.model }}</p>
```

If you need the custom field as a client-side Javascript variable, you can use the JSON filter:

```javascript
<script>
  let car = {{ product.metafields.accentuate.specs | json }}
  alert('My car is the brand new ' + car.make + ' ' + car.model);
</script>
```

### Restrictions&#x20;

JSON objects can be as simple or as complex as you need **but** if you need to create an array of JSON objects, either use repeatable fields (see separate article) or define the array as a property within the JSON object.\
\
An **outer-most array is reserved** for ACF's handling of repeatable JSON fields.\
\
So while this works well:

```json
{
  "colors": ["Red", "Blue", "Green"]
}
```

this will cause ACF to split the values after you save them

```liquid
["Red", "Blue", "Green"]
```


# Multi-language Text

Three different field types are available as multi-language types:

* Text
* Markdown text
* HTML

Each of these behave as described for their "single language" counterparts (Text, Markdown, and HTML) but with an important difference as outlined here.\
\
All content for the custom field (i.e. across languages) is stored in the **same** Metafield, so it is important in Liquid to specify which language you need. If you omit this, all languages will be shown\
\
This example grabs the English (ISO code 'en') title from a custom field called "title":

```liquid
{{ product.metafields.accentuate.title.en }}
```

### Matching a language to the visitor's preference

But if we always wanted to show the title in English, there would be no need for multiple languages. \
\
We can match the custom field output to any Shopify-translated content by using the language noted in the URL via shop.locale. \
\
For example, if you have [myshopifystore.com/es/products/great-shirt](https://myshopifystore.com/es/products/great-shirt), you can grab the es language and use it as a key to access your custom field snippet:

```liquid
{{ product.metafields.accentuate.title[shop.locale] }}
```

We can also detect the visitor's browser language using a little [Shopify magic](https://shopify.dev/docs/liquid/reference/objects/request#request-locale) to show the "title" custom field in the language preferred by the visitor:

```
{% assign user_language = request.locale.iso_code %}
{{ product.metafields.accentuate.title[user_language] }}
```

### Showing a default value

The above examples will return an empty string if no content was provided for the visitor's language. To properly test if we have some content to show and revert to a safe default, we can apply the code below. \
\
This code also showcases that the configured locales (country names' ISO codes) are available in a special Metafield shop.metafields.acf\_settings.locales for precisely this purpose:

```liquid
{% assign default_language = shop.metafields.acf_settings.locales | first %}

{% if product.metafields.accentuate.title[shop.locale] %}
  <p>{{ product.metafields.accentuate.title[shop.locale] }}</p>
{% else %}
  <p>{{ product.metafields.accentuate.title[default_language] }}</p>
{% endif %}
```

### Multi-language Markdown example

In case you were wondering how multi-language Markdown fields work, here is an example (note the .html at the end to get the rendered HTML from the markdown code):

```liquid
<p>{{ product.metafields.accentuate.markdown_title[shop.locale].html }}</p>
```

### Setting up the languages

Before you can edit content for multi-language fields, you need to tell ACF which languages to handle content for and optionally provide a DeepL API key for built-in translation. \
\
So, from your admin side menu, click the "Settings" button to open the settings dialog and go to the "Languages" tab:

![](/files/BKqSV2KlS7pYIn629oQh)

In the selection box for "Multiple languages setup", select the languages you need to provide content for. You can select as few or as many languages as you need. Note that languages can be added or removed dynamically, so you don't need to know your complete setup before adding content for each language. If you need to add a language later after setting up content for other languages, you can just do so.&#x20;

{% hint style="warning" %}
Mind the ordering as this will be reflected in the editor. You can also use the ordering to provide a default language in case a visitor's language is not defined (see below)&#x20;
{% endhint %}

When you edit a multi-language custom field, the ACF editor will allow you to input content for each language selected in the above setup.  \
\
Here is an example of a multi-language text field called "Greetings", allowing input in all three defined languages:

![](/files/tAv9sLslGesMgwPmfv9U)

### Translating content to other languages

ACF supports in-app translation of content in multi-language fields via an integration with [DeepL](https://www.deepl.com/). DeepL combines deep learning and artificial intelligence to understand and translate text between these different languages:

* Bulgarian
* Czech
* Danish
* German
* Greek
* English
* Spanish
* Estonian
* Finnish
* French
* Hungarian
* Italian
* Japanese
* Lithuanian
* Latvian
* Dutch
* Polish
* Portuguese&#x20;
* Brazilian Portuguese
* Romanian
* Russian
* Slovak
* Slovenian
* Swedish

When you have multiple languages defined in ACF **and** your primary language is one of the above, ACF will allow you to translate content in a multi-language field **from** that primary language **to** any other language that is listed above.  \
\
For example, you have English listed as a primary language (the first one in the ordering) with German, French, and Finnish as secondary languages.

![](/files/VL0FPJbkMbdM0JMZ9vpM)

With DeepL enabled, ACF will now allow you to translate **from** English **to** both German, French, and Finnish.\
\
The translation service is available directly from each field. This is an example of a simple text field:&#x20;

![](/files/dLEOzjSMZvxtmHYIxhFb)

Example for HTML fields with translation available directly from the toolbar:

![](/files/OIDPe0Rm5ceR3P4aLwrV)

### How to enable DeepL

To use DeepL within ACF, you need a DeepL Pro API subscription. DeepL Pro is a 3rd party service with both a free and a paid option. [See details and sign up here](https://www.deepl.com/pro.html#developer). \
\
Once signed up, you can go to your DeepL account page and see your API key:

![](/files/0TjilD9R91F2MqXVKCU6)

Copy the API key using the copy button to the right of the key and from your Shopify admin, click the "Settings" button in the side menu to open the settings dialog, go to the "Languages" tab, and paste the key into the field for "DeepL API key":

![](/files/E4DAyqCyJwJ0svm4w0rA)

Click "Save" and you're ready to translate your texts in-house.

{% hint style="info" %}
**Disclaimer:** DeepL does not give any guarantee regarding the correctness of the translations created by the machine translation system. This is not meant to replace a professional translation service for mission-critical content.
{% endhint %}


# Reference fields

A reference type custom field is a specialized version of a 'Selection' type which will list all available objects of its type:

![](/files/OAbFwOGuqPBQvCYP4axO)

{% hint style="info" %}
The values shown specifically for **product** and **variant** selections can be customized to show additional information, making it easier to search and filter for the correct items.&#x20;

You can find the available options in your settings in the admin side menu
{% endhint %}

Once a value is selected, the Metafield will contain the referenced Shopify object's **handle** as its value (see special cases for file, resource, and variant reference fields below).\
\
You can use this handle as a reference to a Shopify object via a Liquid global object depending on the type.

```liquid
{{ blogs[product.metafields.accentuate.related_blog].title }}  
{{ articles[product.metafields.accentuate.related_article].title }}  
{{ pages[product.metafields.accentuate.related_page].title }}  
{{ collections[product.metafields.accentuate.related_collection].title }}  
{{ all_products[product.metafields.accentuate.related_product].title }}  
{{ linklists[product.metafields.accentuate.related_linklist].links }}
```

The above examples use [Shopify Global Objects](https://help.shopify.com/en/themes/liquid/objects#global-objects)

{% hint style="info" %}
Shopify global objects only return values for published products, collections, pages, etc. Be sure to check if the returned object is valid in case the reference suddenly points to a deleted or archived object.
{% endhint %}

{% hint style="info" %}
Shopify imposes a **restriction** on how many calls to "all\_products" you can make from a single Liquid page. This is currently set to **20 unique handles per page**
{% endhint %}

Using reference types, we can also get the Metafields from the referenced objects using the handle. This is just as easy as getting the URL or title as shown above.

```liquid
{{ all_products[product.metafields.accentuate.related_product].metafields.accentuate.isbn }}
```

### Multiple selections

As is the case for the basic type 'Selection', if you have opted for multiple selections for your reference type, each object's handle is listed with the "pipe" symbol ("|") as a separator token. \
\
You can use Liquid's 'split' filter on the Metafield to separate the handles - like this:

```liquid
{% assign selected_handles = product.metafields.accentuate.selection | split: '|' %}
{% for selected_handle in selected_handles %}
  <p><a href="{{ all_products[selected_handle].url }}">{{ all_products[selected_handle].title }}</a></p>
{% endfor %}
```

### Variant reference fields

In Shopify, individual product variants don't have handles, so we need to rely on the product's handle combined with the id of the referenced variant.\
\
Therefore variant references are stored as *product\_handle:variant\_id* for easy access to both the product object and the underlying variant, like this:

```liquid
{% assign product_handle = product.metafields.accentuate.referenced_variant | split: ':' | first %}
{% assign variant_id = product.metafields.accentuate.referenced_variant | split: ':' | last | plus: 0 %}

{% assign referenced_product = all_products[product_handle] %}
{% assign referenced_variant = referenced_product.variants | where: "id", variant_id | first %}

<p>The referenced variant is {{ referenced_product.title }} {{ referenced_variant.title }}</p>
```

Note the use of the Liquid filter "plus: 0" which converts a string to a number for use in the "where" filter.

{% hint style="warning" %}
Variant references cannot successfully be transferred to other stores due to the use of internal Shopify ids, which will vary across stores. Shopify does not offer a way to uniquely identify a specific product variant across store boundaries
{% endhint %}

### File reference fields

Using a File reference field, you can reference a file or an image uploaded to Shopify (under Settings > Files)\
\
A file reference is stored as the *filename*, so you can get a fully qualified URL pointing to the file within Shopify's CDN using the [Liquid filters *file\_url* or *file\_img\_url*:](https://shopify.dev/api/liquid/filters/url-filters#file_url)

```liquid
{% assign url = product.metafields.accentuate.referenced_file | file_url %}
<a href="{{ url }}">Click to download</a>
```

Also, the filename (of an image) can be used as a lookup value to the *images* global object in Liquid to get an [image object](https://shopify.dev/api/liquid/objects/image) of the file:

```liquid
{{ assign image = images[product.metafields.accentuate.referenced_file] }}
```

### Resource reference fields

Using a Resource reference field, you can reference any of the following Shopify objects: collections, products, pages, blogs, or articles.\
\
A resource reference is stored as a **partial URL** to the selected resource - like **/products/example** or **/pages/contact**, so you may redirect your visitor to the relevant page using links, buttons, etc.:

```liquid
{% assign url = product.metafields.accentuate.referenced_resource %}
<a href="{{ url }}">Please see here</a>
```

### Media reference fields

Media references don't contain references to Shopify objects such as products and collections. Instead, they contain internal references to ACF Media v2 type field values defined under either the "shop" or "globals" scope. \
\
Defining a media reference field allows you to reference a globally defined media from any scope like a specific product or collection. If, for example, you have a collection of vendor logos, icons or author avatars and would like to associate these with specific products or articles, you can define a Media v2 field under the "shop" or "globals" scope and use a media reference field to point to any of the uploaded media, allowing for a single point of maintenance of the media itself. \
\
The media reference field itself will contain the referenced media's handle and you can do a lookup in Liquid like this:

```liquid
{% assign referenced_media = shop.metafields.globals.vendor_logos | where: "handle", product.metafields.accentuate.vendor_logo_ref | first %}
<img src="{{ referenced_media.src }}" alt="{{ referenced_media.alt }}"/>
```

Or, if you have multiple media references selected:

```liquid
{% assign selected_handles = product.metafields.accentuate.vendor_logo_ref | split: '|' %}
{% for selected_handle in selected_handles %}
  {% assign referenced_media = shop.metafields.globals.vendor_logos | where: "handle", selected_handle | first %}
  <img src="{{ referenced_media.src }}" alt="{{ referenced_media.alt }}"/>
{% endfor %}
```

{% hint style="info" %}
Note the use of the Liquid filter "first" to pull the first element from the resulting array.
{% endhint %}

{% hint style="info" %}
When updating a media being referenced by one or more media reference fields, you must ensure that the references stay valid by doing a "replace" operation rather than deleting and reloading the media (which will break the reference). This is available as an option button when hovering over the media:
{% endhint %}

\
*When updating a media referenced by one or more media reference fields, you must ensure that the references stay valid by doing a "replace" operation rather than deleting and reloading the media (which will break the reference). This is available as an option button when hovering over the media:*

![](/files/jRHaOi8TN04ubelcypKg)


# References to Global fields

Global fields references in ACF are meant as puzzle pieces for building your field definitions for a specific scope, making it easy to reference content that would otherwise be replicated across many products or collections, etc.\
\
For example. you have a set of features with an icon and a description common to your products defined as Global fields:

![](/files/wnU99mkGXwsZwZJdk6gO)

You can then use a global reference field to point to the section or any of the fields (and even specific occurrences within both), allowing for a single point of maintenance of the underlying data. So if a feature icon or description changes, you just update the global field and the change will be reflected on all your products instantly.

![](/files/PRS5FpTq3qOJCSnA94bA)

{% hint style="info" %}
**Tip:** If a repeatable section contains a field of type Text, the content of the first in the sequence will be included after each occurrence's index number ("Organic" and "Vegan" in the example) for easier selection of the correct occurrence
{% endhint %}

### What is stored in the reference field?

The underlying Metafield value when selecting global fields will always be a JSON object with a single  *.references* property containing an iterable array of JSON objects with either a *.field* or a *.section* property (depending on what is being referenced) and optionally either an *.index* or *.key* property.\
\
The *.key* property is only used for **repeatable section** references and **only** when the global section being referenced has its "Use sticky references" setting enabled (see below).  \
\
If just a single field or section is selected, the array will have just one entry. This allows for consistent use of Liquid's array filters such as first, last, where, etc.\
\
Example structure:

```json
{ references: [
    { field: "field_name",
      section: "section_name",
      index: <number>,
      key: "internal_random_key"
    }]
}
```

You can query the  *.references* array for either the *.field* or *.section* property being present to detect what is being referenced as well as the *.index* property to detect if a specific occurrence is being referenced.

### Resolving field references

When one or more fields are being referenced, each field reference (an element in the *.references* array) will contain the field's name in the *.field* property and you can resolve the reference in Liquid like this:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_global_field = shop.metafields.globals[reference_to.field] %}

<p>{{ referenced_global_field }}</p>
```

Or, if you have selected multiple fields references:

```liquid
{% assign references_to = product.metafields.accentuate.features.references %}
{% for reference_to in references_to %}
  {% assign referenced_global_field = shop.metafields.globals[reference_to.field] %}
  <p>{{ referenced_global_field }}</p>
{% endfor %}
```

If you are referencing repeatable fields, please see the related article "Repeatable fields" for instructions about how to loop over these&#x20;

### Resolving field references with indexes&#x20;

A global reference may point to specific occurrences of repeatable fields. When this is the case, the referenced index is stored in the *.index* property.\
\
This example covers a single field reference to a specific occurrence:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_global_field = shop.metafields.globals[reference_to.field][reference_to.index] %}
<p>{{ referenced_global_field }}</p>
```

### Detecting the referenced field type

If you need to check which type of field is being referenced, you can cross-reference the  *.field* selection against the field definitions for the global scope, like this:

```liquid
{% assign reference_to_type = shop.metafields.acf_settings.global.fields | where: "name", reference_to.field | map: "type" | first %}

<p>The type of field being referenced is '{{ reference_to_type }}'</p>
```

### Resolving section references

If the global reference field is referencing a *.section*, you can go via the field definitions to find the section's fields (see related article below), like this:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_fields = shop.metafields.acf_settings.global.fields | where: "section_name", reference_to.section %}

{% for referenced_field in referenced_fields %}
  {% assign referenced_global_field = shop.metafields.globals[referenced_field.name] %}
  <p>{{ referenced_field.label }}: {{ referenced_global_field }}</p> 
{% endfor %}
```

If you are referencing a repeatable section, please see the related article "Repeatable fields" for instructions about how to loop over these<br>

### Resolving section references with indexes (i.e. the non-sticky way)

Reference fields may point to specific occurrences of repeatable sections. When this is the case, the referenced index is stored in the *.index* property and is valid for accessing the relevant part of the section's fields.\
\
This example covers a single reference to a section's specific occurrence (like "Features #1" in the above selection) which then is resolved to the contained fields dynamically:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_fields = shop.metafields.acf_settings.global.fields | where: "section_name", reference_to.section %}

{% for referenced_field in referenced_fields %}
  {% assign referenced_global_field = shop.metafields.globals[referenced_field.name][reference_to.index] %}
  <p>{{ referenced_global_field }}</p> 
{% endfor %}
```

Usually, though, you'll be selecting specific sections and just want to use the index of the section being referenced (like "Features #1" and "Features #2" in the above selection), so you can loop the reference field selections and code the fields directly in Liquid using the index property:

```liquid
{% assign references_to = product.metafields.accentuate.features.references %}
{% for reference_to in references_to %}

  <p>{{ shop.metafields.globals.feature_title[reference_to.index] }}</p> 
  <p>{{ shop.metafields.globals.feature_description[reference_to.index] }}</p> 

{% endfor %}
```

### Resolving section references with keys (i.e. the sticky way)

Same as above, reference fields may point to specific occurrences of repeatable sections but can optionally store a "sticky" reference to the selected occurrences' index.\
\
This happens automatically when the global section being referenced has its "Use sticky references" setting enabled. \
\
When this is the case, the referenced "index" is stored indirectly in the *.key* property and the correct index can then be determined dynamically in Liquid.&#x20;

{% hint style="info" %}
This is the recommended way to use section references because it ensures that the references are always up to date even if the occurrences within the global section are rearranged **after** selections have been stored in the reference field.
{% endhint %}

This example covers a single reference to a section's specific occurrence (like "Features #1" in the above selection) via a key. The actual occurrence index is then resolved in Liquid via the '**assign index =**' statement:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign index = shop.metafields.globals[reference_to.section] | where: "key", reference_to.key | map: 'index' | first %} 
  
<p>{{ shop.metafields.globals.feature_title[index] }}  
</p> 
<p>{{ shop.metafields.globals.feature_description[index] }}</p> 
```

{% hint style="info" %}
If you get lost in field references and resolving to global fields, try outputting the involved fields using Liquid's *json* filter. This will often reveal any issues
{% endhint %}


# Fields

### **Fields**

Fields are the essence of ACF. They are called "Metafields" and are stored as information tied directly to your own individual objects such as your products, collections, pages, etc.&#x20;

![](/files/TEhyMF6eh1EW4CzOO4nN)

You can use fields to store information, media, references, etc. that are relevant to help you better describe your objects in your storefront. Also, you can use it as an admin tool to store important backend information related to your exact business processes - the use cases can be whatever you want them to be essentially.


# Label & Namespace

### What is a label in Metafields?

**Label** - internal identifier you’ll see inside the app to help you stay organized.&#x20;

**Name / Key** - automatically generated based on the label, but you can also edit it if you want.

<figure><img src="/files/28yLw9s7vZK3MbiQVxy9" alt=""><figcaption></figcaption></figure>

### What is a namespace?

In Shopify Metafields, a **namespace** works together with a **key** to define and organize custom fields. Think of it as a way to group and separate your fields so they don’t clash with fields from other apps.

By default, Accentuate uses the **accentuate** namespace to keep your Metafields organized and separate. That’s why setting a namespace is optional, unless you have a specific reason to customize it, **Accentuate takes care of it for you.** However, you can override this and set your own namespace for any individual field if needed.

<figure><img src="/files/Q4rVI1DgRGIdGLMDXhUS" alt=""><figcaption></figcaption></figure>

It is also a great way to (technically) group sets of fields that naturally belong together. For instance:

* Use `image.title` and `image.rating` for image-related fields
* Use `video.title` and `video.rating` to group video-related fields

If you need to use ACF to manage Metafields created from other apps, you can match the namespace and key for the fields when defining the field type and ACF will automatically use any existing values going forward. Just take care to define a field type that makes sense with regard to any existing data.

{% hint style="info" %}
Some namespaces are reserved for internal ACF use and cannot be used for field definitions. The field definition dialog will not allow you to define fields using the namespaces *acf\_settings, product\_types, vendors, locations* or *globals*
{% endhint %}


# Field contexts (Field applies to)

## How to apply fields to specific objects in a scope

When you define custom fields for a specific scope (such as **products**), those fields don’t always need to apply to every object (product) within that scope (products). For example, custom fields relevant to **shoes** might not make sense for **furniture**.

To solve this, Accentuate Custom Fields provides a **Field applies to** setting that allows you to control which objects (specific products) a section or field should appear for in the editor (the place you add actual values to your Metafields).

<figure><img src="/files/DO6fJ4MIW687IN7diSrj" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The selection values in the dropdown depend on the scope you are defining fields for
{% endhint %}

## How the “Field applies to” Setting Works

### Sections and Fields

You can apply the filter at two levels:

* **Section level** – all fields within the section will inherit the section’s filter.
* **Individual field level** – each field can have its own filter if no section-level filter is applied.

Both sections and individual fields can have applies-to settings. If a section has an applies-to setting, this setting will be inherited by all the section's fields. Otherwise, each individual field can have an applies-to setting on its own.

### Contextual dropdown options

The values available in the **Field applies to** dropdown will depend on the scope you're working with. For the product scope, you’ll typically be able to filter by **product types**.

You can add product types on your **Product page** by entering the **type** in **Product organization**.

<figure><img src="/files/rEQF1mEhfB6oiLyw1Tt1" alt=""><figcaption></figcaption></figure>

If the expected filter options don’t appear in the **Field applies to** dropdown, simply click the **Refresh** button to reload the available values.

<figure><img src="/files/Qa66CYWjVsFTDaph11Ul" alt=""><figcaption></figcaption></figure>

## How to filter with Field applies to

You can select multiple values to filter the section or fields by. If an object fits at least one of the **Field applies to** conditions, it will be shown.

<figure><img src="/files/eTG9oI2GOxcF22DKoN3L" alt=""><figcaption></figcaption></figure>

Therefore, when you select the "Earrings" field context, you'll see only the sections and fields that are specifically configured to apply to that context.<br>


# Field data type

When defining a custom field, selecting the correct **field data type** is essential because it determines **what kind of data** you want to store.&#x20;

ACF supports a wide variety of field types, including: simple **text** fields, **images**, **URLs**, **HTML**, **rich text**, **file uploads**, **number** inputs, **dropdowns**, **references** and more. Each serves a specific purpose depending on the kind of data you need to capture.

For example:

* Want to upload a product demo video? Use a **Media v2** field.
* Need a short description? Use a **Single-line text** field.
* Referencing another object like a global FAQ? Use a **Reference** field.

{% hint style="info" %}
When adding a new field, ACF may restrict its field type to a specific selection. If you have a Shopify Metafield definition in place for the chosen name and namespace combination, this definition will determine your field's type for you, so the Shopify and ACF field definitions are aligned (as they should be).
{% endhint %}

To help you visualize your options, here’s a preview of the field type selector in ACF:

<figure><img src="/files/bxsyswZggcCiADnfejZn" alt=""><figcaption></figcaption></figure>

You can explore all available field types in more detail in our dedicated articles:

{% content-ref url="/pages/fnv9GsX63A9b8Y8LLzzw" %}
[Shopify Field types](/metafield-definitions/create-a-metafield-definition/field-data-type/shopify-field-types)
{% endcontent-ref %}

{% content-ref url="/pages/tsNcBk94gelc39Kz38O2" %}
[ACF Field types](/metafield-definitions/create-a-metafield-definition/field-data-type/acf-field-types)
{% endcontent-ref %}

Having a clear understanding of these types will help you avoid having to restructure data later.

### Shopify Native Fields vs. Accentuate Fields: What’s the difference?

In ecommerce, data is power but **only if it’s structured the right way.**

Whether you’re adding extra product details, building content templates or creating custom workflows, the fields you use will determine how easily (or how painfully) you can manage your data over time.

When working with **Accentuate Custom Fields**, you’ll often come across two types of fields:

* **Shopify native fields**
* **Accentuate fields**

Both play important roles, but they’re **not the same.**

Let’s break down what each does, why the difference matters and how to decide which one fits your needs.

### The evolution of Metafields

In the early days of Shopify Metafields, things were a bit different. Using unstructured metafields was the norm. With these types of Metafields, merchants could store any data they wanted but there were no guardrails.

For instance, if you wanted to showcase burn times for candles, you needed to manually enter data, no matter their format (text, number, etc). This could lead to inconsistencies, as someone may enter “40hrs”, another “about 40 hours” or “40h”.

All of these mean the same thing to a human, but to Shopify, they were **completely different inputs.** This sometimes led to errors, differences or display issues. It was flexible, sure. On the other hand, sometimes brought challenges.

By building on top of unstructured Metafields, Accentuate introduced **predefined ACF field types** long before Shopify provided official definitions. That is why all **Accentuate fields** **remain unstructured by design.** While these custom definitions served merchants well in the past, most of them are now considered outdated.&#x20;

Now, the new standard is structured Metafields. Shopify lets you create **Metafield definitions to help standardize custom data.** Think of these as **templates that enforce rules:**

* **Type of content** (text, number, file, reference, etc.)
* **Namespace and key** (how Shopify organizes custom data)
* **Validation rules** (what’s allowed and what isn’t)

Using the same example, if you create a Metafield for **burn time**, Shopify can restrict the input to **numbers only.** No more "about 40 hours." Just **40**.

With native Metafields, Shopify prompts users for the correct type of input, ensuring consistency across all your entries. You’re no longer relying on memory or internal documentation to get it right. Shopify handles the structure for you.

This shift from **unstructured to structured** data helped merchants stay consistent, avoid errors, and made fields easier to use across products, collections, orders and more.&#x20;

### Which should you use?

At Accentuate, we don’t believe in one-size-fits-all solutions. Both **structured** and **unstructured** fields serve important purposes.

Accentuate supports all of Shopify’s native fields and still utilises Accentuate fields since they give you **more control** over your custom data.

Both approaches have **benefits** and **limitations**, it’s all about what fits your store’s needs. Here’s a good rule of thumb:

* **Use Accentuate fields** when you need advanced field types such as **HTML** or **Media v2**, or when you’re managing complex content structures that go beyond Shopify’s native capabilities.

We generally recommend using Shopify's native Metafield definitions when creating new Metafields, as they offer better consistency, validation and integration within Shopify.&#x20;

{% hint style="info" %}
In Accentuate, definitions marked with **Shopify >>** are native and recommended for new fields.
{% endhint %}

If you’re ever unsure about how to set things up, **reach out to our team.** We’re happy to help you make the right decision from the start.

### Multiple selections or repeatable?

While the two settings can from time to time achieve the same result, it is also relevant to consider when it is right to use one over the other.

Enabling multiple selections for a field is recommended if you need multiple values for just one field. If you have a group of fields that you need multiple values for, making the overall section of the fields repeatable would be the recommended way to go.

In general, we recommend not enabling any settings you won't need. It is much better to keep it simple and build your setup bit by bit once the needs present themselves.


# Shopify Field types

### Shopify Metafield definitions

Via your Shopify admin Settings » Custom data, you can optionally create a Metafield definition for a certain namespace + key combination. With a definition in place, the field can be referenced from within Shopify's Theme Customizer as a Dynamic data source and also be "pinned", making it easier to edit the Metafield values in context from your Shopify admin detail page.&#x20;

{% hint style="success" %}
**Do** make sure that any Shopify Metafield definitions and the corresponding ACF field definitions use the same data type. If they do not match, Shopify will **block** ACF from doing updates to the underlying Metafields.

\
Also, Shopify Metafield definitions need to be in place for any *Shopify » Metaobject reference* or *Shopify » Mixed reference* fields you define. These definitions are responsible for selecting the type of Metaobject(s) that ACF will show the entries for when working in the editor
{% endhint %}

{% hint style="danger" %}
**Do not** create Shopify Metafield definitions for any fields in ACF that are not defined as Shopify » ... types (Text, HTML, etc). This will cause Shopify to **block** ACF from doing updates to the underlying Metafields
{% endhint %}

ACF will automatically check if a field's data type matches the Shopify Metafield definition (for the namespace + key combination) and show either a green checkmark or a warning icon in the list of defined fields for a scope.

If you have defined a field where no Shopify Metafield definition exists, ACF will just show a grey checkmark to indicate that the field type is valid.

### Metafields without definitions

Via your Shopify admin detail page, you can edit metafields regardless of whether a definition is in place or not (section Metafields » View all). For Metafields without a definition, Shopify will make an educated guess of each Metafield's content type.

{% hint style="warning" %}
Please be careful when editing non-Shopify types this way, since ACF's data validation rules are not in effect here
{% endhint %}

### Using Shopify Metafields from Liquid

Metafield values created using a "Shopify » ..." type do not return the value using the normal syntax in Liquid. Rather, these types return a [Metafield object](https://shopify.dev/api/liquid/objects/metafield) with two properties: *type* and *value*.\
\
The *value* property returns the actual value, like this:

```
<h3>{{ product.metafields.accentuate.subtitle.value }}</h3>
```

### Repeatability

{% hint style="warning" %}
While Shopify » ... (List) types are repeatable by definition, they cannot be part of a repeatable section. This is a restriction in ACF, which will be addressed in an upcoming version.
{% endhint %}

### Transferability

{% hint style="warning" %}
Shopify **reference field** values cannot successfully be transferred to other stores due to the use of internal Shopify ids, which will vary across stores. **File reference** fields are an exception here if the same file names exist in the target store.
{% endhint %}


# Shopify » Single line text

A Shopify Single line text works similar to the ACF type Text.\
\
There is no functional difference, but the Liquid code has a new syntax. Being a Shopify data type, that returns a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value:

```liquid
<h3>{{ product.metafields.accentuate.subtitle.value }}</h3>
```


# Shopify » Multi-line text

A Shopify Multi-line text works similar to the ACF type Text (with its "Lines" setting set to more than 1 line).\
\
There is no functional difference, but the Liquid code has a new syntax. Being a Shopify data type, that returns a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value:

```liquid
<h3>{{ product.metafields.accentuate.subtitle.value }}</h3>
```

{% hint style="info" %}
A Shopify Multi-line text cannot store more than 65,535 characters (this includes any HTML tags)
{% endhint %}

### Storing HTML in a Multi line text field

Since the Shopify field types don't yet offer a 'html' option, we have made it possible to treat the Multi line text field as HTML:liquid

![](/files/XV5rtrBDQYd7OZcSZiF0)

With this setting enabled, you get the same editing functionality from ACF as for our [native HTML field type.](/metafield-definitions/create-a-metafield-definition/field-data-type/acf-field-types/html)


# Shopify » Boolean

A Shopify Boolean works similar to the ACF type Checkbox\
\
There is no functional difference, but the Liquid code has a new syntax. Being a Shopify data type, that returns a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value:

```liquid
{% if product.metafields.accentuate.display_vendor.value %}
<p>{{ product.vendor }}</p>
{% endif %}
```


# Shopify » Color

A Shopify Color works similar to the ACF type Color and gives you a convenient control to select a color and store the result as a string in hex RGB format such as #000000, #e9e9e9, #ffffff etc. \
\
Example use:

```html
<button style="background-color: {{ product.metafields.accentuate.background_color.value }}">Click</button>
```

Also, you can use [Liquid Color filters](https://shopify.dev/api/liquid/filters/color-filters) to perform operations on the color such as converting to HSL, lighten or darken the color etc.

{% hint style="info" %}
**Note:** while the *value* property used as shown above returns a string in hex RGB format, the Shopify Color type actually returns [a Color object](https://shopify.dev/api/liquid/objects/color) with access to the selected color's underlying properties such as the *red*, *blue* and *green* components.
{% endhint %}


# Shopify » Custom objects (JSON)

A Shopify JSON field works similarly to the ACF JSON type, albeit without restrictions regarding outermost arrays.\
\
The type allows you to enter field values as raw JSON. As long as you adhere to valid JSON syntax, you are free to define anything you like in your very own structure.\
\
Being a Shopify data type returning a [Metafield object](https://shopify.dev/api/liquid/objects/metafield), the *value* property returns the actual value in Liquid.\
\
So, if you have a JSON field with this content:

```json
{
  "make": "Audi",
  "model": "RS6" 
}
```

You can use it directly in Liquid:

```liquid
{% assign car = product.metafields.accentuate.specs.value %}

<p>My car is the brand new {{ car.make }} {{ car.model }}</p>
```

If you need the custom field as a client-side JavaScript variable, you can do this:

```javascript
<script>
  let car = {{ product.metafields.accentuate.specs.value }}
  alert('My car is the brand new ' + car.make + ' ' + car.model);
</script>
```


# Shopify » URL

A Shopify Url field type basically behaves just like a Text (or Shopify Single line text) field, allowing you to enter a URL.\
\
Defining the field as a URL type ensures that the content is a fully qualified URL complete with a protocol scheme (https\://, http\:// etc.):

```liquid
<a href="{{ product.metafields.accentuate.instructions.value }}">Click to view instructions</a>
```


# Shopify » Date

A Shopify Date works similar to the ACF type Date but always stores the date in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format (YYYY-MM-DD) without a presumed timezone.\
\
A field of type Shopify » Date can be subject to date filters in Liquid:

```liquid
{{ product.metafields.accentuate.published_date.value | date: "%a, %b %d, %y" }}
```

Please see [Understanding Date Formats in Liquid and Shopify](https://www.shopify.com/partners/blog/liquid-date-format)


# Shopify » Date and Time

A Shopify Date and Time field always stores the date and time in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format without a presumed timezone (YYYY-MM-DDThh:mm:ss+00:00) \
\
Note that ACF doesn't allow for selection of seconds in the time part of the field - this will always be '00'.\
\
A field of type Shopify » Date and Time can be subject to date filters in Liquid:

```liquid
{{ product.metafields.accentuate.published_date_time.value | date: format: 'long' }}
```

Please see [Understanding Date Formats in Liquid and Shopify](https://www.shopify.com/partners/blog/liquid-date-format)


# Shopify » Integer

A Shopify Integer works similar to the Decimal type, but only allows for input of a number without decimals.\
\
The *value* property returns a numeric value directly, allowing you to do numeric comparisons directly:

```liquid
{% assign rrp = product.metafields.accentuate.rrp_price.value %}
{% if rrp > 100 %}
    <p>RRP is {{ rrp }}</p>
{% endif %}
```


# Shopify » Decimal

A Shopify Decimal works similar to the ACF type Number, allowing for input of a number with decimals.\
\
The *value* property returns a numeric value directly, allowing you to do numeric comparisons directly:

```liquid
{% assign rrp = product.metafields.accentuate.rrp_price.value %}
{% if rrp > 100 %}
    <p>RRP is {{ rrp }}</p>
{% endif %}
```


# Shopify » Weight

A Shopify Weight type allows you to select a unit and a decimal value to go with that unit.\
\
Weight units can be any of **oz**, **lb**, **g** or **kg**.\
\
The entered weight is then available as a JSON structure with *unit* and *value* properties, for example:

```liquid
{% assign weight = product.metafields.accentuate.weight.value %}
<p>The weight is {{ weight.value }}{{ weight.unit }}</p>
```

Referencing *.value* alone will render the output as "*value*\<space>*unit*", so this works as well:

```liquid
<p>The weight is {{ product.metafields.accentuate.weight.value }}</p>
```


# Shopify » Volume

A Shopify Volume type allows you to select a unit and a decimal value to go with that unit.\
\
Volume units can be any of **ml**, **cl**, **l**, **m3** (cubic meters), **us\_fl\_oz**, **us\_pt**, **us\_qt**, **us\_gal**, **imp\_fl\_oz**, **imp\_pt**, **imp\_qt** or **imp\_gal**.\
\
The entered volume is then available as a JSON structure with *unit* and *value* properties, for example:

```liquid
{% assign volume = product.metafields.accentuate.volume.value %}
<p>The volume is {{ volume.value }}{{ volume.unit }}</p>
```

Referencing *.value* alone will render the output as "*value*\<space>*unit*", so this works as well:

```liquid
<p>The volume is {{ product.metafields.accentuate.volume.value }}</p>
```


# Shopify » Dimensions

A Shopify Dimension type allows you to select a unit and a decimal value to go with that unit.\
\
Dimension units can be any of **in**, **ft**, **yd**, **mm**, **cm** or **m**.\
\
The entered dimension is then available as a JSON structure with *unit* and *value* properties, for example:

```liquid
{% assign dimension = product.metafields.accentuate.dimension.value %}
<p>The dimension is {{ dimension.value }}{{ dimension.unit }}</p>
```

Referencing *.value* alone will render the output as "*value*\<space>*unit*", so this works as well:

```liquid
<p>The dimension is {{ product.metafields.accentuate.dimension.value }}</p>
```


# Shopify » Reference fields

A Shopify Reference field works similarly to the ACF reference type.\
\
From an editor's perspective, there is no functional difference, but the Liquid code now returns the referenced object directly without the need to do a lookup via a global object using a handle.\
\
So for example a Product reference returns the referenced product directly:

```liquid
{% assign ref_product = product.metafields.accentuate.ref_product.value %}
<p>The referenced product is {{ ref_product.title }}</p>
```

If you are referencing a file or an image from your Files list in Shopify, you can get the associated URL using the [Liquid filters *file\_url* and *file\_img\_url*:](https://shopify.dev/api/liquid/filters/url-filters#file_url)

```liquid
{% assign url = product.metafields.accentuate.ref_file.value | file_url %}
<p>The referenced file is {{ url }}</p>
```

{% hint style="warning" %}
Shopify reference field values cannot successfully be transferred to other stores due to the use of internal Shopify ids, which will vary across stores
{% endhint %}

{% hint style="success" %}
However, using ACF, you can choose to export Shopify Product references and Shopify Collection references using their respective handles, which you can then import into another store assuming the handles match across your stores
{% endhint %}


# ACF Field types


# Text

The value of custom fields of type Text is represented as you may expect - as Metafields with string values matching the value of their respective custom fields

```liquid
<h3>{{ product.metafields.accentuate.subtitle }}</h3>
```

If you need to display multi-line texts on your storefront, you can take advantage of the *newline\_to\_br* filter, so line breaks will be formatted correctly:

```liquid
<h3>{{ product.metafields.accentuate.subtitle | newline_to_br }}</h3>
```


# Markdown text

In a Markdown type field, you can enter text in [Markdown syntax](https://www.markdownguide.org/basic-syntax/) and ACF will automatically render it as HTML in a separate property in the Metafield.\
\
A Markdown field contains two properties:

> markdown&#x20;

Your markdown as entered in the editor

> html

The HTML derived from your Markdown, ready to show in the browser:

```html
<h3>{{ product.metafields.accentuate.markdown_title.html }}</h3>
```


# HTML

Editing HTML in custom fields is done via an advanced editor - the Froala WYSIWYG editor.\
\
Via the individual HTML fields' setup or the settings dialog (available from the admin side menu), you can choose to have either the full toolbar or a simplified version.\
\
The Settings dialog also allows you to turn on "paste as plain text" so that pasting HTML from other sources (such as Word) won't carry over any formatting but will keep the structure.

![](/files/1F5Lt5dNf5j2N84UnH5U)

### Preserving the HTML look on your storefront

Depending on the options used for aligning blocks of text, embedding videos, styling images, and tables, etc., the HTML itself may contain references to CSS classes defined by Froala.\
\
To preserve the look of the edited HTML outside of the editor (ie on your storefront) you **may have** to include the following CSS file in your theme.liquid file:

```html
<link href="https://app.accentuate.io/assets/css/froala@3.1.0/froala_style.css" rel="stylesheet" type="text/css" />
```

Note the version number 3.1.0 in the URL. This can change over time, so if anything looks out of place, check your used version number vs the above.\
\
Also, make sure that you place the edited content inside an element that has the class *fr-view*:

```html
<!-- Here comes the HTML edited with the Froala rich text editor --> 
<div class="fr-view">
   {{ product.metafields.accentuate.my_html_description }} 
</div>
```


# Checkbox

A checkbox can hold two states - checked or unchecked. \
\
The Metafield value of a checked checkbox (!) is represented as a string value of "true" but an unchecked checkbox will cause the underlying Metafield to be deleted rather than contain a value of "false". \
\
Accordingly, we can test for it being checked or not this way:

```liquid
{% if product.metafields.accentuate.washable %}
  <p>{{ product.title }} can be washed</p>
{% else %}
  <p>{{ product.title }} can NOT be washed</p> 
{% endif %}
```


# Selection

A field of type Selection gives you either a dropdown-style or a table-style way of selecting one or more predefined values.

{% hint style="info" %}
You can mark values to be suggested when editing a product, a page, etc. that doesn’t have a value for that field already. If you would like a default value of "Blue" to be suggested by default in a selection of "Red, Green, Blue", just prefix the option with a colon: ":Blue" in the field definition
{% endhint %}

{% hint style="info" %}
You can opt to have selections use another value than the one presented in the ACF editor by separating the value and the presentation string with double colons - "value::string".&#x20;

To have e.g. a color code stored for a selection of a named color, enter "#0000ff::Blue". This will show the option as "Blue" in the ACF editor dropdown but actually store the value "#0000ff" in the Metafield
{% endhint %}

The selection is represented as a Metafield with its string value matching the selected value:

```html
<p>You have selected the value: {{ product.metafields.accentuate.selection }}</p>
```

Or, in case of multiple selected values, with each value listed using the "pipe" symbol ("|") as a separator token. \
\
You can use Liquid's 'split' filter on the Metafield to separate the values - like this:

```liquid
{% assign selected_values = product.metafields.accentuate.selection | split: '|' %}

{% for selected_value in selected_values %} 
  <p>{{ selected_value }}</p> 
{% endfor %}
```


# Tags

Tags behave similarly to Selection types (see separate article) with the only difference being that you define the values for every instance of your Shopify object as opposed to the selection lists' predefined options.

A tag field, where you have entered only a single value, is represented as a Metafield with its string value matching your input, and as with selections, if you have entered multiple values, each value is listed with the "pipe" symbol ("|") as a separator token.


# Number

All ACF custom fields are stored as strings - even numeric types like Number to allow for decimal points. \
\
Liquid handles this quite nicely with one exception: you cannot do a direct comparison between a number and a string\
\
So while this is possible:

```html
<p>We have {{ product.metafields.accentuate.stock | plus: 100 }} in stock</p>
```

You need to convert it to a number if you want to do a numeric comparison with the field's value beforehand, like this:

```liquid
{% assign in_stock = product.metafields.accentuate.stock | plus: 0 %} 

{% if in_stock < 5 %}
  <p>Product is low on stock</p>
{% endif %}
```

{% hint style="info" %}
the " | plus: 0 " converts the string into a number type in Liquid
{% endhint %}


# Date

A custom field of type Date can be subject to date filters in Liquid:

```liquid
{{ product.metafields.accentuate.published_date | date: "%a, %b %d, %y" }}
```

To ensure that Liquid's date filters work as expected, consider using a universal, numbered format like 2019-09-14 for your custom field values.\
\
More info on that subject can be found in this article:

{% embed url="<https://www.shopify.com/partners/blog/liquid-date-format>" %}


# Color

A Color type gives you a convenient control to select a color and store the result as a string in hex RGB format such as #000000, #e9e9e9, #ffffff etc. \
\
Example use:

```html
<button style="background-color: {{ product.metafields.accentuate.background_color }}">Click</button>
```

Note that you can use Liquid color filters to change or extract properties from these color strings:

{% embed url="<https://shopify.dev/docs/themes/liquid/reference/filters/color-filters>" %}


# Media v1 (legacy)

When defining fields of the 'Media (legacy)' type, you are able to upload files of different media types. Each field is defined together with a set of allowed file extensions, so you can control the type of file uploaded via the editor.\
\
Uploaded media are automatically uploaded to a secure Google Cloud Platform bucket and the corresponding URL pointing to the file is stored in the Metafield, ready to use:

```html
<img src="{{ product.metafields.accentuate.extra_image }}"/>
```

The URL in the Metafield will have the form:

```html
https://cdn.accentuate.io/12345678/12345678/filename-v12345678.ext
```

Where '12345678/12345678' is a set of internal Shopify IDs designating which Shopify resources it belongs to and 'v12345678' is a random version number assigned by ACF to the uploaded filename to keep it unique and ensure any new files will reach your visitors' browser.\
\
Where possible, the uploaded media's **original** dimensions in "width x height" format are appended as a query string to the URL stored in the Metafield. \
\
If you need to extract the dimensions in Liquid for layout purposes, you can split the URL by the '?' sign and the 'x' separating the dimensions. Example URL:

```
https://cdn.accentuate.io/12345678/12345678/filename-v12345678.ext?100x300
```

{% hint style="info" %}
ACF currently has a limit of \~50MB per media upload. You will typically only reach this limit when uploading video files. Take care not to force your visitors to download assets of this size but consider using a streaming service for large video files (like YouTube)
{% endhint %}

Media uploads are served directly via world-class software services with very low network latency. ACF also employs performance optimization techniques similar to Shopify when fetching images via [cdn.accentuate.io](https://cdn.accentuate.io), including transforming images to WEBP format for supporting browsers (WEBP is only served if the resulting image is in fact smaller than the original image after optimisation)

While the performance of our media delivery has been optimized on a general level, you should still consider [further optimizations](https://blog.cloudflare.com/optimizing-images/).


# Media v2

Media v2 fields offer the upload of multiple media in a single field, which can be arranged in order and more easily managed in the editor. Each media also offers properties for easy access to structured information about media type, image dimensions, aspect ratio, ALT text, etc.

{% hint style="success" %}
This is the recommended way to create fields for uploading images, videos or other types of media.
{% endhint %}

![](/files/HwHd0OGXgZdL63rlcIdw)

Media v2 fields support a variety of file types such as:

* JPG/JPEG, PNG, ICO, TIF, WEBP, GIF and SVG images
* PDF, CSV, TXT, ZIP and JSON files
* AI, PS and EPS (Postscript) files
* MP3, MP4, WEBM and MOV (Quicktime) files
* GLB files (3D images used in Shopify)
* Font files (WOFF, WOFF2, TTF and OTF)

When defining fields, you determine the set of allowed filetypes to be uploaded via the editor.

{% hint style="success" %}
If you need a media type not currently available, get in touch and we'll add it for you.
{% endhint %}

Uploaded media are automatically stored in our highly secure cloud bucket (with full redundancy and daily backup). The corresponding link to the file is stored in the Metafield, ready to use in Liquid.\
\
Part of the field definition is whether or not the field supports the upload of multiple media to the same field. If multiple media are allowed, you can upload more than one media in the same field.

### Media properties

The media information is stored as JSON objects with the following properties:

> id

*For internal ACF use only.* This uniquely identifies the individual media.

> scope

*For internal ACF use only*. This is the scope for which the media is uploaded (e.g. a product id when uploaded for a product)

> key

*For internal ACF use only*. This is the uploaded media's filename appended to a combination of the scope and the media's id (e.g. which field in which product;

> src

The URL points to the uploaded media.\
\
Use this as the value for referring to the media source over HTTPS e.g. in the "src" attribute in image tags etc. You can optionally append transformation options to this URL for resizing and cropping - please see [Resize & crop images](/liquid-guides/resize-and-crop-images)

> original\_src

This is basically the same as src, but the domain is here **original.accentuate.io** rather than **cdn.accentuate.io**, which provides access to your original (and unoptimized, see below) media. This should normally not be used for other purposes than redownloading the original media, since performance will not be as good as its src counterpart.

> cloudinary\_src

A special URL for ease of use of our previous integration with Cloudinary for resizing, cropping, etc. of images. This property will continue to be available and in working condition but we do offer new resizing options - see the .src property above.

> filename

The name of the media, when it was uploaded to ACF (including the extension, but excluding any folders)

> handle

The media's handle is a string version of the media's id. This is used when doing lookups using a Media Reference field

> mime\_type

The mime type of the uploaded media, identifying exactly which type of media is contained in the file. Example: "image/jpg", "video/mp4" etc.

> media\_type

Contains the general type of the media such as "image", "video", "audio", "pdf" etc.

> media\_inline

Contains the actual file content of an uploaded SVG file, if the option to store it inline was enabled at the time of upload.

> alt

For media of media\_type "image", an ALT text can be provided in the ACF editor and is made available via this property.

> width

The width of the image in pixels.&#x20;

> height

The height of the image in pixels.

> aspect\_ratio

The aspect ratio ( width / height ) of the image, which tells the orientation of the image:

* less than 1.0 is a **portrait** image
* exactly 1.0 is a **square** image
* greater than 1.0 is a **landscape** image

### Examples&#x20;

{% hint style="info" %}
The underlying Metafield value will always be an **iterable array**. If just a single media is uploaded, the array will only have one entry. This allows for consistent use of [Liquid's array filters](https://shopify.dev/docs/liquid/reference/filters/array-filters) such as first, last, sort, where, etc no matter how many media are uploaded.&#x20;
{% endhint %}

{% hint style="info" %}
If you define a Media v2 field as repeatable, you will essentially get an array of arrays in the underlying Metafield value
{% endhint %}

*Basic list of all uploaded images:*

```liquid
{% for image in product.metafields.accentuate.multi_images %}
  <img src="{{ image.src }}" alt="{{ image.alt }}"/>
{% endfor %}
```

*Basic list of all uploaded images in a **repeatable** media v2 field:*

```liquid
{% for multi_images in product.metafields.accentuate.repeatable_multi_images %} 
  {% for image in multi_images %} 
    <img src="{{ image.src }}" alt="{{ image.alt }}"/>
  {% endfor %}
{% endfor %}
```

*Resizing the first image to 200 pixels wide, keeping the aspect ratio:*

```liquid
{% assign img = product.metafields.accentuate.multi_images | first %} 
<img src="{{ img.src | append: '&transform=resize=200' }}" alt="{{ img.alt }}"/>
```

*Filtering uploaded medias by media type:*

```liquid
{% assign doc_files = product.metafields.accentuate.doc_files | where: 'media_type', 'pdf' %}
{% for pdf in doc_files %} 
    <a href="{{ pdf.src }}">{{ pdf.filename }}</a> 
{% endfor %}
```

**Note:** Media are served directly via world-class software services with very low network latency. ACF also employs performance optimization techniques similar to Shopify when fetching images via cdn.accentuate.io, including transforming images to WEBP format for supporting browsers.\
\
While the performance of ACF's media delivery has been optimized for a balance of speed and quality, you should still consider [further optimizations](https://blog.cloudflare.com/optimizing-images/).[<br>](https://github.com/aFarkas/lazysizes)\
ACF currently has a limit of \~50MB per single media upload. You will typically only reach this limit when uploading video files. Take care not to force your visitors to download assets of this size but consider using a streaming service for large video files (like YouTube, Vimeo, etc.)


# Custom Object (JSON)

Defining a field as a Custom object allows you to enter field values as raw JSON.\
\
As long as you adhere to valid JSON syntax, you are free to define anything you like in your very own structure.\
\
If you have a JSON field with this content:

```json
{
  "make": "Audi",
  "model": "RS6" 
}
```

you can use it directly in Liquid:

```liquid
{% assign car = product.metafields.accentuate.specs %}

<p>My car is the brand new {{ car.make }} {{ car.model }}</p>
```

If you need the custom field as a client-side Javascript variable, you can use the JSON filter:

```javascript
<script>
  let car = {{ product.metafields.accentuate.specs | json }}
  alert('My car is the brand new ' + car.make + ' ' + car.model);
</script>
```

### Restrictions&#x20;

JSON objects can be as simple or as complex as you need **but** if you need to create an array of JSON objects, either use repeatable fields (see separate article) or define the array as a property within the JSON object.\
\
An **outer-most array is reserved** for ACF's handling of repeatable JSON fields.\
\
So while this works well:

```json
{
  "colors": ["Red", "Blue", "Green"]
}
```

this will cause ACF to split the values after you save them

```liquid
["Red", "Blue", "Green"]
```


# Multi-language Text

Three different field types are available as multi-language types:

* Text
* Markdown text
* HTML

Each of these behave as described for their "single language" counterparts (Text, Markdown, and HTML) but with an important difference as outlined here.\
\
All content for the custom field (i.e. across languages) is stored in the **same** Metafield, so it is important in Liquid to specify which language you need. If you omit this, all languages will be shown\
\
This example grabs the English (ISO code 'en') title from a custom field called "title":

```liquid
{{ product.metafields.accentuate.title.en }}
```

### Matching a language to the visitor's preference

But if we always wanted to show the title in English, there would be no need for multiple languages. \
\
We can match the custom field output to any Shopify-translated content by using the language noted in the URL via shop.locale. \
\
For example, if you have [myshopifystore.com/es/products/great-shirt](https://myshopifystore.com/es/products/great-shirt), you can grab the es language and use it as a key to access your custom field snippet:

```liquid
{{ product.metafields.accentuate.title[shop.locale] }}
```

We can also detect the visitor's browser language using a little [Shopify magic](https://shopify.dev/docs/liquid/reference/objects/request#request-locale) to show the "title" custom field in the language preferred by the visitor:

```
{% assign user_language = request.locale.iso_code %}
{{ product.metafields.accentuate.title[user_language] }}
```

### Showing a default value

The above examples will return an empty string if no content was provided for the visitor's language. To properly test if we have some content to show and revert to a safe default, we can apply the code below. \
\
This code also showcases that the configured locales (country names' ISO codes) are available in a special Metafield shop.metafields.acf\_settings.locales for precisely this purpose:

```liquid
{% assign default_language = shop.metafields.acf_settings.locales | first %}

{% if product.metafields.accentuate.title[shop.locale] %}
  <p>{{ product.metafields.accentuate.title[shop.locale] }}</p>
{% else %}
  <p>{{ product.metafields.accentuate.title[default_language] }}</p>
{% endif %}
```

### Multi-language Markdown example

In case you were wondering how multi-language Markdown fields work, here is an example (note the .html at the end to get the rendered HTML from the markdown code):

```liquid
<p>{{ product.metafields.accentuate.markdown_title[shop.locale].html }}</p>
```

### Setting up the languages

Before you can edit content for multi-language fields, you need to tell ACF which languages to handle content for and optionally provide a DeepL API key for built-in translation. \
\
So, from your admin side menu, click the "Settings" button to open the settings dialog and go to the "Languages" tab:

![](/files/BKqSV2KlS7pYIn629oQh)

In the selection box for "Multiple languages setup", select the languages you need to provide content for. You can select as few or as many languages as you need. Note that languages can be added or removed dynamically, so you don't need to know your complete setup before adding content for each language. If you need to add a language later after setting up content for other languages, you can just do so.&#x20;

{% hint style="warning" %}
Mind the ordering as this will be reflected in the editor. You can also use the ordering to provide a default language in case a visitor's language is not defined (see below)&#x20;
{% endhint %}

When you edit a multi-language custom field, the ACF editor will allow you to input content for each language selected in the above setup.  \
\
Here is an example of a multi-language text field called "Greetings", allowing input in all three defined languages:

![](/files/tAv9sLslGesMgwPmfv9U)

### Translating content to other languages

ACF supports in-app translation of content in multi-language fields via an integration with [DeepL](https://www.deepl.com/). DeepL combines deep learning and artificial intelligence to understand and translate text between these different languages:

* Bulgarian
* Czech
* Danish
* German
* Greek
* English
* Spanish
* Estonian
* Finnish
* French
* Hungarian
* Italian
* Japanese
* Lithuanian
* Latvian
* Dutch
* Polish
* Portuguese&#x20;
* Brazilian Portuguese
* Romanian
* Russian
* Slovak
* Slovenian
* Swedish

When you have multiple languages defined in ACF **and** your primary language is one of the above, ACF will allow you to translate content in a multi-language field **from** that primary language **to** any other language that is listed above.  \
\
For example, you have English listed as a primary language (the first one in the ordering) with German, French, and Finnish as secondary languages.

![](/files/VL0FPJbkMbdM0JMZ9vpM)

With DeepL enabled, ACF will now allow you to translate **from** English **to** both German, French, and Finnish.\
\
The translation service is available directly from each field. This is an example of a simple text field:&#x20;

![](/files/dLEOzjSMZvxtmHYIxhFb)

Example for HTML fields with translation available directly from the toolbar:

![](/files/OIDPe0Rm5ceR3P4aLwrV)

### How to enable DeepL

To use DeepL within ACF, you need a DeepL Pro API subscription. DeepL Pro is a 3rd party service with both a free and a paid option. [See details and sign up here](https://www.deepl.com/pro.html#developer). \
\
Once signed up, you can go to your DeepL account page and see your API key:

![](/files/0TjilD9R91F2MqXVKCU6)

Copy the API key using the copy button to the right of the key and from your Shopify admin, click the "Settings" button in the side menu to open the settings dialog, go to the "Languages" tab, and paste the key into the field for "DeepL API key":

![](/files/E4DAyqCyJwJ0svm4w0rA)

Click "Save" and you're ready to translate your texts in-house.

{% hint style="info" %}
**Disclaimer:** DeepL does not give any guarantee regarding the correctness of the translations created by the machine translation system. This is not meant to replace a professional translation service for mission-critical content.
{% endhint %}


# Reference fields

A reference type custom field is a specialized version of a 'Selection' type which will list all available objects of its type:

![](/files/OAbFwOGuqPBQvCYP4axO)

{% hint style="info" %}
The values shown specifically for **product** and **variant** selections can be customized to show additional information, making it easier to search and filter for the correct items.&#x20;

You can find the available options in your settings in the admin side menu
{% endhint %}

Once a value is selected, the Metafield will contain the referenced Shopify object's **handle** as its value (see special cases for file, resource, and variant reference fields below).\
\
You can use this handle as a reference to a Shopify object via a Liquid global object depending on the type.

```liquid
{{ blogs[product.metafields.accentuate.related_blog].title }}  
{{ articles[product.metafields.accentuate.related_article].title }}  
{{ pages[product.metafields.accentuate.related_page].title }}  
{{ collections[product.metafields.accentuate.related_collection].title }}  
{{ all_products[product.metafields.accentuate.related_product].title }}  
{{ linklists[product.metafields.accentuate.related_linklist].links }}
```

The above examples use [Shopify Global Objects](https://help.shopify.com/en/themes/liquid/objects#global-objects)

{% hint style="info" %}
Shopify global objects only return values for published products, collections, pages, etc. Be sure to check if the returned object is valid in case the reference suddenly points to a deleted or archived object.
{% endhint %}

{% hint style="info" %}
Shopify imposes a **restriction** on how many calls to "all\_products" you can make from a single Liquid page. This is currently set to **20 unique handles per page**
{% endhint %}

Using reference types, we can also get the Metafields from the referenced objects using the handle. This is just as easy as getting the URL or title as shown above.

```liquid
{{ all_products[product.metafields.accentuate.related_product].metafields.accentuate.isbn }}
```

### Multiple selections

As is the case for the basic type 'Selection', if you have opted for multiple selections for your reference type, each object's handle is listed with the "pipe" symbol ("|") as a separator token. \
\
You can use Liquid's 'split' filter on the Metafield to separate the handles - like this:

```liquid
{% assign selected_handles = product.metafields.accentuate.selection | split: '|' %}
{% for selected_handle in selected_handles %}
  <p><a href="{{ all_products[selected_handle].url }}">{{ all_products[selected_handle].title }}</a></p>
{% endfor %}
```

### Variant reference fields

In Shopify, individual product variants don't have handles, so we need to rely on the product's handle combined with the id of the referenced variant.\
\
Therefore variant references are stored as *product\_handle:variant\_id* for easy access to both the product object and the underlying variant, like this:

```liquid
{% assign product_handle = product.metafields.accentuate.referenced_variant | split: ':' | first %}
{% assign variant_id = product.metafields.accentuate.referenced_variant | split: ':' | last | plus: 0 %}

{% assign referenced_product = all_products[product_handle] %}
{% assign referenced_variant = referenced_product.variants | where: "id", variant_id | first %}

<p>The referenced variant is {{ referenced_product.title }} {{ referenced_variant.title }}</p>
```

Note the use of the Liquid filter "plus: 0" which converts a string to a number for use in the "where" filter.

{% hint style="warning" %}
Variant references cannot successfully be transferred to other stores due to the use of internal Shopify ids, which will vary across stores. Shopify does not offer a way to uniquely identify a specific product variant across store boundaries
{% endhint %}

### File reference fields

Using a File reference field, you can reference a file or an image uploaded to Shopify (under Settings > Files)\
\
A file reference is stored as the *filename*, so you can get a fully qualified URL pointing to the file within Shopify's CDN using the [Liquid filters *file\_url* or *file\_img\_url*:](https://shopify.dev/api/liquid/filters/url-filters#file_url)

```liquid
{% assign url = product.metafields.accentuate.referenced_file | file_url %}
<a href="{{ url }}">Click to download</a>
```

Also, the filename (of an image) can be used as a lookup value to the *images* global object in Liquid to get an [image object](https://shopify.dev/api/liquid/objects/image) of the file:

```liquid
{{ assign image = images[product.metafields.accentuate.referenced_file] }}
```

### Resource reference fields

Using a Resource reference field, you can reference any of the following Shopify objects: collections, products, pages, blogs, or articles.\
\
A resource reference is stored as a **partial URL** to the selected resource - like **/products/example** or **/pages/contact**, so you may redirect your visitor to the relevant page using links, buttons, etc.:

```liquid
{% assign url = product.metafields.accentuate.referenced_resource %}
<a href="{{ url }}">Please see here</a>
```

### Media reference fields

Media references don't contain references to Shopify objects such as products and collections. Instead, they contain internal references to ACF Media v2 type field values defined under either the "shop" or "globals" scope. \
\
Defining a media reference field allows you to reference a globally defined media from any scope like a specific product or collection. If, for example, you have a collection of vendor logos, icons or author avatars and would like to associate these with specific products or articles, you can define a Media v2 field under the "shop" or "globals" scope and use a media reference field to point to any of the uploaded media, allowing for a single point of maintenance of the media itself. \
\
The media reference field itself will contain the referenced media's handle and you can do a lookup in Liquid like this:

```liquid
{% assign referenced_media = shop.metafields.globals.vendor_logos | where: "handle", product.metafields.accentuate.vendor_logo_ref | first %}
<img src="{{ referenced_media.src }}" alt="{{ referenced_media.alt }}"/>
```

Or, if you have multiple media references selected:

```liquid
{% assign selected_handles = product.metafields.accentuate.vendor_logo_ref | split: '|' %}
{% for selected_handle in selected_handles %}
  {% assign referenced_media = shop.metafields.globals.vendor_logos | where: "handle", selected_handle | first %}
  <img src="{{ referenced_media.src }}" alt="{{ referenced_media.alt }}"/>
{% endfor %}
```

{% hint style="info" %}
Note the use of the Liquid filter "first" to pull the first element from the resulting array.
{% endhint %}

{% hint style="info" %}
When updating a media being referenced by one or more media reference fields, you must ensure that the references stay valid by doing a "replace" operation rather than deleting and reloading the media (which will break the reference). This is available as an option button when hovering over the media:
{% endhint %}

\
*When updating a media referenced by one or more media reference fields, you must ensure that the references stay valid by doing a "replace" operation rather than deleting and reloading the media (which will break the reference). This is available as an option button when hovering over the media:*

![](/files/jRHaOi8TN04ubelcypKg)


# References to Global fields

Global fields references in ACF are meant as puzzle pieces for building your field definitions for a specific scope, making it easy to reference content that would otherwise be replicated across many products or collections, etc.\
\
For example. you have a set of features with an icon and a description common to your products defined as Global fields:

![](/files/wnU99mkGXwsZwZJdk6gO)

You can then use a global reference field to point to the section or any of the fields (and even specific occurrences within both), allowing for a single point of maintenance of the underlying data. So if a feature icon or description changes, you just update the global field and the change will be reflected on all your products instantly.

![](/files/PRS5FpTq3qOJCSnA94bA)

{% hint style="info" %}
**Tip:** If a repeatable section contains a field of type Text, the content of the first in the sequence will be included after each occurrence's index number ("Organic" and "Vegan" in the example) for easier selection of the correct occurrence
{% endhint %}

### What is stored in the reference field?

The underlying Metafield value when selecting global fields will always be a JSON object with a single  *.references* property containing an iterable array of JSON objects with either a *.field* or a *.section* property (depending on what is being referenced) and optionally either an *.index* or *.key* property.\
\
The *.key* property is only used for **repeatable section** references and **only** when the global section being referenced has its "Use sticky references" setting enabled (see below).  \
\
If just a single field or section is selected, the array will have just one entry. This allows for consistent use of Liquid's array filters such as first, last, where, etc.\
\
Example structure:

```json
{ references: [
    { field: "field_name",
      section: "section_name",
      index: <number>,
      key: "internal_random_key"
    }]
}
```

You can query the  *.references* array for either the *.field* or *.section* property being present to detect what is being referenced as well as the *.index* property to detect if a specific occurrence is being referenced.

### Resolving field references

When one or more fields are being referenced, each field reference (an element in the *.references* array) will contain the field's name in the *.field* property and you can resolve the reference in Liquid like this:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_global_field = shop.metafields.globals[reference_to.field] %}

<p>{{ referenced_global_field }}</p>
```

Or, if you have selected multiple fields references:

```liquid
{% assign references_to = product.metafields.accentuate.features.references %}
{% for reference_to in references_to %}
  {% assign referenced_global_field = shop.metafields.globals[reference_to.field] %}
  <p>{{ referenced_global_field }}</p>
{% endfor %}
```

If you are referencing repeatable fields, please see the related article "Repeatable fields" for instructions about how to loop over these&#x20;

### Resolving field references with indexes&#x20;

A global reference may point to specific occurrences of repeatable fields. When this is the case, the referenced index is stored in the *.index* property.\
\
This example covers a single field reference to a specific occurrence:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_global_field = shop.metafields.globals[reference_to.field][reference_to.index] %}
<p>{{ referenced_global_field }}</p>
```

### Detecting the referenced field type

If you need to check which type of field is being referenced, you can cross-reference the  *.field* selection against the field definitions for the global scope, like this:

```liquid
{% assign reference_to_type = shop.metafields.acf_settings.global.fields | where: "name", reference_to.field | map: "type" | first %}

<p>The type of field being referenced is '{{ reference_to_type }}'</p>
```

### Resolving section references

If the global reference field is referencing a *.section*, you can go via the field definitions to find the section's fields (see related article below), like this:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_fields = shop.metafields.acf_settings.global.fields | where: "section_name", reference_to.section %}

{% for referenced_field in referenced_fields %}
  {% assign referenced_global_field = shop.metafields.globals[referenced_field.name] %}
  <p>{{ referenced_field.label }}: {{ referenced_global_field }}</p> 
{% endfor %}
```

If you are referencing a repeatable section, please see the related article "Repeatable fields" for instructions about how to loop over these<br>

### Resolving section references with indexes (i.e. the non-sticky way)

Reference fields may point to specific occurrences of repeatable sections. When this is the case, the referenced index is stored in the *.index* property and is valid for accessing the relevant part of the section's fields.\
\
This example covers a single reference to a section's specific occurrence (like "Features #1" in the above selection) which then is resolved to the contained fields dynamically:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign referenced_fields = shop.metafields.acf_settings.global.fields | where: "section_name", reference_to.section %}

{% for referenced_field in referenced_fields %}
  {% assign referenced_global_field = shop.metafields.globals[referenced_field.name][reference_to.index] %}
  <p>{{ referenced_global_field }}</p> 
{% endfor %}
```

Usually, though, you'll be selecting specific sections and just want to use the index of the section being referenced (like "Features #1" and "Features #2" in the above selection), so you can loop the reference field selections and code the fields directly in Liquid using the index property:

```liquid
{% assign references_to = product.metafields.accentuate.features.references %}
{% for reference_to in references_to %}

  <p>{{ shop.metafields.globals.feature_title[reference_to.index] }}</p> 
  <p>{{ shop.metafields.globals.feature_description[reference_to.index] }}</p> 

{% endfor %}
```

### Resolving section references with keys (i.e. the sticky way)

Same as above, reference fields may point to specific occurrences of repeatable sections but can optionally store a "sticky" reference to the selected occurrences' index.\
\
This happens automatically when the global section being referenced has its "Use sticky references" setting enabled. \
\
When this is the case, the referenced "index" is stored indirectly in the *.key* property and the correct index can then be determined dynamically in Liquid.&#x20;

{% hint style="info" %}
This is the recommended way to use section references because it ensures that the references are always up to date even if the occurrences within the global section are rearranged **after** selections have been stored in the reference field.
{% endhint %}

This example covers a single reference to a section's specific occurrence (like "Features #1" in the above selection) via a key. The actual occurrence index is then resolved in Liquid via the '**assign index =**' statement:

```liquid
{% assign reference_to = product.metafields.accentuate.features.references | first %}
{% assign index = shop.metafields.globals[reference_to.section] | where: "key", reference_to.key | map: 'index' | first %} 
  
<p>{{ shop.metafields.globals.feature_title[index] }}  
</p> 
<p>{{ shop.metafields.globals.feature_description[index] }}</p> 
```

{% hint style="info" %}
If you get lost in field references and resolving to global fields, try outputting the involved fields using Liquid's *json* filter. This will often reveal any issues
{% endhint %}


# Sections

### **Sections**

Sections are used for two purposes:

1. To visually and logically group fields in the editor and to control the section's fields when the section is defined as [repeatable](/the-editor/repeatable-fields)
2. To group fields for the purpose of creating a [custom layout](/the-editor/layouts) per individual object (e.g. a page or a product)

{% hint style="info" %}
Sections are not custom fields (Metafields) in their own right but rather control elements for the value and layout editor, respectively. If you need to loop over the contained fields, please see [this article](/liquid-guides/access-field-definitions).
{% endhint %}

### Adding a new section

To add a new section you can click on the **Add section here** on a field definition to add a section below the field. If you do not have any fields for the scope, the **Add section** button will also be available in the top menu bar.

![](/files/Lg0w0ezLG2HAZoqlTyKH)

{% hint style="info" %}
You can prefix a section's title with a "-" (dash) if you need the section to appear visually as a "sub-section" of another section in the editor
{% endhint %}


# Deciding on a field type

In some scenarios, it can be difficult to figure out which field type to use or for which scope to have the field in to be able to achieve the feature in mind. While there is not always a correct answer, some general principles may guide you in the right direction for your scenarios

It can be very beneficial for you to make these considerations from the get-go in order to make it easier for you to manage down the road, not having to change your setup later on.

If you have any doubts about how you should set up your intended use case, get in touch with us and we will be happy to assist you.

{% hint style="info" %}
When adding a new field, ACF may restrict its field type to a specific selection. If you have a Shopify Metafield definition in place for the chosen name and namespace combination, this definition will determine your field's type for you, so the Shopify and ACF field definitions are aligned (as they should be).
{% endhint %}

### Choosing the right scope

First off, consider the data - would the same values reoccur across multiple objects? If so, utilizing one of the aggregate scopes may save you a lot of time and effort by allowing for one point of management of the data.

You can read more about the various scopes [here](/introduction/field-scopes).

### Multiple selections or repeatable?

While the two settings can from time to time achieve the same result, it is also relevant to consider when it is right to use one over the other.

Enabling multiple selections for a field is recommended if you need multiple values for just one field. If you have a group of fields that you need multiple values for, making the overall section of the fields repeatable would be the recommended way to go.

In general, we recommend not enabling any settings you won't need. It is much better to keep it simple and build your setup bit by bit once the needs present themselves.


# Automatic tagging

ACF supports automatic tagging (and untagging) for products, articles, customers, and orders when entering or importing values for these object types (including product variants).\
\
Automatic tagging of e.g. products will allow you to filter collections by custom field values on your storefront using either [Automated Collections](https://help.shopify.com/en/manual/products/collections/automated-collections/auto-create) or [Shopify's built-in tag filtering<br>](https://shopify.dev/themes/navigation-search/filtering/tag-filtering)\
You can enable this in the field definition for the following field types&#x20;

* Text fields &#x20;
* Checkboxes&#x20;
* Tags&#x20;
* Selections&#x20;
* Number fields&#x20;
* Number ranges&#x20;
* Colors&#x20;
* Reference fields

\
Tags are applied in the form of the field's label (e.g. "Brand") followed by either a "pipe" symbol ("|"), an underscore ("\_") or a colon (":") and the value of the field.

{% hint style="info" %}
*To use underscores ("\_") or colons (":") for the split character in the automatically applied tags, select this under "Settings" from the ACF's main dashboard*
{% endhint %}

{% hint style="info" %}
A tag in Shopify (here: label and value combined) cannot be longer than 40 characters
{% endhint %}

For fields that can hold multiple values, like repeatable fields or fields that allow for multiple selections, multiple tags may be created and applied to the product as a result of the automatic tagging.\
\
Tags for checked checkboxes, where the value resolves to "true", only hold the field's label e.g. "New look", "Backordered" etc.\
\
Tags for reference fields will contain the referenced object's handle\
\
Automatic tagging occurs whenever you **change** a value using the editor. This also means that if you enable automatic tagging on a custom field, the tags won't be updated unless you save the custom field with a changed value. \
\
To fix tags for existing values, export the objects and import the exported file unchanged. This will synchronize the tags with the existing values. ACF also offers an API endpoint to trigger the automatic tagging process

### Example

You have a selection list of brands as a product custom field with available options like "Hugo Boss", "Tommy Hilfiger", "SuperDry" etc. with automatic tagging enabled.\
\
You then select one of these brands in the dropdown for a given product (or variant) and the constructed value "Brand|Hugo Boss" is applied as a tag to the product (or variant's product) when the custom fields are saved. If you later select another brand, the old tag is removed, and a new one is applied.\
\
Tags can then be used for collection filtering in Shopify when you 'handleize' the value, so this URL will filter a collection for Hugo Boss branded products:\
\
<https://my-store.myshopify.com/collections/all-brands/**brand-hugo-boss>\*\*


# Large sets

Repeatable fields in ACF are stored as data arrays in Metafields of type  "json\_string" which in Shopify has a storage limit of 100,000 characters.\
\
This limit may prove a challenge when working with large sets of repeatable fields, especially of types Media v2 or HTML in excess of 100-150 occurrences (sometimes fewer when working with large blocks of HTML).\
\
ACF is able to work around this limitation by distributing your content across multiple individual Metafields. This is something you need to enable on a per-field basis (due to the theme handling being different - see below) but is otherwise handled internally to give you a seamless experience when working in the ACF editor or with exports/imports.

![](/files/4890izuO2H4sqLnpq2Dr)

The "automatically handle large sets of repeatable values" setting is available for all field types that can be defined as repeatable (with the exception of Shopify » ... types, see below) and for all scopes except for product types, vendors, and locations.\
\
With "large sets" enabled the storage limit is now 1,000,000 characters, which allows you to work with sets in excess of 1,000 elements.

{% hint style="info" %}
Note that each individual occurrence (e.g a block of HTML) still needs to fit inside 100,000 characters Metafield and - in case of 10+ occurrences - this space is shared with other occurrences\
\
A rough calculation of the size limit per occurrence (for reasonably like-sized blocks) is 100,000 / ceil(#occurrences / 10)
{% endhint %}

{% hint style="warning" %}
Large sets are not available for Shopify » ... types
{% endhint %}

### Required theme changes

So why is this just not enabled by default? The reasoning here is that enabling the setting requires a subtle change to your theme since the original Metafield no longer contains the actual data items but rather is a "reference object" with references to the actual data Metafields.

#### Example code - looping HTML blocks

This code example shows you how to loop a repeatable HTML field with "large sets" enabled:

```liquid
{% for html in shop.metafields.globals.very_large_description %}
  {{ shop.metafields.globals[html.metafield][html.index] }}
{% endfor %}
```

Please note that the code doesn't just render the "html" loop variable as we would for a traditional repeatable field but uses it as a reference to get to the actual Metafield used to store the data for that specific entry.\
\
*shop.metafields.globals* should be replaced with whatever scope and namespace your field is defined under, for example, *product.metafields.accentuate*.

#### Example code - looping Media v2 fields

This code example shows you how to loop a repeatable Media v2 field with "large sets" enabled:

```liquid
{% for media in shop.metafields.globals.very_large_media_set %}
  {% assign single_media = shop.metafields.globals[media.metafield][media.index] | first %}
  <img src="{{ single_media.src }}" alt="{{ single_media.alt }}"/>
{% endfor %}
```


# Field contexts

When you have custom fields defined for a scope (e.g. the product scope), those fields don't necessarily all apply to every product in your store. \
\
Products of a certain type may need certain fields while it's irrelevant to others\
\
To this end, ACF offers an "Applies to" setting in the field definition dialog:

![](/files/mcMt0pjkXukEs2QnbiA8)

Both sections and individual fields can have applies-to settings. If a section has an applies-to setting, this setting will be inherited by all the section's fields. Otherwise, each individual field can have an applies-to setting on its own.

{% hint style="info" %}
The selection values in the dropdown depend on the scope, you are defining fields for
{% endhint %}

You can select multiple values to filter the section or fields by. If an object fits at least one of the "Applies to" conditions, it will be shown in the editor.

![](/files/DrLXcH5wtIFS4MY9vrqv)

A variation on field contexts is that you can edit fields for selected sections only.\
\
Using the dropdown option of the "Edit values" button, you can select which section to edit:

![](/files/hppDrfuInL03RYs4gqfU)

{% hint style="info" %}
An "Edit by section" selection will still respect any "Applies to" conditions
{% endhint %}


# Field context filters

When using the field contexts (a.k.a. the "Applies to" setting in the field definition dialog) to target fields or groups of fields to certain contexts, you can filter the field definitions shown in the list.\
\
Click the "Filter" button to show a list of the currently used contexts:

![](/files/iiOv8DDPFSMCfNSHVcLk)

{% hint style="info" %}
*The Filter button only shows when the list of currently used contexts is not empty*
{% endhint %}

Once a context is selected, only field definitions that apply to that selection are shown. Field definitions that don't apply to the selected context are shown as outlines, so you are able to drag and drop the shown fields to a new location.\
\
Click the filter button to remove the current filter and show all fields again.

![](/files/guYrfcpdyPpFKk52EBeU)


# Copy and paste fields

To copy/paste an individual field, click the “Copy” button shown to the right of the field definition. Then, when pasting the copied field, edit the properties for the new field if needed and repeat the procedure for any additional fields.\
\
To copy **all** fields for an object scope in bulk, use the "Copy all" menu item above the fields and paste them using the "Paste" menu item.

{% hint style="info" %}
You can paste copied field definitions to another object scope (e.g. from a product to a collection) inside the same shop or even to another shop
{% endhint %}

When pasting multiple fields, any existing fields with the same namespace and key combination will **not** be replaced.


# Change field name and type

This article serves to communicate the risks involved in changing a field's name, namespace and/or data type. It's important to note that ACF won't stop you from carrying out the changes, since the rationale for doing it can vary greatly.\
\
Normally, ACF will show these field properties as read-only for already created fields, but it's possible to edit these fields by clicking the small "lock" icon in the lower-left corner of the dialog:

![](/files/OjD98g44JRlba6bzW5rp)

The reason behind making this just a tiny bit difficult is that changing an existing field's definition of name and/or namespace may cause loss of access to any already defined values for that particular scope that use the current name and namespace combination.

Or, maybe worse, you may point your new name/namespace combination to some already defined fields (by other apps, maybe) with incompatible values.

{% hint style="danger" %}
*Changing a field's data type may cause undesired effects, if the field's existing data is not compatible with the new type **and** may require changes to your theme.* \
\
*Please only change a field's type when you know what you are doing and always consult the below table for any issues that may arise. This may not be an exhaustive list of issues that may arise from changing a field's type, so make sure you are planning a change carefully.*
{% endhint %}

A change of a field's type is always possible when there are no existing values tied to the definition (no values entered for a product, a page, etc).\
\
However, when existing values are already in place, care must be taken before carrying out a change. Please see the below table for how field types can be changed. \
\
Also note that while something is possible from a technical standpoint, it doesn't mean it's a good idea. But ultimately, this is for you to decide.

### Field type change overview

**Text** - can be changed to any of the following:

* HTML
* Checkbox
* Selection
* Tags
* Number
* Color
* Multi-language Text
* Multi-language HTML

{% hint style="info" %}
If a Text field is changed to a Checkbox, any existing value will cause the checkbox to become checked
{% endhint %}

{% hint style="info" %}
*To change to a Multi-language field type, get in touch with support beforehand*
{% endhint %}

&#x20; **Markdown** - can be changed to:

* JSON&#x20;

**Checkbox** - can be changed to any of the following:

* Text
* HTML
* Selection
* Tags&#x20;

{% hint style="info" %}
If changed to a Selection, be sure to include the value "true" in the list of options
{% endhint %}

**Selection** - can be changed to any of the following:&#x20;

* Text
* HTML
* Markdown
* Tags
* Number

{% hint style="info" %}
Only change to a Number if existing selections are single-selection numbers
{% endhint %}

**Tags** - can be changed to any of the following:&#x20;

* Text
* HTML
* Markdown
* Selection

**Number** - can be changed to any of the following:&#x20;

* Text
* HTML
* Markdown
* Selection
* Tags&#x20;

**Color** - can be changed to any of the following:&#x20;

* Text
* HTML
* Markdown
* Selection
* Tags&#x20;

**Multi-language Text** - can be changed to any of the following:

* JSON
* Multi-language HTML
* Multi-language Markdown&#x20;

**Multi-language Markdown** - can be changed to:&#x20;

* JSON&#x20;

**Multi-language HTML** - can be changed to:&#x20;

* JSON&#x20;

**Reference to ...** - can be changed to any of the following:&#x20;

* Text
* Tags


# Import existing fields

Just as well as ACF lets you define fields in discrete namespaces to keep it from updating Metafields from other apps, you can also use it to handle Metafields defined by other apps.\
\
ACF features an easy-to-use wizard to find existing Metafields created by other apps and will automatically reuse any existing values once a definition is in place.\
\
From within the field definition dialog for each scope, click the "Add field" button near the top:

![](/files/Kk0mLi0sl71yMVJXvZr4)

This will open the field definition wizard:

![](/files/JTk1LgHQSRTh3o5g3Qbc)

Click the "search" icon to the right of the "Name" field to open an additional wizard:

![](/files/WNb50qUr6uriskXpP11V)

Here you can select a single object (a product in this example) to inspect for existing Metafields not already defined in ACF. You can click on a "Name" field to return to the field definition dialog with that name and namespace filled in. Now you can add your preferred Label and in the next steps, select a type as well as other options offered by ACF.&#x20;

{% hint style="info" %}
*Be sure to select a type and configure it with the existing values in mind. You can never go wrong with a Text or HTML field but if in doubt about which field type you should select for a given set of existing fields, please get in touch for assistance*
{% endhint %}


# Linking multiple stores

When you have multiple related ACF installations, like multiple language shops, shops for different regions, or shops for different environments (test, staging, live), you can link your ACF installations together for easy management of custom field definitions.&#x20;

{% hint style="info" %}
This provides a way to easily sync custom field **definitions** across multiple stores but does not include any custom fields **data**. Once your field definitions are in sync, you can [export](/bulk-import-and-export/export-custom-field-values) your custom fields data from one store and [import](/bulk-import-and-export/import-custom-field-values) the files to your other stores&#x20;
{% endhint %}

Choose the store, you'd like to use as the "master store" and from that shop's admin side menu, click the "Settings" button to open the settings dialog and go to the "Stores" tab:

![](/files/ZT0liPJeZmQR7cfCJKR0)

In the "Linked stores" area, type one of your related stores' ".myshopify.com" domains (just type the part before .myshopify.com) and press Enter. \
\
For each linked store, you are required to input that store's API key to verify your access. You find your other store's API Key in the "Plan" tab, but of course from its own Settings dialog. When you enter the correct API key for the linked store, you'll see the domain shown in green like in the example above. Add more stores in the same manner.\
\
Then select your synchronization option.&#x20;

{% hint style="info" %}
While the "Complete" synchronization option is recommended, only select this, if you'd like field definitions to be mirrored 100% across your linked stores. The "Partial" option is safer (it won't delete field definitions), but may lead to duplicated section definitions, if these were set up manually prior to a sync (only applies to sections created before September 20, 2020)
{% endhint %}

Click **Save** and your linked stores will be ready for easy synchronisation of custom field definitions.

{% hint style="info" %}
You can mix and match the linking as you please, so for example store A links store B and vice versa or store A links store B + C and store B links store D. Plan this carefully to avoid confusion
{% endhint %}

### Syncing field definitions to linked stores

Field definitions can be manually synced to any or all of the linked stores. \
\
When you have set up linked stores, the Save button for field definitions will expand with a drop-down menu to the right, allowing you to choose additional targets for your Save operation:

![](/files/CXCa6XuZx7IpwIQX8uAv)

Each linked store can be selected individually or you can select to sync all linked stores in one go. If you opt for only saving changes to the current store, you can always come back and sync to the linked stores.

{% hint style="info" %}
No matter the chosen option, any changes will always be saved to the current store
{% endhint %}

{% hint style="danger" %}
**Warning:** depending on your synchronization settings, syncing field definitions is potentially a **complete** sync. Any fields already defined for the target store(s) and **not** mentioned in the set of fields being saved, will be **deleted**
{% endhint %}


# Using metafields as Admin Filters

When you define a Shopify-native Metafield in ACF you can choose to expose it as an **admin filter**. Enabling this option tells Shopify that the Metafield definition may be used to filter and search records directly inside the Shopify admin - for example, narrowing the product list to only the items that match a particular value.

This makes Metafields you manage in ACF behave like Shopify's built-in fields: once a definition is admin filterable, its values appear as a filter option in the relevant admin index page, so your team can locate records by the custom data you've added rather than by title or SKU alone.

The "Expose as admin filterable" setting is available for all Shopify-native field types, with the exception of Custom JSON. It is not available for Metaobject definitions or their fields.

> Admin filterable is a capability of the underlying Shopify Metafield definition. It only applies to definitions created in Shopify's native namespace — it does not affect how a field is displayed on your storefront or in the ACF editor.

> Custom JSON fields cannot be used as admin filters because Shopify does not support filtering on JSON values.

### Enabling Admin Filterable

The setting lives in the **Advanced options** section of the field definition. Tick **Expose as admin filterable** and save your changes for the capability to be added to the Shopify Metafield definition.

<figure><img src="/files/ePx6KvyxM9pnKqnLrcGa" alt=""><figcaption></figcaption></figure>

### When to Use It

Enable this option when you want merchandisers and store staff to filter admin lists by a custom attribute — for example, filtering products by "Material", "Season", or "Supplier" that you've modelled as ACF Metafields. Without it, those values are still stored and editable, but they won't appear as a filter in the admin.

> Changing the setting updates the Metafield definition in Shopify. Existing values are not modified; the capability simply becomes available (or unavailable) for filtering going forward.


# Using metafields as Smart Collection Conditions

Shopify's automated ("smart") collections build their product list automatically from a set of conditions instead of requiring you to add products one by one. When you define a Shopify-native Metafield in ACF you can choose to make it available as one of those conditions, so the custom data you manage in ACF can drive collection membership.

With this option enabled the Metafield definition is registered with Shopify as a smart collection condition. Merchants can then select it in the automated collection editor and build rules such as "include every product where this Metafield equals a given value", keeping collections up to date as your data changes.

The "Enable as smart collection condition" setting is only shown for the field types Shopify supports as collection conditions. It is not available for Metaobject definitions or their fields.

### Eligible Field Types

Shopify only allows certain Metafield types to be used as smart collection conditions. In ACF the option appears for:

* True/false (boolean)
* Integer
* Decimal
* Rating
* Single line text
* Metaobject reference
* List of metaobject references

> If your field is not one of the types above, the "Enable as smart collection condition" option will not appear. Eligibility is determined by the field type and follows Shopify's API contract.

> Smart collection conditions apply to product-scoped Metafields, which is where Shopify evaluates automated collection rules.

### Enabling the Condition

The setting lives in the **Advanced options** section of the field definition. Tick **Enable as smart collection condition** and save your changes for the capability to be added to the Shopify Metafield definition.

<figure><img src="/files/NrbqSFRH1xIykzCxrNlP" alt=""><figcaption></figcaption></figure>

Once enabled, open (or create) an automated collection in Shopify, choose your Metafield from the condition dropdown, and set the value to match. Products are added to the collection automatically whenever their Metafield value satisfies the rule.

> Changing the setting updates the Metafield definition in Shopify. Existing values are not modified; the capability simply becomes available (or unavailable) as a collection condition going forward.


# Using metafields in Shopify Analytics

{% hint style="info" %}
This article covers what "Use in Analytics" does, which fields qualify, and how to turn it on.
{% endhint %}

Shopify lets you query [metafields as dimensions, filters, and groupings in Shopify Analytics and ShopifyQL](https://help.shopify.com/en/manual/custom-data/metafields/analytics). Instead of jumping into the Shopify admin's metafield definition settings to turn this on, you can enable it directly from a field's settings in Accentuate.

### What "Use in Analytics" does

When you enable this option on a metafield definition, Shopify makes that field's values queryable inside **Analytics** and **ShopifyQL Notebooks** — for example, grouping order analytics by a custom "Season" field, or filtering a product report by a "Material" field. Accentuate doesn't store or process this data itself; turning the option on tells Shopify to index the metafield for its own analytics engine.

> **Note:** Querying the data (writing reports, building ShopifyQL notebooks) happens entirely inside Shopify's **Analytics** section of your admin. Accentuate's part is limited to enabling the capability on the field definition — see [Shopify's guide to using metafields in analytics](https://help.shopify.com/en/manual/custom-data/metafields/analytics) for how to build reports once a field is enabled.

### Before you start

Shopify only allows this capability on **native Shopify metafield definitions** — the checkbox won't be available otherwise. Check the following before you try to enable it:

1. **Resource type.** The metafield must belong to one of these owners:

   * Products
   * Product variants
   * Orders
   * Customers

   Fields on other resources (collections, pages, blogs, metaobjects, shop, etc.) aren't eligible.
2. **Field type.** The field must use one of Accentuate's **Shopify native types** (shown as `Shopify » …` in the field type picker), and it must be one of the following:

   * Single line text (and List)
   * Multi-line text (and List)
   * Integer (and List)
   * Decimal (and List)
   * True/false
   * Date (and List)
   * Date and time (and List)
   * URL (and List)
   * Color (and List)
   * Rating (and List)
   * Money
   * Product reference (and List)
   * Collection reference (and List)
   * Page reference (and List)
   * Metaobject reference (and List)

   Legacy ACF-only field types aren't eligible — switch the field to the matching Shopify native type first if you want to use it in Analytics.
3. **A native Shopify definition must already exist.** If you created the field without ticking **Create native shopify definition**, Accentuate has no matching Shopify metafield definition to enable the capability on. Tick that option (or create it retroactively from the field's settings) before continuing.

Shopify has the final say on eligibility — even when a field meets the criteria above, Shopify may report it as not eligible (for example, if analytics support hasn't rolled out to your plan or store yet). Accentuate always reflects whatever Shopify reports back.

### Enable analytics for a metafield

1. In your Shopify admin, go to **Apps > Accentuate**.
2. Open **Custom Fields**, then select the field definition you want to use in Analytics (or create a new one on a Product, Product variant, Order, or Customer).
3. Expand **Advanced options** on the field.
4. Check **Use in Analytics**.
   * If the checkbox is greyed out, hover over it — a short note explains why (unsupported field type, non-native field, missing native definition, or "not eligible" reported by Shopify).
5. Click **Save**.

Once saved, Accentuate sends the request to Shopify to enable the `analyticsQueryable` capability on that metafield definition.

### Checking the status

After saving, reopen the field's **Advanced options**:

* **No badge** — the capability is enabled and Shopify has confirmed it.
* **Pending activation** — Shopify is still finishing activation. This is normal and not an error; it can take a short while for Shopify to process the change. Check back later and the badge will clear once Shopify confirms it's active.

### Turning it off

Uncheck **Use in Analytics** on the field's **Advanced options** and save. This asks Shopify to stop indexing the field for Analytics and ShopifyQL — it doesn't delete the field, its native Shopify definition, or any of its values.

### Related articles

* [Field contexts](https://help.accentuate.io/field-definitions/field-contexts)
* [Field types](https://help.accentuate.io/field-definitions/field-types)
* [Using metafields as admin filters](https://help.accentuate.io/metafield-definitions/using-metafields-as-admin-filters)
* [Using metafields as smart collection conditions](https://help.accentuate.io/metafield-definitions/using-metafields-as-smart-collection-conditions)
* [Shopify: Use metafields and metaobjects in analytics](https://help.shopify.com/en/manual/custom-data/metafields/analytics)


# Using the editor

The ACF editor works the same across all object types and is laid out with an editing pane to the left containing custom fields and sections that apply to the current object being edited. \
\
The right column contains a navigation box for easy switching to another object within the current scope, as well as, other information related to the selected object. This includes the date & time of the last save and any promoted fields.  \
\
Here, you will also find the Save button (shortcut **Shift+Ctrl+S** or **Shift+Command+S** depending on your system) to save any changes and a Refresh button to reload information that might have changed outside of ACF, e.g. new products, collections, etc.  \
\
The below example shows a product being edited together with its variants.&#x20;

{% hint style="info" %}
If variant custom fields have been defined for a product, the editing pane will have multiple tabs with each of the product's variants in its own separate tab:
{% endhint %}

![](https://d2y5h3osumboay.cloudfront.net/qzy9rqszfyxrj6hko78ncehyw1th)

### Bulk Editor

With the exception of variants, ACF features a powerful bulk editor for custom fields for every object in your store. This allows you to edit custom fields for multiple objects at the same time. You can click the below button to launch the bulk editor:

![](https://cdn.circle.so/93ecr9skvz8sz2s1rigbriwggt5i)

For products, customers, and orders, you can launch the bulk editor from your Shopify admin by selecting one or more items, opening the options menu (**three dots**), and selecting Bulk Edit Custom Fields.

<figure><img src="/files/79MXUSdIiAreds4T1RiM" alt=""><figcaption></figcaption></figure>

\
The bulk editor works with a similar layout as the object editor, but with the added functionality that you now can select multiple objects (of the same type) and have each selected object appear in its own tab. Each tab will show the custom fields that belong to that particular object. Up to 50 objects can be selected at a time. \
\
You can add additional tabs to the bulk editor by using the selection box in the right column and click Add.  \
\
In this example, two additional products have been added as tabs:

![](https://cdn.circle.so/lwg239oftac6ov7r3o97wnlf67uk)

Reversely, you can close tabs you don't need by using the small **x** to the left of the title. &#x20;

{% hint style="info" %}
The bulk editor doesn't show the "Hide from search engines" control. Also, any promoted fields are shown inline in their individual tabs.
{% endhint %}




---

[Next Page](/llms-full.txt/1)

