What are Shopify line item properties?
Line item properties are per-order customer input attached to a specific cart line. They store things like engraving text, uploaded photo URLs, monogram initials, gift messages, and dates. They don't create variants, don't affect inventory, and travel with the order through checkout, admin, POS, email confirmations, and fulfillment.
You add them via the properties[Field Name] input on the product form (theme code) or via a product options app like Print It My Way (much more flexible).
Step-by-step setup
- Understand what line-item properties are. Per-order customer input. Not variants. Not metafields.
- Add via app or theme code. App = flexible. Theme code = free but limited.
- Test cart + order + email display. Properties should appear in all three.
- Verify GraphQL customAttributes on Storefront API. Line-item properties map to customAttributes in the Storefront GraphQL schema.
How they're structured
Each line-item property is a key-value pair. Key = the field name (e.g. "Engraving text"). Value = the customer's input (e.g. "Sarah").
They live on the line_item.properties array of the order. Example order line:
{
"line_items": [{
"title": "Custom Mug",
"variant_title": "White / 11oz",
"properties": [
{ "name": "Engraving text", "value": "Sarah" },
{ "name": "Font", "value": "Playfair Display" },
{ "name": "_hidden_setup_fee", "value": "5.00" }
]
}]
}
How to add via app
Install Print It My Way. Add fields to your product's personalizer. Customer input becomes line-item properties automatically. No theme editing.
How to add via theme code (no app)
Add this to product-form.liquid:
<label>Engraving text</label>
<input type="text" name="properties[Engraving text]" maxlength="20">Cheap and works, but no validation, preview, mobile UI, or per-field pricing.
Hidden properties (underscore prefix)
A line-item property whose key starts with an underscore is hidden from customer-facing displays (cart, checkout, order confirmation email) but still stored in the order.
<input type="hidden" name="properties[_setup_fee]" value="5.00">Use for internal fulfillment metadata — routing tags, batch codes, print-file URLs.
GraphQL and customAttributes
On the Storefront API GraphQL schema, line-item properties are exposed as customAttributes on the CartLine type:
cart {
lines(first: 10) {
edges {
node {
merchandise { ... }
attributes {
key
value
}
}
}
}
}
Character and count limits
- Key length — 100 characters
- Value length — 255 characters (per property). Longer values need a hidden URL to a stored file.
- Properties per line item — practically unlimited (Shopify doesn't cap; slowdown starts around 50+).
How POD partners consume them
Printful, Printify, Gelato all read line-item properties from the order via their standard integration. Custom text becomes engraved text. Uploaded photo URLs become print files. No manual transfer needed.
Add line-item properties without theme code
Print It My Way handles line-item properties + validation + pricing + preview. Free plan.
Install Print It My Way — Free Line-item properties not showing in cart? Fix →Frequently asked questions
What are line item properties in Shopify?
Per-order customer input attached to a specific cart line. Store engraving text, uploaded photos, gift messages, etc.
How do I add a line-item property without an app?
Add an input to product-form.liquid with name='properties[Field Name]'. Works for one field; painful for anything more.
Can line-item properties charge extra?
Not directly. Use Cart Transform (via an app like Print It My Way) to add per-property surcharges.
What's a hidden line-item property?
A property whose key starts with underscore (_) — stored on the order but hidden from customer-facing displays.
Do line-item properties work in Shopify checkout?
Yes. They persist from cart → checkout → order → fulfillment. Displayed in checkout summary and confirmation email.
How do I access line-item properties in the Storefront API?
They map to the customAttributes field on the CartLine GraphQL type.
What's the character limit on line-item properties?
Key ≤100 chars, value ≤255 chars. For longer values, store the payload elsewhere and reference by URL.