Metaobject definitions
One row creates one metaobject definition, with all of its fields. A metaobject is a custom content type of your own — an Author, a Size chart, a Store location, an FAQ — that isn't a product, page or collection.
Choose Metaobject definitions on the upload step and click
Download template. Only type and
fields are required.
A worked example
type,name,fields,displayNameKey,publishable,storefrontAccess
author,Author,name*:single_line_text_field|bio:multi_line_text_field|photo:file_reference,name,true,PUBLIC_READ
ingredient,Ingredient,name*:single_line_text_field|allergen:boolean,name,false,PUBLIC_READ
Two definitions, two credits. The first creates an author type with
three fields, where name is required and doubles as the display name,
and entries can be draft or published.
The fields column
This is the only genuinely unusual thing about this import type. A CSV row can't have a variable number of columns, and a definition can have any number of fields — so the whole field set is packed into a single cell.
Compact form
key:type pairs separated by |. A trailing *
on the key marks the field required. :required works too.
name*:single_line_text_field|bio:multi_line_text_field|photo:file_reference
That cell means:
| Key | Type | Required |
|---|---|---|
name | single_line_text_field | Yes |
bio | multi_line_text_field | No |
photo | file_reference | No |
No commas are involved, so the cell doesn't need quoting — which is exactly why the pipe was chosen as the separator.
So no more than 40 key:type pairs in one fields cell. The
pre-import check counts them, so a 41st field is reported as a row error before
anything is written.
Shopify's limits →
JSON form
For anything more elaborate, or if you're generating the file from a script, a JSON array is accepted. Remember to quote the cell, because it contains commas.
[{"key":"name","type":"single_line_text_field","required":true},
{"key":"bio","type":"multi_line_text_field"}]
Field types are the same catalogue metafields use — see metafield types. Reference types are allowed, so a metaobject can point at products, files or other metaobjects.
Columns
Required
| Column | What it controls | Example |
|---|---|---|
type Required |
Unique handle for the definition, 3–255 characters, letters, numbers, hyphens and underscores. This can never be changed. | author |
fields Required |
The definition's fields — see above. | name*:single_line_text_field |
Optional
| Column | What it controls | Example |
|---|---|---|
name | Human-readable name shown in the admin. Defaults to something derived from the type if blank. | Author |
description | Internal note explaining what this definition models. | A blog post author |
displayNameKey | Key of the field to use as each entry's display name. Must be one of the keys in fields. | name |
adminAccess | MERCHANT_READ or MERCHANT_READ_WRITE. | MERCHANT_READ_WRITE |
storefrontAccess | NONE or PUBLIC_READ. Use PUBLIC_READ to expose entries to your theme. | PUBLIC_READ |
publishable | true to give entries draft and published status. This also adds a status column when you import entries. | true |
translatable | true to allow entries to be translated. | false |
renderableMetaTitleKey | Key of the field to use as the SEO page title. Setting this enables the renderable capability. | name |
renderableMetaDescriptionKey | Key of the field to use as the SEO page description. | bio |
onlineStoreUrlHandle | Enables the Online Store capability and serves entries at /pages/<handle>. | authors |
Without displayNameKey, entries show up in the admin identified only
by handle, which makes picking one from a dropdown miserable. Point it at the
field a human would recognise.
Capabilities, briefly
publishable-
Entries get a draft/published status, so you can load content before it goes live.
Turn it on and the entries importer gains a
statuscolumn acceptingACTIVEorDRAFT. onlineStoreUrlHandle-
Makes entries addressable on your storefront under
/pages/<handle>. Set it to a plural noun —authors,locations. renderableMetaTitleKey/renderableMetaDescriptionKey- Enables the renderable capability, letting Shopify build SEO tags for those pages from fields you nominate.
translatable- Makes entry content available to Shopify's translation tooling.
Rules enforced before anything reaches Shopify
- Type — 3–255 characters, letters, numbers, hyphens, underscores, and immutable once created.
-
An
$app:prefix is stripped with a warning, and the definition is imported as merchant-owned. App-reserved types belong to apps, and a CSV import creates definitions you own. displayNameKeymust be one of the keys infields.- Duplicate rows — two rows with the same
type: the second is flaggedduplicate of row N. - Field types are immutable. This shapes update behaviour — see below.
Re-importing a definition that exists
A definition is identified by its type. Your conflict mode decides what happens:
| Mode | Result | Charged |
|---|---|---|
| Skip (default) | Left completely alone. | No |
| Update | New fields are added. Existing fields are never rewritten. A row whose field type differs from the existing one produces a warning, not a silent overwrite. | Yes |
| Fail | Reported as a conflict. | No |
A metaobject field's type is immutable in Shopify, and entries already hold data in those fields. Rewriting a merchant's field configuration from a CSV would be destructive in a way that can't be undone, so ImportKit adds what's missing and tells you about anything that doesn't match. Restructuring an existing definition is deliberate work for the Shopify admin.
A practical consequence: adding a field to an existing definition works
well. Re-import the row with the extra field in the fields
cell, in Update mode, and only the new field is created.
After importing definitions
Check them in the Shopify admin at Settings → Custom data → Metaobjects, then:
- Import the entries. The target selector on the upload step will list your new definition, and the columns will be its fields.
-
Import metafield definitions that reference
it, using the
metaobject_reference<author>shorthand — now that the definition exists, the reference resolves cleanly.
The imported definition in Shopify
Shopify admin at Settings → Custom data → Metaobjects → Author, showing the three
fields with name marked required and set as the display name.
assets/screenshots/shopify-metaobject-author.png