In this article
- What a personalization option is on Shopify
- Which method should you use?
- Method 1: add a custom text field with no app
- Method 2: add personalization with an app
- How to charge for personalization
- Test a real order before you go live
- Where personalization data shows up for fulfillment
- Mobile UX for personalization fields
- Common mistakes and how to fix them
- Pre-launch checklist
- Frequently asked questions
- Keep exploring
You add a personalization option on Shopify by putting an extra input on the product page that saves the customer's text, choice or file as a line item property on the order. You can do it two ways: paste a few lines of code into a Custom Liquid block in your theme (free, text only), or install a personalizer app that gives you fields, live preview and add-on pricing without code.
If you only need one plain text box, like a name for a mug, the no-app method takes about 10 minutes. If you need fonts, colors, photo upload, a preview or a fee, use an app.
This is the hands-on tutorial. We set both methods up on a Dawn store, test an order end to end, and show where the text ends up for whoever prints the product. If you want the bigger picture first (which products to personalize, pricing strategy, what sells), read our complete product personalization guide and come back here to build it.
Everything below was checked against Shopify's developer docs and Help Center in October 2026. Theme code changes from version to version, so test on a duplicate theme before you touch your live one.
Key takeaways
- Personalization belongs in line item properties, not variants, because customers can type anything and Shopify caps products at 3 options and 2,048 variants.
- Without an app, a Custom Liquid block with an input named properties[Name] and tied to the product form adds a working text field in Dawn.
- A personalizer app adds what code alone can't: live preview, fonts, swatches, photo upload and a fee shown as a separate cart line.
- Always place a real test order and check the cart, checkout, email, admin order page and your POD partner before going live.
What a personalization option is on Shopify
Shopify gives you three places to store product information, and only one of them is right for what a customer types.
Variants are the combinations you stock and price: size, color, material. Shopify's Help Center says each product can have up to three options and up to 2,048 variants. Every variant is a real row with its own SKU, price and inventory.
Metafields are extra data you, the merchant, attach to a product, like care instructions or a size chart. Customers don't fill them in.
Line item properties are name and value pairs that travel with one item in the cart. Shopify's docs describe them as custom information captured by an input in the product form, "such as engraving text." The customer types "Ava" into a field named Name, and the order line reads Name: Ava.
That is why personalization belongs in line item properties. A customer's name can be anything, so it can't be a variant. You'd need one variant per possible name. Our variant vs line item property breakdown goes deeper, but the short rule is this: if you can list every possible value and it changes price or stock, it's a variant. If the customer makes it up, it's a property.
The same logic stops you from running into option limits. Three options fill up fast once you add size, color and "with name / without name." Keeping custom inputs out of variants is the whole point of personalization without bloating your variant count.
Which method should you use?
Here is how the two approaches compare on a typical print-on-demand product.
| Method 1: Custom Liquid (no app) | Method 2: Personalizer app | |
|---|---|---|
| Cost | Free | Free plan, then monthly fee |
| Setup time | 10-30 minutes per field | About 15 minutes for the first product |
| Code needed | Yes, a few lines of HTML | No |
| Field types | Text, textarea, dropdown, checkbox | Text, fonts, swatches, dropdowns, photo upload and more |
| Live preview | No | Yes |
| Character limit | Yes, with maxlength | Yes, with a visible counter |
| Charge a fee | No, not without more code | Yes, as an add-on line |
| Photo upload | Needs extra form and theme work | Built in (on PIMW, Pro plan) |
| Reuse across products | Copy the block to each template | Assign one personalizer to many products |
| Best for | One simple text field | Anything customers need to see before they buy |
Start with Method 1 if you sell one or two products and the text is short. Move to Method 2 when you add a second field, need a fee, or get your first "that's not what I expected" email.
Method 1: add a custom text field with no app

