Product Options Variant Option

Product Options Variant Option Logo

Built for Shopify

Product Options Variant Option

Rating

100

%

Recommended

(

1

reviews

)

Pricing

Free plan available. Free trial available.

Launched

19-Dec-21

Product Options Variant Option Logo

Built for Shopify

Product Options Variant Option

Rating

100

%

Recommended

(

1

reviews

)

Pricing

Free plan available. Free trial available.

Launched

19-Dec-21

Product Options Variant Option Logo

Built for Shopify

Product Options Variant Option

Rating

100

%

Recommended

(

1

reviews

)

Pricing

Free plan available. Free trial available.

Launched

19-Dec-21

The product options solution for you – simple to start, powerful to grow!

Create unlimited custom options in minutes – no code needed. Let customers preview their custom texts, images, and design inputs live on product images – perfect for POD, gift, and custom products. Use swatches, dropdowns, checkboxes, text fields & more to personalize every shopping journey. Boost sales with add-on pricing, upsells & smart conditional logic. Seamlessly sync with orders, emails & packing slips for easy tracking and fulfillment. Mobile-optimised and backed by real humans 24/7.

Categories:

Product variants, Custom products - Other

Integrations:

Checkout, Shopify Admin, BOGOS.io Free Gift Buy X Get Y, BON: Loyalty Program & Rewards, Ecomposer Page Builder, Opus Cart Upsell Cart Drawer, Transcy: AI Language Translate, UpPromote Affiliate Marketing

Checkout, Shopify Admin, BOGOS.io Free Gift Buy X Get Y, BON: Loyalty Program & Rewards, Ecomposer Page Builder, Opus Cart Upsell Cart Drawer, Transcy: AI Language Translate, UpPromote Affiliate Marketing

Languages:

English, German, French, Japanese, Spanish, Italian, Portuguese (Brazil), Turkish, Chinese (Simplified), Portuguese (Portugal)

English, German, French, Japanese, Spanish, Italian, Portuguese (Brazil), Turkish, Chinese (Simplified), Portuguese (Portugal)

Filter Reviews

Operator reports

100

%

Recommended

(

1

reviews

)
Photo of Reviewer Michael T.

Michael T.

Role:

E-commerce Manager

Category:

Fashion & Apparel

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Mar 14, 2025

Years of use:

1-2 years

Relationship with this product:

I was the buyer, not really a user

Still use this tool:

Yes

Importance:

Valuable but not essential

What exceeded expectations

It's been great for adding additional income from orders.

What was disappointing

Can't use it on the quick buy. Can only work on the product page.

Photo of Reviewer Michael T.

Michael T.

Role:

E-commerce Manager

Category:

Fashion & Apparel

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Mar 14, 2025

Years of use:

1-2 years

Relationship with this product:

I was the buyer, not really a user

Still use this tool:

Yes

Importance:

Valuable but not essential

What exceeded expectations

It's been great for adding additional income from orders.

What was disappointing

Can't use it on the quick buy. Can only work on the product page.

