Trace the data flow
Personalization data flows from cart → order → POD partner via three possible paths: (1) Shopify webhook to a middleware app (Printful/Printify's official app) that reads line-item properties and generates a print file, (2) POD partner's native integration that reads line-item properties directly, or (3) a custom fulfillment webhook you built that reads the order and POSTs to the POD partner's API. Isolate which path handles your fulfillment and check each hop.
The 9 causes ranked by frequency
| Cause | Symptom | Frequency |
|---|---|---|
| Property key mismatch (Shopify vs POD app expected key) | POD ignores property, ships blank | 24% |
| Photo URL expired or 404 | POD gets URL that doesn't resolve | 17% |
| Underscore-prefix property not forwarded | Hidden metadata dropped by app | 13% |
| DPI too low, POD auto-rejects | Order silently canceled | 11% |
| Wrong POD product ID mapped to variant | Blank template shipped | 9% |
| Character set unsupported (CJK, emoji) | Text renders as boxes | 8% |
| Print file spec mismatch (bleed, safe zone) | POD returns "file rejected" email | 7% |
| Webhook delivery failure | Order never reaches POD | 6% |
| Multiple integrations conflict (double routing) | Two orders, one shipped, one canceled | 5% |
Fixes in diagnostic order
1. Property key mismatch (24%)
Your Shopify order line has property "Engraving text: Sarah" but Printful expects "custom_text". Check Printful app → Product mapping → Custom fields → verify the field name matches the property key exactly (case-sensitive). Rename either your line-item property or Printful's field to match.
2. Photo URL expired or 404 (17%)
Customer's uploaded photo was hosted on a temporary URL that expired before POD fetched it. Fix: use permanent storage (Shopify Files API, Cloudinary, S3 with long-lived signed URLs). Verify by opening the _photo_url property value directly — 200 = ok, 404 = expired.
3. Underscore-prefix property not forwarded (13%)
Underscore-prefixed properties (_photo_url, _dpi) are hidden from cart display but should still forward to POD. Some POD integration apps drop them. Check the app's docs — Printful reads all properties; Printify reads all; Gooten's older integration drops underscore-prefixed. Rename to non-underscore for those integrations, or upgrade to the current Gooten integration.
4. DPI too low, POD auto-rejects (11%)
Customer's uploaded photo is 400×400 pixels (72 DPI at the intended print size). POD's minimum is 300 DPI, which means 1500×1500 minimum for a small mug print area. POD auto-cancels the order and emails the merchant. Fix: validate DPI at upload time on the storefront:
function validateDPI(imageFile, printAreaInches) {
return new Promise(resolve => {
const img = new Image();
img.onload = () => {
const dpi = Math.min(img.width, img.height) / printAreaInches;
resolve(dpi >= 300);
};
img.src = URL.createObjectURL(imageFile);
});
}
5. Wrong POD product ID mapped to variant (9%)
Shopify variant "White mug 11oz" is mapped to a Printful product ID that no longer exists (Printful deprecated the SKU). POD receives the order, can't find the product, ships a default template blank. Fix: audit Printful → Sync products → find deprecated SKUs → remap to current equivalents.
6. Character set unsupported (8%)
Customer typed Japanese in the engraving field. POD's font doesn't include Japanese glyphs. Rendered file shows blank boxes ("tofu"). Fix: (a) filter Japanese input if your POD doesn't support it, or (b) pre-render the file client-side to PNG with a Japanese-capable font and submit the PNG instead of text+font. See markets multi-language options.
7. Print file spec mismatch (7%)
Your print file has 0mm bleed; POD requires 3mm bleed. POD returns "file rejected" email; order stalls. Fix: generate print files matching each POD partner's spec sheet (Printful: 3mm bleed for apparel, 5mm for canvas; Printify: 5mm all; Gelato: varies by warehouse). Automate via a print-file generator that reads the POD spec + adds correct bleed.
8. Webhook delivery failure (6%)
Shopify's orders/create webhook to the POD app failed and retries exhausted. Check Shopify Admin → Settings → Notifications → Webhooks → click each webhook → verify last delivery status. Failed webhooks retry for 48h; after that they're dead. Fix: ensure your POD app's endpoint returns 200 quickly (queue the payload, don't process sync).
9. Multiple integrations conflict (5%)
You have both Printful's native app AND a custom Zapier flow both forwarding orders to Printful. Order lands twice; Printful ships one, cancels the duplicate. Fix: remove the older / duplicate integration. Audit all webhook subscriptions via webhookSubscriptions query.
Prevention: pre-fulfillment validation
Add a "proof approval" step before fulfillment routing. On order creation: generate the print file, save it to order metafields, email the customer a proof link, and only route to POD after the customer confirms. This catches all 9 failure modes above before they cost you a reprint.
Frequently asked questions
Why is personalization not showing on my Printful / Printify / Gelato orders?
The most common cause (24%) is a property key mismatch — Shopify's line-item property key doesn't match what the POD integration expects. Verify field names character-for-character in your POD app's product mapping settings.
How do I check what data actually reached my POD partner?
Open the order in the POD partner's dashboard (Printful → Orders → find the order → View details). Compare the "Custom fields" or "Personalization" section to your Shopify order's line-item properties. Discrepancies indicate the transfer layer dropped or renamed data.
Why does the customer's uploaded photo not appear on the printed product?
Three common causes: (1) photo URL expired before POD fetched it, (2) photo DPI too low and POD auto-rejected, or (3) photo URL property was underscore-prefixed and an older integration dropped it. Check the URL directly and verify DPI > 300 at print size.
How do I validate photo DPI before customer uploads?
Client-side JavaScript reads the uploaded image dimensions, divides by intended print size in inches, and shows a warning if below 300 DPI. Block the add-to-cart when DPI is insufficient — reprints cost more than lost sales.
Why is my POD partner rejecting print files silently?
File spec mismatch — usually bleed area or safe zone. Each POD partner publishes a spec sheet per product (Printful mug: 3mm bleed, 5mm safe zone). Generate print files matching the exact spec for each partner.
Can I send Japanese / Chinese / Arabic text to POD partners?
Depends on the partner. Printful, Printify, Gelato support CJK + Arabic (via Noto Sans fonts). Gooten and CustomCat do not. For unsupported partners, pre-render the print file client-side to PNG with a compatible font and submit the PNG instead of text+font.
How do I catch personalization failures before POD ships wrong?
Add a "proof approval" step before fulfillment. On order creation, generate the print file, save to order metafield, email the customer a proof link. Only route to POD after customer clicks approve. Catches 90% of failures pre-shipment.
Best Shopify app for reliable POD personalization forwarding?
Print It My Way — includes DPI validation at upload, permanent photo storage, per-POD-partner print-file spec compliance, proof-approval workflow, and audit logging of every property forwarded.
Related reading
- Best POD partner for Shopify personalization
- Photo upload option setup — DPI + upload validation
- Automating print-ready files from Shopify
- Webhook variant changes — webhook reliability
Try it free on Shopify
Print It My Way's POD integration handles DPI validation, permanent photo storage, per-partner file specs, and proof approval — catches personalization failures before they reach fulfillment.
Install Print It My Way