Troubleshooting

Shopify Cart Missing Personalization Option

The customer chose "Custom text: Sarah, Font: Playfair, Photo: uploaded" on the product page, but the cart drawer just shows "Personalized Mug × 1" — no details. The order comes in without personalization data. Sometimes worse: the personalization is there but the customer can't verify, calls support, and cancels. Here are the 8 causes and fixes, ranked by frequency.

Last updated: August 23, 2026~9 min readBy the Print It My Way team

First: is the property actually attached to the cart line?

Before you touch the theme, verify the personalization data is actually saved to the cart line. Open the cart URL directly: /cart.json — you'll see a JSON dump of every line's properties. If properties: {} or is missing, the personalization never reached the cart (app add-to-cart bug or theme JS bug). If properties are present but the cart page doesn't show them, it's a display bug (theme or app config).

The 8 common causes

CauseEffectFrequency
Line-item key prefixed with _Hidden from cart display by Shopify convention28%
Cart template missing properties loopProperties saved but not rendered19%
Cart drawer + cart page templates divergedShows in one, not the other14%
App "show in cart" toggle offApp-side visibility disabled12%
Add-to-cart AJAX loses propertiesCustom theme JS doesn't pass properties10%
Cart drawer cached (stale HTML)New properties don't appear7%
Property value contains HTML/JSSanitized away by theme5%
Theme sanitizes empty-value propertiesEmpty text field's property removed5%

Fixes in diagnostic order

1. Line-item key prefixed with underscore (28%)

Shopify convention: property keys starting with _ are hidden from the cart display. Used intentionally for fulfillment metadata (_photo_url, _dpi) that customers shouldn't see. If your customer-facing property is named _custom_text, rename to Custom text. Underscore-prefixed properties still persist on the order — they just don't show at cart.

2. Cart template missing the properties loop (19%)

Many themes' cart template renders just the product title + quantity + price, no property loop. Add to sections/main-cart-items.liquid (or your theme's equivalent):

{% for property in item.properties %}
  {% assign key = property.first %}
  {% assign value = property.last %}
  {% unless key contains '_' %}  {# skip underscore-prefixed #}
    <div class="cart-item__property">
      <strong>{{ key }}:</strong> {{ value }}
    </div>
  {% endunless %}
{% endfor %}

3. Cart drawer + cart page templates diverged (14%)

Your cart page shows properties but the cart drawer doesn't (or vice versa). The drawer lives in snippets/cart-drawer.liquid or sections/cart-drawer.liquid — a separate template. Duplicate the properties loop into both templates.

4. App's "show in cart" toggle off (12%)

Personalization app admin → Options → each option → "Show in cart" toggle. Merchants sometimes turn this off during setup and forget. Turn it back on.

5. Add-to-cart AJAX loses properties (10%)

A theme's custom JS makes an AJAX add-to-cart call but doesn't pass the personalization properties. Check the network tab in DevTools when adding to cart — the request body should include a properties object. If missing, the theme's JS needs to serialize properties from the personalization form:

const formData = new FormData(form);
const properties = {};
formData.forEach((value, key) => {
  if (key.startsWith('properties[')) {
    const propName = key.match(/properties\[(.+)\]/)[1];
    properties[propName] = value;
  }
});
await fetch('/cart/add.js', {
  method: 'POST',
  body: JSON.stringify({ id: variantId, quantity: 1, properties }),
  headers: {'Content-Type': 'application/json'}
});

6. Cart drawer cached with stale HTML (7%)

The theme's drawer renders once on page load, and the cached HTML doesn't reflect new properties. Fix: after add-to-cart, refetch cart HTML with fetch('/?section_id=cart-drawer').then(r => r.text()).then(html => updateDrawer(html)).

7. Property value contains HTML or JS (5%)

Customer typed <script> or <div> in the personalization field. Some themes strip these values entirely as XSS protection. Fix: escape but don't strip — use {{ value | escape }} in the theme template.

8. Empty-value properties sanitized (5%)

Customer left an optional field blank. Some themes' add-to-cart JS filters out empty-value properties before submitting. Result: "Gift message" property is absent when the customer skipped it. Usually benign — but if you rely on the property being present, add default values in your form.

How to inspect what's actually in the cart

  1. Add the personalized product to cart
  2. Visit https://your-store.com/cart.json
  3. Look at each line's properties object
  4. If empty → the properties never reached the cart (fixes 5, 8 above)
  5. If populated → the display is broken (fixes 1-4, 6-7 above)

Frequently asked questions

Why aren't my Shopify cart personalization options showing?

Most common (28%): the line-item property key starts with an underscore, which hides it from the cart display by Shopify convention. Rename to Custom text instead of _custom_text.

How do I check if personalization data reached my Shopify cart?

Visit /cart.json in the same browser session. Each line's properties object shows what data actually attached to the cart. Empty = add-to-cart bug; populated = display bug.

Why is the personalization showing on the cart page but not the cart drawer?

The drawer uses a different template than the cart page. Add the properties render loop to both sections/main-cart-items.liquid AND snippets/cart-drawer.liquid (or your theme's equivalent).

How do I hide fulfillment metadata from the customer but keep it on the order?

Prefix the property key with an underscore — e.g., _photo_url, _dpi, _pod_partner. Underscore-prefixed properties persist on the order (visible to you + POD partner) but are hidden from the customer's cart view.

Why does my custom AJAX add-to-cart lose personalization properties?

The JS is not passing properties in the request body. Serialize form fields where name="properties[Custom text]" and include them in the POST to /cart/add.js.

Can I edit personalization data after add-to-cart?

Yes via /cart/change.js — pass the line's index + new properties. Common pattern: "Edit" button beside each cart line opens a modal to update the personalization.

Do personalization properties persist through checkout?

Yes — line-item properties flow from cart → checkout → order → order webhook to your POD partner. They're the primary channel for personalization data.

Best Shopify app for reliable cart personalization display?

Print It My Way — properties render in both cart drawer and cart page automatically, edit-in-cart supported, underscore-prefixed metadata preserved without customer visibility.

Related reading

Try it free on Shopify

Print It My Way's cart integration handles the drawer + cart page rendering, edit-in-cart, and property hiding automatically — no theme edits required.

Install Print It My Way