Discount Ninja Promo Engine

Discount Ninja Promo Engine Logo

Built for Shopify

Discount Ninja Promo Engine

Rating

0

%

Recommended

(

1

reviews

)

Pricing

From $49/month. Free trial available.

Developer

Launched

23-Aug-17

Discount Ninja Promo Engine Logo

Built for Shopify

Discount Ninja Promo Engine

Rating

0

%

Recommended

(

1

reviews

)

Pricing

From $49/month. Free trial available.

Developer

Launched

23-Aug-17

Discount Ninja Promo Engine Logo

Built for Shopify

Discount Ninja Promo Engine

Rating

0

%

Recommended

(

1

reviews

)

Pricing

From $49/month. Free trial available.

Developer

Launched

23-Aug-17

Run promotions like a pro. Provide personalized incentives to your customers to increase AOV.

Discount Ninja is a promotion engine that allows you to quickly set up promotions that convert. View real-time reports to know exactly how the app is growing your average order value. Personalized promotions come to life everywhere in your online store (product page, collections, cart and checkout). The app includes widgets to communicate your promotions to your audience throughout the buyer journey. They blend into your shop and allow you to stay on brand while you increase conversion.

Categories:

Discounts, Upsell and cross-sell

Integrations:

Checkout, Shopify Admin, AfterPay, Currency Converters, Klaviyo, Loyalty Lion, Smile.io, Swell

Checkout, Shopify Admin, AfterPay, Currency Converters, Klaviyo, Loyalty Lion, Smile.io, Swell

Languages:

English

English

Filter Reviews

Operator reports

0

%

Recommended

(

1

reviews

)
Photo of Reviewer Andy H.

Andy H.

Role:

Owner

Category:

Food & Drink

Shopify Plan:

Plus

Overall satisfaction

Not Satisfied

May 21, 2026

Years of use:

More then 3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

No

Importance:

Critical for me to do my job

What exceeded expectations

Offered a variety of discounting options not available in the native platform.

What was disappointing

Too many conflicts with other apps, and easy to "break." Was much improved when it moved to the native shopify API but still had limitations. We're much happier using just the built in discounts now and living with the limitations Shopify has.

Photo of Reviewer Andy H.

Andy H.

Role:

Owner

Category:

Food & Drink

Shopify Plan:

Plus

Overall satisfaction

Not Satisfied

May 21, 2026

Years of use:

More then 3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

No

Importance:

Critical for me to do my job

What exceeded expectations

Offered a variety of discounting options not available in the native platform.

What was disappointing

Too many conflicts with other apps, and easy to "break." Was much improved when it moved to the native shopify API but still had limitations. We're much happier using just the built in discounts now and living with the limitations Shopify has.

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