In brief
- ACF field groups cannot be imported into Shopify. Each field is recreated as a metafield definition with a matching type, and only then are the values imported.8
- Shopify allows up to 256 metafield definitions per resource type for the merchant, and standard definitions do not count towards that limit.2
- ACF repeaters and flexible content become metaobjects: up to 40 fields per metaobject definition and up to 1,000,000 entries per definition.3
- ACF saves dates as Ymd, true/false as 1 or 0, and checkboxes and relationships as serialized PHP arrays, so every value needs converting before Shopify will accept it.111213
- The Shopify product CSV can carry most simple metafield types, but not file references, rich text, JSON, single metaobject references or variant metafields.5
Two halves of one move
Take one product from a clothing store: a fabric note, a launch date, an organic flag and a size chart built with a repeater. In WordPress all of it lives in wp_postmeta, one row per value, next to the row that tells ACF which field the value belongs to.16 On Shopify the same product carries typed metafields, and the size chart becomes a list of metaobject entries.
The _fabric row only tells ACF which field a value belongs to, and is not migrated. The repeater's row count (3) and its numbered keys become three metaobject entries.
That gives you two separate jobs. The structure, meaning the field groups, is rebuilt once by hand or by script as Shopify definitions. The values are exported, converted and imported for every product. Mixing the two up is how custom fields get lost: an import that writes values to a metafield with no definition behind it may succeed, but the field does not appear in the product editor, cannot be validated, and cannot be connected to the theme without code.
Every ACF field type, mapped
Shopify's list of metafield types has grown well beyond the twenty-odd types most guides still describe. It now includes measurement types such as temperature and duration, references to articles and orders, and mixed_reference, which can point at metaobjects of more than one definition.1 For ACF fields, the useful subset is below.
| ACF field | Shopify type | What changes |
|---|---|---|
| Basic | ||
| Text | single_line_text_field | Character limits move to a min/max validation.4 |
| Text Area | multi_line_text_field | Line breaks are kept. There is no list version.1 |
| Number, Range | number_integer or number_decimal | Choose by the field's step. Range bounds become min/max. |
| single_line_text_field | No email type. Add a regex validation if it matters.4 | |
| URL | url | Can be restricted to certain domains with allowed_domains.4 |
| Password | Do not migrate | A storefront data field is the wrong place for a secret. |
| Content | ||
| Image | file_reference | ACF stores the attachment ID,16 which means nothing to Shopify. Upload the file to Shopify first, then reference it. Limit the type to images.4 |
| File | file_reference | Leave the file type validation empty to accept any file.4 |
| Gallery | list.file_reference | At most 128 files per list.2 |
| Wysiwyg | rich_text_field | Shopify rich text is a structured format, not HTML: the HTML has to be converted, and embedded images and shortcodes do not survive. It cannot be imported by CSV.5 |
| oEmbed | url | Store the URL. The theme renders the embed. |
| Choice | ||
| Select, Radio, Button Group | single_line_text_field | With a choices validation of up to 128 values.2 |
| Checkbox, multi-select | list.single_line_text_field | ACF saves these as a serialized PHP array,23 so unpack it first. For filters with labels or swatches, a list of metaobject references is the better fit. |
| True / False | boolean | Stored as 1 or 0 in WordPress,12 written as true or false. |
| Date and colour | ||
| Date Picker | date | Always saved as Ymd, such as 20260315,11 written as 2026-03-15. |
| Date Time Picker | date_time | Saved as Y-m-d H:i:s with no time zone.22 Decide which zone it meant before converting, or every launch time moves by hours. |
| Time Picker | single_line_text_field | Shopify has no time-only type. |
| Color Picker | color | Shopify's colour type takes a hex value.1 Colours saved with transparency lose it. |
| Relational | ||
| Link | link | Shopify's link type holds a URL and its text, like ACF's.1 |
| Post Object, Relationship | product_reference, page_reference, article_reference | Pick by what the field points to, and use the list version for several. Relationships are serialized arrays of post IDs,13 which must be mapped to the new Shopify IDs after import. |
| Taxonomy | collection_reference | For product categories. Tags have no reference type, so they become text. |
| Page Link | url | Old WordPress URLs must be rewritten to their Shopify addresses. |
| User | No equivalent | Shopify staff are not data you can reference. Store a name as text. |
| Google Map | json or a metaobject | A metaobject with address, latitude and longitude fields is easier to edit than JSON. |
| Layout | ||
| Group | One metafield per sub-field | We flatten groups into prefixed keys: they stay in the CSV and work with dynamic sources. |
| Repeater | list.metaobject_reference | One metaobject definition, one entry per row. Below. |
| Flexible Content | list.mixed_reference | One metaobject definition per layout.1 |
| Clone | The cloned fields | Clone values are saved as ordinary individual fields, so map what was cloned.24 |
| Tab, Accordion, Message | Nothing | Editor layout only. They hold no data. |
Convert your field groups
In WordPress, open ACF's export tool, export the field groups attached to products, and paste the JSON below. You get the Shopify type for every field, what to watch out for, and the GraphQL to create the definitions. The converter runs in your browser, so nothing you paste is sent anywhere.
| Field | ACF type | Shopify | Key |
|---|
Treat the output as a first draft. It suggests the type a field's data needs, but whether a fabric note should be free text or a fixed list depends on how you want to filter it. That decision is worth making now, before 2,000 products are imported into the wrong shape.
Repeaters and flexible content
A repeater is the field type that makes people put off this part of a migration, and it maps more cleanly than its reputation suggests. ACF stores a repeater as numbered keys, size_chart_0_size, size_chart_1_size and so on, with the row number in the middle of the key.14 On Shopify, the sub-fields become a metaobject definition, each row becomes an entry, and the product holds a list that points to its entries in order.1
| Limit | Value | What it means for a repeater |
|---|---|---|
| Fields per metaobject definition | 40 | A repeater with more sub-fields has to be split.3 |
| Entries in a metaobject reference list | 1,024 | Rows per product. Other list types stop at 128.2 |
| Entries per definition | 1,000,000 | Across the whole store. It was 64,000 below Plus until October 2025.10 |
| Metaobject definitions | 128 / 256 | Per store, created by the merchant: 128 below Plus, 256 on Plus.3 |
Before creating one definition per repeater, check whether the rows are really shared data. If forty products carry the same size chart, create one chart and reference it from all forty. A fix to that chart then reaches every product at once, which a repeater never could.
Flexible content follows the same idea, with one metaobject definition per layout and a list.mixed_reference on the product, the type that may point to entries of different definitions.1 If a flexible content field mostly builds page layouts rather than holding product data, rebuild it with theme sections instead. Section blocks are what Shopify themes use for that job, and they give the merchant a visual editor.
Metaobjects can be pages too
A metaobject definition can be made publishable, translatable and renderable as its own page in the online store, with a theme template and a URL.20 That suits a designer directory or a fabric glossary that was a custom post type with ACF fields.
Moving the values
- DefineCreate every metafield and metaobject definition on Shopify first, with validations.
- ExportRead the values from the WooCommerce REST API or the database.
- ConvertDates, booleans, serialized arrays, attachment and post IDs.
- ImportProduct CSV for simple types, the Admin API for the rest.
Where to read them
The WooCommerce REST API returns a product's custom fields in meta_data.17 It leaves out only WooCommerce's own internal keys and keys that start with wp_,21 so ACF's values arrive along with the underscore rows that point to their field keys, still in their stored format. Since ACF 5.11, a field group can also be shown in the WordPress REST API, under an acf property, with the setting "Show in REST API".15 It is off by default. For large catalogues, a direct database export is faster than either.
What needs converting
- Dates:
20260315becomes2026-03-15.11 - True/false:
1and0becometrueandfalse.12 - Serialized arrays:
a:2:{i:0;s:3:"123";…}is unpacked into a list.13 - Attachment IDs: look up each file's URL in WordPress, upload it to Shopify Files, and write the new file ID.
- Post IDs: import products first, keep a table of old WooCommerce ID to new Shopify ID, then write the references. Keeping the old ID in a metafield of type
idmakes later imports match by it.1 - Everything: Shopify stores every metafield value as a string, whatever its type, so lists and numbers are written in their string form.1
CSV or API
The product CSV takes metafield columns named like Fabric (product.metafields.custom.fabric), and list values separated by a semicolon and a space.5 That covers text, numbers, booleans, dates, colours, URLs, measurements, product references and lists of metaobject references. It does not cover file references, rich text, JSON, single metaobject references or links, and variant metafields cannot go through the product CSV at all.5 Those go through metafieldsSet, which writes up to 25 metafields per call, all or nothing.9
Size limits that bite
Most metafield values can be up to 64 KB and URLs 2 KB. JSON values are limited to 128 KB from API version 2026-04; apps that already wrote larger JSON before April 2026 keep the old 2 MB.219 A long size guide pasted into a Wysiwyg field fits easily. A JSON blob that a plugin used as a database table may not.
Showing and filtering them
On WordPress, someone wrote PHP in the theme to display each field. On a Shopify Online Store 2.0 theme, most metafields can be connected to a section setting from the theme editor without code, through dynamic sources: a file_reference fills an image setting, a list.product_reference fills a product list, and text, numbers, dates and money can fill a rich text block.7 Liquid can read every metafield. A headless storefront needs storefront access switched on in the definition, which is off by default.8
Filters are where the type choice pays off. The Search & Discovery app can filter by single line text, integer, decimal, true or false and metaobject reference metafields, and their list versions, up to 25 filters per store.6 A fabric stored as free text in a multi-line field can never become a filter. The same fabric as a choice list can.
Look for a category metafield first
Shopify's product taxonomy already defines attributes such as fabric, colour and pattern for many categories, as metaobject-backed metafields in the shopify namespace.6 Where one fits your ACF field, use it instead of a custom definition: Shopify's filters and reports already understand it, and standard definitions do not count towards your 256.2
Meta Box, Pods, Secure Custom Fields and plain attributes
ACF is the common case, with more than two million active installs, but not the only one.18 Secure Custom Fields, the fork WordPress.org created from ACF in October 2024, stores data the same way and maps the same way.25 Meta Box (500,000+ installs) and Pods (100,000+) use their own field names but the same underlying idea of values in post meta, so the type table above still applies once you know which field type each one is.2627
The custom data many WooCommerce stores forget is not in a plugin at all. Product attributes that are not used for variations, such as Material or Origin, show on the product page's "Additional information" tab.17 On Shopify they are metafields too. The variations guide covers how to tell which attributes should be options and which should not.
Custom field checklist
- Export every ACF field group and list which ones sit on products, variations, categories, pages and posts.
- Remove fields that are empty on most products. A migration is the cheapest moment to drop them.
- Check each field against Shopify's category metafields before creating a custom definition.
- Decide which fields need to be filters, and give those a filterable type.
- Create all definitions and metaobject definitions, with validations, before importing a single value.
- Upload files to Shopify first, and keep a table from WordPress attachment ID to Shopify file ID.
- Import products before writing product references, and keep the old WooCommerce ID in an
idmetafield. - Convert dates, date-times (with the right time zone), booleans and serialized arrays.
- Connect each metafield to the theme with dynamic sources, then compare ten products side by side with the old store.
The free readiness scanner detects ACF and other plugins on a WooCommerce store, and the plugin map lists what replaces each of them.
Hundreds of products with custom data?
- Every field group mapped to a Shopify type
- Repeaters rebuilt as metaobjects
- Files and references re-linked
- Filters set up where they help
- Every value counted in the QA report
- Preview the store before you pay
Frequently asked questions
Can ACF fields be migrated to Shopify?
The values can, the fields themselves cannot. Each ACF field is recreated on Shopify as a metafield definition with a matching type, and the stored values are then converted and imported into those metafields. Repeaters and flexible content become metaobjects.
What replaces an ACF repeater on Shopify?
A metaobject definition with one field per sub-field, and a list.metaobject_reference metafield on the product that points to one metaobject entry per row. A metaobject definition can have up to 40 fields and a metaobject reference list can hold up to 1,024 entries.
How many metafields can a Shopify product have?
Merchants can create up to 256 metafield definitions per resource type, so up to 256 defined fields on products, and apps can create their own 256 each. Standard definitions do not count towards the limit.
Can I import metafields with the Shopify product CSV?
Yes for most simple types, using a column named like Fabric (product.metafields.custom.fabric). File references, rich text, JSON, single metaobject references and variant metafields are not supported in the product CSV, so those need the Admin API or an import app.
Can customers filter products by metafields on Shopify?
Yes, through the Search & Discovery app, for single line text, integer, decimal, true or false and metaobject reference metafields and their list versions. A store can have up to 25 filters.
Sources
- Shopify. List of data types, metafields and metaobjects.
- Shopify. Metafield limits: definitions, value sizes, lists and choices.
- Shopify. Metaobject limits.
- Shopify. List of validation options.
- Shopify Help Center. Using CSV files to import and export products, metafield columns.
- Shopify. Storefront filtering, supported metafield types and filter limit.
- Shopify. Dynamic sources, setting and metafield type compatibility.
- Shopify. About metafields, definitions, namespaces and storefront access.
- Shopify. metafieldsSet, GraphQL Admin API reference.
- Shopify. Increased limits in metafield and metaobject definitions, developer changelog, October 2025.
- Advanced Custom Fields. Date Picker, storage format.
- Advanced Custom Fields. True / False, storage format.
- Advanced Custom Fields. Querying relationship fields, serialized storage.
- Advanced Custom Fields. How to query posts by custom fields, repeater sub-field keys.
- Advanced Custom Fields. WP REST API integration.
- Advanced Custom Fields. update_field(), field key references and image values.
- WooCommerce. REST API documentation, product meta_data and attribute properties.
- WordPress.org. Advanced Custom Fields, plugin directory, active installs as of 2 October 2026.
- Shopify. JSON metafield values limited to 128KB, developer changelog, February 2026.
- Shopify. Use metaobject capabilities.
- WooCommerce source code. class-wc-data-store-wp.php, filter for internal meta keys.
- Advanced Custom Fields. Date Time Picker, storage format.
- Advanced Custom Fields. Checkbox, storage format.
- Advanced Custom Fields. Clone, how values are saved.
- WordPress.org News. Secure Custom Fields, 12 October 2024.
- WordPress.org. Meta Box, plugin directory, active installs as of 2 October 2026.
- WordPress.org. Pods, plugin directory, active installs as of 2 October 2026.
Mufatech Studio migrates stores to Shopify. Limits and formats are quoted from Shopify's, ACF's and WooCommerce's own documentation as of October 2026; Shopify raised several of these limits in 2025 and 2026, so older guides may quote lower numbers.