This works in Dawn and most free Online Store 2.0 themes that have a Custom Liquid block on the product page (some themes call it Liquid). It takes four steps.
Step 1: open the product template
- In Shopify admin go to Online Store > Themes.
- On a duplicate of your theme, click Customize.
- Use the page selector at the top to open Products > Default product, or a separate product template if you only want the field on some products.
A separate template is usually smarter. Create one called "personalized," add the field there, and assign only your custom products to it from the product page in admin (Theme template, in the right-hand column).
Step 2: add a Custom Liquid block
In the left sidebar, under the product information section, click Add block > Custom Liquid. Drag it above the Buy buttons block so customers see it before they click Add to cart.
Step 3: paste the field
Paste these two lines into the Custom Liquid box:
<label for="pimw-name">Name to print (max 12 characters)</label><input id="pimw-name" type="text" name="properties[Name]" maxlength="12" required form="product-form-{{ section.id }}">
Three parts of that input matter:
name="properties[Name]"is what makes Shopify save it. Shopify's docs require the formatproperties[property-name]. Whatever you put in the brackets becomes the label on the order, so write it the way your printer wants to read it.form="product-form-{{ section.id }}"ties the field to the product form. A Custom Liquid block sits outside the form tag, and without this attribute the browser never sends the text. In current Dawn, the product section builds its form id as product-form- plus the section id. Other themes may use a different id, so inspect the Add to cart form in your browser if the text doesn't come through.maxlength="12"stops typing at 12 characters. Pick a number from your print area, not a guess.
Save, open the product on your storefront, type a name and add it to the cart. In Dawn the cart page already lists properties under the product title, so you should see Name: and your text.
Our no-app line item properties tutorial has more snippets for this approach, including dropdowns and textareas.
Step 4: make the field required
The required attribute in the snippet blocks Add to cart until the field has text. Browsers check fields that point at a form through the form attribute too, so it works from a Custom Liquid block.
One catch. Dynamic checkout buttons (Buy it now, Shop Pay) skip the normal cart flow. Test them on your personalized product. If the order arrives without the text, turn off Show dynamic checkout buttons in the Buy buttons block on that template.
Hidden properties with an underscore
Sometimes you want data on the order that the customer shouldn't see, like which template they used or a proof ID. Start the property name with an underscore:
<input type="hidden" name="properties[_Template]" value="mug-name-v2" form="product-form-{{ section.id }}">
Shopify's Liquid reference says an underscore at the start of a property name hides it from customers at checkout. The Ajax Cart API docs add that hiding it in the cart is up to your theme. Dawn's cart already skips properties that start with an underscore. You'll still see it on the order in admin, which is the point. More on this in our guide to hidden line item properties.
Show the text in the cart, checkout and emails
Here is where the property appears by default, and where you may need to edit something:
- Cart page: Dawn shows it. Older or heavily edited themes may not; the fix is a loop over
item.propertiesin the cart template. - Checkout: shown under the item, except underscore properties.
- Order page in admin: shown under the line item, including hidden ones.
- Order confirmation email: go to Settings > Notifications > Order confirmation, edit the code and search for "properties." If you can't find a loop over line properties, add one, or customers won't see their text in the email.
Our walkthrough of line item properties in order confirmation emails has the exact loop to paste.
What the no-app method can't do
It's a real, working option, but it stops at plain inputs. You get:
- No live preview. The customer types into a box and imagines the result.
- No price change. A property can't add a fee by itself, so personalization is either free or baked into the product price.
- No file upload without more work. File inputs need the form to send files, and a theme update can wipe your edits.
- No reuse. Each template carries its own copy of the code.
If you only need a name on a mug, that's fine. For anything else, this is the point where we'd stop hand-coding and switch to adding custom text fields with an app.
Method 2: add personalization with an app

