Locksmith

Locksmith Logo

Built for Shopify

Locksmith

Rating

100

%

Recommended

(

2

reviews

)

Pricing

From $12/month. Free trial available.

Developer

Launched

29-Oct-14

Locksmith Logo

Built for Shopify

Locksmith

Rating

100

%

Recommended

(

2

reviews

)

Pricing

From $12/month. Free trial available.

Developer

Launched

29-Oct-14

Locksmith Logo

Built for Shopify

Locksmith

Rating

100

%

Recommended

(

2

reviews

)

Pricing

From $12/month. Free trial available.

Developer

Launched

29-Oct-14

Access control for the Online Store channel. Lock any content; grant access with passcodes and more.

Locksmith lets you control access to products, pages, collections, or your entire store in your Online Store channel. Add Locks to any piece of content to restrict access and/or hide it from view. Add Keys to locks: these are conditions under which a visitor gets access. These access conditions include customer account tags, email addresses, passcodes, secret links, geographic location, purchase history, date/time, and more. Combine keys as needed, and custom logic is also possible using Liquid.

Categories:

Accounts and login

Integrations:

Checkout, Shopify Admin

Checkout, Shopify Admin

Languages:

English

English

Filter Reviews

Operator reports

100

%

Recommended

(

2

reviews

)
Photo of Reviewer Stephanie S.

Stephanie S.

Role:

Owner

Category:

Fashion & Apparel

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Sep 9, 2025

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:

Critical for me to do my job

What exceeded expectations

I love being able to hide or make certain products only accessible when I want them to be. The flexible plan cost has really been helpful. I needed this app and it's affordable.

What was disappointing

I've not been disappointed at all. The app has performed as advertised and has been helpful in my business.

Photo of Reviewer Stephanie S.

Stephanie S.

Role:

Owner

Category:

Fashion & Apparel

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Sep 9, 2025

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:

Critical for me to do my job

What exceeded expectations

I love being able to hide or make certain products only accessible when I want them to be. The flexible plan cost has really been helpful. I needed this app and it's affordable.

What was disappointing

I've not been disappointed at all. The app has performed as advertised and has been helpful in my business.

Photo of Reviewer Emily S.

Emily S.

Role:

Owner

Category:

Health & Beauty

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Jul 24, 2024

Years of use:

More then 3 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

Amazing customer service! The product works perfectly to lock certain parts of my site from certain customers.

What was disappointing

Everything has been great! No complaints at all. Any small issues I’ve had have been immediately resolved by the locksmith team.

Photo of Reviewer Emily S.

Emily S.

Role:

Owner

Category:

Health & Beauty

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Jul 24, 2024

Years of use:

More then 3 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

Amazing customer service! The product works perfectly to lock certain parts of my site from certain customers.

What was disappointing

Everything has been great! No complaints at all. Any small issues I’ve had have been immediately resolved by the locksmith team.

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