import * as React from "react" type Props = { name: string slug: string description: string image: string developer: string categories: string pricing: string launchedAt: string dateModified: string ratingValue: number ratingCount: number faqQ1: string faqA1: string faqQ2: string faqA2: string faqQ3: string faqA3: string faqQ4: string faqA4: string faqQ5: string faqA5: string } export function SchemaMarkup(props: Props) { const { name, slug, description, image, developer, categories, pricing, launchedAt, dateModified, ratingValue, ratingCount, faqQ1, faqA1, faqQ2, faqA2, faqQ3, faqA3, faqQ4, faqA4, faqQ5, faqA5 } = props const scriptContent = ` (function () { var ORIGIN = window.location.origin; var SAT = { "Very Satisfied": 100, "Neutral": 50, "Not Satisfied": 0 }; var AGG_NOTE = "Percentage of vetted Shopify merchants and agency operators who recommend this app, based on first-party reviews collected by app store research."; function read(root, key) { if (!root) return ""; var el = root.querySelector('[data-k="' + key + '"]'); return el ? el.textContent.trim() : ""; } function iso(v) { if (!v) return null; var d = new Date(v); return isNaN(d) ? null : d.toISOString().slice(0, 10); } function notes(text) { return { "@type": "ItemList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": text }] }; } var root = document.getElementById("asr-seo-data"); if (!root) return; var NAME = read(root, "name"); var SLUG = read(root, "slug"); if (!NAME || !SLUG) return; var PAGE_URL = ORIGIN + "/shopify-app-reviews/" + SLUG; function collectReviews() { var out = []; Array.prototype.forEach.call( document.querySelectorAll(".asr-review-seo"), function (n) { var author = read(n, "author"); var pos = read(n, "positive"); var neg = read(n, "negative"); if (!author || (!pos && !neg)) return; var r = { "@type": "Review", "author": { "@type": "Person", "name": author }, "itemReviewed": { "@id": PAGE_URL + "#app" } }; var d = iso(read(n, "date")); if (d) r.datePublished = d; var s = read(n, "satisfaction"); if (s && SAT.hasOwnProperty(s)) { r.reviewRating = { "@type": "Rating", "ratingValue": String(SAT[s]), "bestRating": "100", "worstRating": "0", "alternateName": s }; } if (pos) r.positiveNotes = notes(pos); if (neg) r.negativeNotes = notes(neg); out.push(r); } ); return out; } function buildGraph(reviews) { var app = { "@type": "SoftwareApplication", "@id": PAGE_URL + "#app", "name": NAME, "url": PAGE_URL, "applicationCategory": "BusinessApplication", "operatingSystem": "Web (Shopify)" }; var v; if ((v = read(root, "description"))) app.description = v; if ((v = read(root, "image"))) app.image = v.replace(/&/g, "&"); if ((v = read(root, "developer"))) app.author = { "@type": "Organization", "name": v }; if ((v = read(root, "categories"))) app.keywords = v; if ((v = read(root, "pricing"))) { app.offers = { "@type": "Offer", "price": "0", "priceCurrency": "USD", "description": v }; } if ((v = iso(read(root, "launchedAt")))) app.datePublished = v; if ((v = iso(read(root, "dateModified")))) app.dateModified = v; if (reviews.length) app.review = reviews; var rv = read(root, "ratingValue"); var rc = parseInt(read(root, "ratingCount"), 10); if (reviews.length && rv && rc > 0) { app.aggregateRating = { "@type": "AggregateRating", "ratingValue": String(parseFloat(rv)), "bestRating": "100", "worstRating": "0", "ratingCount": String(rc), "description": AGG_NOTE }; } var graph = [app]; var faq = []; for (var i = 1; i <= 5; i++) { var q = read(root, "faqQ" + i); var a = read(root, "faqA" + i); if (q && a) { faq.push({ "@type": "Question", "name": q, "acceptedAnswer": { "@type": "Answer", "text": a } }); } } if (faq.length) { graph.push({ "@type": "FAQPage", "@id": PAGE_URL + "#faq", "mainEntity": faq }); } graph.push({ "@type": "BreadcrumbList", "@id": PAGE_URL + "#breadcrumb", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": ORIGIN + "/" }, { "@type": "ListItem", "position": 2, "name": "Shopify App Reviews", "item": ORIGIN + "/shopify-app-reviews" }, { "@type": "ListItem", "position": 3, "name": NAME, "item": PAGE_URL } ] }); return graph; } function build() { var reviews = collectReviews(); var old = document.getElementById("asr-jsonld"); if (old && old.dataset.count === String(reviews.length)) return; if (old) old.remove(); var s = document.createElement("script"); s.type = "application/ld+json"; s.id = "asr-jsonld"; s.dataset.count = String(reviews.length); s.textContent = JSON.stringify({ "@context": "https://schema.org", "@graph": buildGraph(reviews) }); document.head.appendChild(s); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", build); } else { build(); } [300, 900, 2000].forEach(function (ms) { setTimeout(build, ms); }); })(); ` return ( <> {/* HIDDEN DIV – provjeri da li je ID tačan */} {/* SCRIPT TAG – OBAVEZNO zatvoren */} </> ) } SchemaMarkup.defaultProps = { name: "Naziv aplikacije", slug: "slug-aplikacije", description: "", image: "", developer: "", categories: "", pricing: "", launchedAt: "", dateModified: "", ratingValue: 0, ratingCount: 0, faqQ1: "", faqA1: "", faqQ2: "", faqA2: "", faqQ3: "", faqA3: "", faqQ4: "", faqA4: "", faqQ5: "", faqA5: "" }