A personalizer app replaces the code with a settings screen and adds what code alone can't: a preview, fonts, colors, uploads and fees. If you're new to the category, here is what a product personalizer is in plain terms.
We'll use our own app, PIMW Product Personalizer, as the worked example because we know every screen. The steps are similar in most apps.
Step 1: install and enable the app embed
Install PIMW Product Personalizer from the Shopify App Store. There's a free plan with no credit card, and it works on every Shopify plan.
Then enable the app embed: Online Store > Themes > Customize > App embeds (the puzzle piece icon), switch Print It My Way on and click Save. This is the step people skip. Without it, nothing shows on the product page even after you build a personalizer.
Step 2: create a personalizer
In the app, go to Personalizers > New personalizer and give it a name, for example "Mug name and font." A personalizer is a reusable set of fields, so one setup can serve many products.
Step 3: add your fields
Click Add field and pick a type. For a name mug, a good starting set is:
- A text field labelled "Name" with a 12-character limit and Required switched on.
- A font picker with three to five fonts. PIMW includes 35+ fonts, but more than five on one product slows people down. See our notes on adding a font picker.
- Color swatches for the text color, if your print method allows it. Our guide to color swatches covers image versus color chips.
- Photo or logo upload, if the product needs it. Photo upload, logo upload and conditional logic start on the Pro plan ($13.99/mo). Our photo upload setup guide covers file size and resolution checks.
As the customer types, the live preview draws their text on the product image in the font and color they chose. That's the feature that cuts "I thought it would look different" emails. Our post on live preview for personalization explains how it's set up.
Step 4: set limits and logic
Two settings prevent most bad orders:
- Character limits. Set a max on every text field. Customers see a live character counter as they type, so nobody gets cut off at checkout.
- Conditional logic (Pro). Show a field only when it's relevant. Example: a "Back text" field appears only if the customer ticks "Add back print." It keeps the form short on mobile. Here's how to show and hide fields with conditional logic.
Step 5: add a fee (optional)
Set a price on any field or option, like $5 for a name or $3 for a second line. PIMW adds the fee as a separate line in the cart, so the base product price and your variants stay untouched.
Step 6: assign it to products and test
Attach the personalizer to your products from the app or the product page in admin, then open the product on your storefront and place a test order (see the testing section below). PIMW's plans are Free, Basic $7.99/mo, Pro $13.99/mo and Unlimited $24.99/mo, with no per-sale fee. You can have your first personalized product live in about 15 minutes.
Some themes hide app fields below the fold. If your fields land too low, a Personalize button near the price can open them instead.
Field types and when to use them
| Field type | Use it for | Tip |
|---|---|---|
| Single-line text | Names, initials, dates | Set a character limit that fits the print area |
| Multi-line text | Short messages, quotes | Limit lines as well as characters |
| Font picker | Name products, signs, jewelry | Offer 3-5 fonts, not 30 |
| Color swatch | Thread, ink or text color | Show real color chips, not color names |
| Dropdown or radio | Fixed choices like birth month or pet breed | Radio for 2-5 choices, dropdown for more |
| Checkbox | Yes/no add-ons like gift wrap | Attach the fee here |
| Photo or logo upload | Pet portraits, team logos, photo gifts | Warn about low-resolution images |
| Date picker | Event dates, delivery dates | Block impossible dates |
Other kinds of apps
The Shopify App Store has two broad groups of apps for this, and it helps to know which you're looking at:
- Product options apps add extra inputs (text, dropdowns, checkboxes) and often fees, without a visual preview. Good for engraving notes or gift messages where looks don't matter.
- Visual personalizers draw the customer's choices on the product image. Better for anything where the customer cares how it looks: names, fonts, photos.
- Full design tools give customers a blank canvas to build a design from scratch. Powerful, but more than most stores need, and slower on phones.
Check any app's current pricing and plan limits on its App Store listing before you commit.
How to charge for personalization
You have three ways to charge, and only one of them stays clean as your catalog grows.
- Raise the product price. Simple, and fine if every order is personalized. Customers who don't want a name pay for it anyway.
- Add a "personalized" variant. Create an option like "Personalization: Yes / No" with a higher price on Yes. It works, but it doubles your variants, uses one of your three options, and breaks the moment you want two fees (name plus photo). POD apps also need every new variant mapped to a print file.
- Add the fee as a separate cart line. The base product stays as is, and the fee appears next to it in the cart. This is what personalizer apps do, and it's the approach we recommend.
Variant fee hacks are the most common cleanup job we see. A store starts with "Name: Yes/No," then adds "Font: Premium," then "Back print," and suddenly a tee with 5 sizes and 6 colors needs hundreds of variants, each one synced to Printful or Printify. If you're weighing the options, our guide to charging for personalization compares them with real numbers.
Test a real order before you go live
Don't trust the storefront preview. Place a real order:
- Create a 100% discount code, or use a manual payment method on a test product priced at $0.01.
- Fill in every field, including an emoji, an apostrophe (O'Brien) and the maximum number of characters.
- Try Add to cart and Buy it now separately.
- Check the cart, checkout, order confirmation email and order page in admin.
- Check that the fee, if any, appears once and only once.
- If you use a POD partner, check the order there before it goes to production.
If the property shows on the product page but disappears in the cart, our article on a cart missing personalization option walks through the usual causes.
Where personalization data shows up for fulfillment

Once an order comes in, the property sits under the line item on the order page in admin, as Name: Ava or Font: Script. That's the source of truth.
- Order page: every property, including underscore ones, under the item.
- Packing slip: edit the template under Settings > Shipping and delivery > Packing slips if properties aren't listed. Hand-packers read this sheet, not the admin.
- POD partners: Printful, Printify and Gelato read the order from Shopify. PIMW saves personalization on the order as line item properties, so any fulfillment partner that reads properties can use it, and PIMW connects with all three.
- Your own workshop: Shopify Flow can read line item properties and tag or route personalized orders to a production queue.
Name your properties for the person who prints. "Name" and "Font" read better on a packing slip than "field_1" and "option_b."
Mobile UX for personalization fields

A lot of your shoppers will fill in these fields on a phone, and small screens punish long forms. What we see working:
- Put the fields directly under the price, above Add to cart.
- Keep the first screen to one or two fields. Use conditional logic for the rest.
- Use labels that say what the field does ("Name on the front") instead of "Text 1."
- Keep the preview in view while the customer types. A preview that scrolls off the screen is useless.
- Show limits before people hit them: "12 characters max" beats a silent cut-off.
Common mistakes and how to fix them
| Symptom | Likely cause | Fix |
|---|---|---|
| Field shows, but text is missing in the cart | Input isn't tied to the product form | Add the form attribute with your theme's product form id |
| Text in cart, missing in the email | Notification template has no properties loop | Add a loop over line properties to Order confirmation |
| App fields don't appear at all | App embed is off | Turn it on under Customize > App embeds and save |
| Buy it now orders arrive without text | Dynamic checkout skips your field | Hide dynamic checkout buttons on personalized products |
| Customer sees an internal property | Name doesn't start with an underscore | Rename to _Name, or filter it in the theme |
| Variant count explodes | Fees built as variants | Move fees to a separate cart line |
| Printed name is cut off | No character limit | Set a limit based on the print area |
| Field vanished after a theme update | Code lived in the old theme | Re-add the block, or use an app embed |
Pre-launch checklist
Before you announce your first personalized product, run through this list:
- Fields sit above Add to cart and are clearly labelled.
- Every text field has a character limit.
- Required fields really block Add to cart.
- Hidden properties start with an underscore.
- The fee, if any, shows as one cart line, not a variant.
- A real test order shows the text in cart, checkout, email, admin and your POD partner.
- Buy it now either works with your fields or is turned off.
- The product page works on a phone with one thumb.
- Your product description says how long personalized items take and what your return policy is for personalized items.
Get one product right, then copy the setup across your catalog.
Frequently asked questions
How do I add a personalization option to a Shopify product?
Add an input to the product page whose name follows the format properties[Name], so Shopify saves the customer's entry as a line item property. You can paste it into a Custom Liquid block in an Online Store 2.0 theme like Dawn, or install a personalizer app that adds fields, live preview and fees without code.
Can I add a custom text field on Shopify without an app?
Yes. In the theme editor, add a Custom Liquid block to the product template and paste an input named properties[Name] with a form attribute that points to the product form, which in Dawn is product-form- plus the section id. It's free, but it has no live preview, no fee and no file upload without extra code.
Should I use variants or line item properties for personalization?
Use line item properties for anything the customer types or uploads, like names and photos. Variants are for fixed choices that you stock and price, such as size and color, and Shopify limits each product to 3 options and 2,048 variants.
How do I hide a line item property from customers?
Start the property name with an underscore, for example properties[_Template]. Shopify hides underscore properties at checkout, and Dawn's cart skips them too. They still appear on the order page in your admin.
How do I charge extra for personalization on Shopify?
You can raise the product price, add a personalized variant, or add the fee as a separate cart line. A separate fee line is the cleanest because it doesn't multiply variants or use up your three options, and it's how personalizer apps such as PIMW Product Personalizer handle it.
Why is the personalization text missing from my cart or order?
The most common cause is an input that isn't tied to the product form, so the browser never sends it. Check the form attribute, check that the name starts with properties, and test the Buy it now button separately, since dynamic checkout can skip your field.
Does Printful or Printify see line item properties?
Your personalization is saved on the Shopify order as line item properties, which is where fulfillment partners read order details. Place a test order and check how it appears in your POD partner's dashboard before you sell, since each partner handles custom text in its own way.
Keep exploring
Sources & further reading
Primary sources referenced in this article. We link to official platform documentation and standards bodies rather than secondary summaries so you can verify claims directly.
- Shopify Dev Docs: Product template (line item properties in the product form)
- Shopify Dev Docs: Liquid line_item object (properties and hidden underscore properties)
- Shopify Dev Docs: Cart API reference (private line item properties)
- Shopify Dev Docs: Cart template (displaying line item properties)
- Shopify Help Center: Adding variants (3 options, 2,048 variants)
- Shopify App Store: PIMW Product Personalizer
