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
| Cause | Effect | Frequency |
|---|---|---|
Line-item key prefixed with _ | Hidden from cart display by Shopify convention | 28% |
| Cart template missing properties loop | Properties saved but not rendered | 19% |
| Cart drawer + cart page templates diverged | Shows in one, not the other | 14% |
| App "show in cart" toggle off | App-side visibility disabled | 12% |
| Add-to-cart AJAX loses properties | Custom theme JS doesn't pass properties | 10% |
| Cart drawer cached (stale HTML) | New properties don't appear | 7% |
| Property value contains HTML/JS | Sanitized away by theme | 5% |
| Theme sanitizes empty-value properties | Empty text field's property removed | 5% |
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
- Add the personalized product to cart
- Visit
https://your-store.com/cart.json - Look at each line's
propertiesobject - If empty → the properties never reached the cart (fixes 5, 8 above)
- 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
- Custom text field setup — line-item property basics
- Photo upload option setup — file line-item properties
- Checkout Extensions for options — checkout-side display
- Storefront API for variants — cart mutation reference
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