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.
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 toproperties[Initials] on the order line item. Appears instantly in Shopify Admin with no extra tooling.
Whisper Disc
Free text, max 30 chars. Live counter. Blocks Add to Cart if empty.
Engraved exactly as entered · Check spelling carefully
Disc preview
Shopify order property
Maps toproperties[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.
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
The Inner Ziva Initial Disc™ × 1 · $79.97
The Inner Ziva Whisper Disc™ × 1 · $79.97
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 |