Joy: Rewards & Loyalty Program

Joy: Rewards & Loyalty Program Logo

Built for Shopify

Joy: Rewards & Loyalty Program

Rating

75

%

Recommended

(

2

reviews

)

Pricing

Free plan available. Free trial available.

Developer

Launched

28-Jun-21

Joy: Rewards & Loyalty Program Logo

Built for Shopify

Joy: Rewards & Loyalty Program

Rating

75

%

Recommended

(

2

reviews

)

Pricing

Free plan available. Free trial available.

Developer

Launched

28-Jun-21

Joy: Rewards & Loyalty Program Logo

Built for Shopify

Joy: Rewards & Loyalty Program

Rating

75

%

Recommended

(

2

reviews

)

Pricing

Free plan available. Free trial available.

Developer

Launched

28-Jun-21

Maximize retention with flexible loyalty rewards, points, referrals, VIP tiers, referrals, and POS

Joy loyalty app is a constantly updated platform, which never limits how you design, build, or integrate your loyalty program. Joy provides flexible rewards, VIP tiers, paid membership, referrals & on-brand loyalty experience across 30+ touchpoints, a bespoke loyalty page. With Joy, you own ultimate control over loyalty: limitless loyalty rewards & loyalty points, unique brand experience, customer retention, and 24/7 live chat support. Build your customer loyalty your way today with Joy!

Categories:

Loyalty and rewards, Discounts

Integrations:

Checkout, Customer accounts, Shopify POS, Shopify Flow, Shopify Admin, 25+ Integrations, Gorgias: Helpdesk, Chat & FAQ, Judge.me Product Reviews App, Klaviyo: Email Marketing & SMS, Loox ‑ Visual Product Reviews, Omnisend Email Marketing & SMS

Checkout, Customer accounts, Shopify POS, Shopify Flow, Shopify Admin, 25+ Integrations, Gorgias: Helpdesk, Chat & FAQ, Judge.me Product Reviews App, Klaviyo: Email Marketing & SMS, Loox ‑ Visual Product Reviews, Omnisend Email Marketing & SMS

Languages:

English, Spanish, Italian, French, Japanese, German

English, Spanish, Italian, French, Japanese, German

Filter Reviews

Operator reports

75

%

Recommended

(

2

reviews

)
Photo of Reviewer Bischundra M.

Bischundra M.

Owner

Fashion & Apparel

Plus

Overall satisfaction

Very Satisfied

Jan 6, 2026

Years of use:

1-2 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Valuable but not essential

What exceeded expectations

the clients receive points and updates to their account

What was disappointing

sometimes the app would deduct customers points and they would call us in assistance in getting them back in their acct

Photo of Reviewer Bischundra M.

Bischundra M.

Owner

Fashion & Apparel

Plus

Overall satisfaction

Very Satisfied

Jan 6, 2026

Years of use:

1-2 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Valuable but not essential

What exceeded expectations

the clients receive points and updates to their account

What was disappointing

sometimes the app would deduct customers points and they would call us in assistance in getting them back in their acct

Overall satisfaction

Neutral

Dec 4, 2024

Years of use:

2-3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Not very important

What exceeded expectations

It is very easy to use and so nice to give customers rewards.

What was disappointing

I wish only customers ordering through our shopify store received points. Not orders coming from other sites like Faire.com

Photo of Reviewer Nikole R.

Nikole R.

Owner

Food & Drink

Plus

Overall satisfaction

Neutral

Dec 4, 2024

Years of use:

2-3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Not very important

What exceeded expectations

It is very easy to use and so nice to give customers rewards.

What was disappointing

I wish only customers ordering through our shopify store received points. Not orders coming from other sites like Faire.com

Related Apps

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: "" }