Upload Prototype — No Apps

Internal Prototype · Draft

Upload & Customisation — Without Apps

Native Shopify line_item_properties for text fields. Cloudinary CDN for file uploads. Zero Easify, zero UploadKit. Fully styled, 100% owned.

Initials Disc — Native

Initial Disc

Letters only, max 3. Auto-uppercase. Fully validated before Add to Cart.

Letters only · Max 3 · Auto uppercase

Disc preview

—

Shopify order property

This field maps to properties[Initials] on the order line item. Appears instantly in Shopify Admin with no extra tooling.
Whisper Disc — Native

Whisper Disc

Free text, max 30 chars. Live counter. Blocks Add to Cart if empty.

Engraved exactly as entered · Check spelling carefully

Disc preview

Your words here

Shopify order property

Maps to properties[Words to Engrave]. The 30-char limit matches the physical disc capacity.

How it works in the template: Inside the product form, add <input type="text" name="properties[Initials]" required>. Shopify passes every properties[*] field through the cart and onto the order — no app reads or stores these, they are native Shopify data.

Heirloom / Tiny Toes — Cloudinary

Drawing Upload

Customer uploads their child's drawing. File goes to Cloudinary CDN. The returned URL is stored as properties[Artwork URL] on the order. You click the link in Shopify Admin to download the artwork.

⬆

Drop your drawing here, or tap to browse

JPG, PNG, PDF · Max 10MB · Your artwork is safe and private

Engraved on the disc beneath the artwork

In production — Cloudinary replaces the file input

The native file input above shows the UX. In production, the Cloudinary Upload Widget handles chunked upload, format validation, and image optimisation — then returns a CDN URL (e.g. res.cloudinary.com/innerziva/artwork/ord-1234.jpg) which is stored silently in properties[Artwork URL] before form submit. No app. No middleware. Cost: $0 on Cloudinary free tier.

Cloudinary integration — 12 lines of JS

// Load once in theme.liquid:
// <script src="https://upload-widget.cloudinary.com/global/all.js"></script>

const widget = cloudinary.createUploadWidget({
  cloudName: 'innerziva',       // your Cloudinary cloud name
  uploadPreset: 'artwork_unsigned', // unsigned preset (no backend needed)
  maxFileSize: 10485760,        // 10MB
  clientAllowedFormats: ['jpg','png','pdf'],
}, (error, result) => {
  if (result.event === 'success') {
    // Store URL in hidden properties field → appears on Shopify order
    document.getElementById('artwork-url-field').value = result.info.secure_url;
    document.getElementById('atc-btn').disabled = false;
  }
});

What you see in Shopify Admin

Every properties[*] field appears automatically under the line item on every order. No app dashboard needed.

Admin → Orders → #1042 → Line Items

Inner Ziva — Gold Heirloom Disc™ × 1  ·  $97.97

Chain Type Box Chain
Pendant Size 20mm
Child Name Luna

The Inner Ziva Initial Disc™ × 1  ·  $79.97

Initials SJM

The Inner Ziva Whisper Disc™ × 1  ·  $79.97

Words to Engrave My darling girl

These fields are native Shopify order data — they appear on packing slips, order confirmation emails, and fulfilment APIs automatically. No app subscription required to see them.

App vs Native — Side by Side

Current setup vs. native Shopify + Cloudinary.

Easify + UploadKit (current) Native + Cloudinary
Monthly cost ~$20–35/month $0 (Cloudinary free tier)
CSS / styling control App injects its own HTML — partial control only 100% — you own every element
Above-fold layout App description pushes Add to Cart off screen (fixed today with CSS hack) Full control — label is one line, no extra description
Text fields (initials, words) Managed inside Easify option sets — edit via app dashboard Plain HTML in theme — edit in code
File upload storage UploadKit (proprietary storage) Cloudinary (CDN, 25GB free, permanent URLs)
Order visibility App dashboard + Shopify admin Shopify admin only — URL clickable link to artwork
Validation logic App handles — limited customisation Custom JS — full control (char limits, file type, required)
Risk App updates can break layout unexpectedly Code is in your theme — stable, version-controlled
Dev time to implement — ~4–6 hours (text fields done; Cloudinary wiring needed)
Cloudinary free tier — 25GB storage · 25GB bandwidth/month · ~10,000+ customer uploads before you hit limits
cument.getElementById('proto-atc-btn').textContent = 'Upload a drawing to continue'; }