Publish a DPP on a Shopify storefront
Connect a Shopify shop to a Keyban Digital Product Passport (DPP) application, let the catalogue synchronise automatically, and deliver an on-chain passport to every buyer when they receive their order.
What you'll build
A Shopify shop whose products map to Keyban DPP model passports, and whose orders mint individual item passports that buyers can claim from a Keyban-powered front-end.
- Time~20 min
- DifficultyBeginner — no code
- You'll needKeyban admin · Shopify dev store · DPP app
How it goes, end to end
Step 1: Install
Connect Shopify from the Sources page.
Step 2: Sync
Product changes flow to Keyban automatically.
Step 3: Buy
Payment reserves placeholder passports.
Step 4: Ship
Fulfillment activates them and sends the email invite.
Step 5: Claim
The buyer signs in; the passport mints on-chain.
In short: you install once, the catalogue then syncs itself, and every order triggers a reserve → activate → claim sequence between Shopify and the buyer's wallet.
Prerequisites
- A Keyban admin account that can manage integrations on the target organization. If your account can't see Catalog → Sources, ask an organization owner to grant you the right.
- A Keyban DPP application already created in the Keyban admin console — you will work from inside that application throughout the tutorial.
- A Shopify shop (a development store works fine). No prior install of the Keyban Shopify app is needed: it's published on the Shopify App Store and the OAuth flow you'll start in Step 1 takes care of the install.
Step 1 — Connect your Shopify shop
Open your DPP application in the Keyban admin console and go to Catalog → Sources. The Connections tab lists the data sources available for your passport catalogue: Shopify (automated sync) on the left, manual file imports (JSON/CSV/Excel/XML) on the right.
On the Shopify card, click Connect. A small dialog opens and asks for one piece of information: the canonical domain of the shop you want to link, ending in .myshopify.com — your custom storefront domain (e.g. shop.example.com) is not accepted here.
Validate, and you're redirected to Shopify's standard OAuth screen to approve the install. Once you confirm, the admin lands you back on the Sources page; the Shopify card is now marked as connected and the catalogue sync starts in the background.
Verify your install
The OAuth callback creates a single shop-level metafield definition (keyban.app_url) that exposes the public DPP application URL to your Shopify themes and storefront apps. In the Shopify Admin, navigate to Settings → Custom data → Shop — you should see an entry called Keyban App URL.
| Property | Value |
|---|---|
| Namespace | keyban |
| Key | app_url |
| Type | URL |
| Owner | Shop (single value, scoped to the whole store) |
| Description | URL to the Keyban DPP application |
| Value | https://{app.slug}.{dpp-domain} (the public URL of your DPP app) |
The value is computed from the DPP application's slug and the platform's DPP domain. It updates automatically if you rename the application in Keyban — a database subscriber detects the rename and pushes the new URL back to the metafield.
You'll wire this metafield into the storefront and shipping email in the Shopify integration guide.
Step 2 — The catalogue stays in sync automatically
Right after the install, Keyban walks through your Shopify catalogue once and creates a model passport for every product. These models are the read-only mirror of your Shopify items: the Shopify product is the source of truth, the passport is its on-chain reflection.
From that point on, the integration is event-driven — Shopify pushes an event to Keyban every time something changes on your shop:
| What you do in Shopify | What happens in Keyban |
|---|---|
| Create a new product | A new model passport is created. |
| Edit a product (title, description, images, vendor, variants) | The matching model passport updates automatically. |
| Delete a product | The matching model passport is deleted, provided no item passports have been minted yet. |
And one event the other way — Keyban → Shopify: rename your DPP application from the Keyban console and the keyban.app_url shop metafield refreshes itself in Shopify, so your storefront and email links keep pointing to the right URL.
You don't have to trigger anything. To check what just happened, switch to the History tab on the Sources page or filter the Passports list on source = shopify.
For the curious, a model passport mirrored from Shopify carries granularity = model, source = shopify (which makes it editable = false — see How passports are created), the Shopify product id mapped to modelNumber, and the title/description/images/tags carried into the passport's standard fields.
Step 3 — Place a test order (passports are reserved)
From the Shopify Admin, place a draft order on one of the synced products and mark it as paid (or use a real test purchase if your store supports it).
When Shopify confirms the payment, Keyban reserves one placeholder item passport per ordered unit. A line with quantity 3 reserves three placeholders, one for each unit. The placeholders are stored as published passports on Keyban's side — but they're not yet bound to your buyer and your buyer has no way to claim them yet.
Nothing is emailed to the buyer at this stage either. The default Shopify order confirmation goes out as usual; it doesn't mention the DPP unless you customise it. We deliberately defer the announcement to the next step, when the passport is actually claimable.
For the curious, each reserved passport has granularity = item, source = shopify, the Shopify product id mapped to modelNumber, and a stable item key derived from the line and the unit position (itemNumber = {lineItemId}#{index}).
Step 4 — Ship the order (passports activate, buyer is invited)
Mark the order as fulfilled in the Shopify Admin (or trigger fulfillment from your fulfillment app — this is the "shipped" event).
This is the trigger that activates the placeholder passports from Step 3: Keyban records the buyer's email on each item and queues the on-chain mint. From this moment on, the passports are claimable by anyone signing in with that email.
To get the buyer to claim, customise the Shipping confirmation notification in Settings → Notifications → Shipping confirmation and add a link to the DPP application URL (and optionally a QR code). The Shopify integration guide walks you through the exact snippet to paste. Customising the template is the integrator's responsibility — without it, the buyer never sees the DPP link, even though their passport is ready.
Step 5 — The buyer signs in and gets their passport
The buyer opens the Shipping confirmation email, clicks the DPP link (or scans the QR), lands on the Keyban consumer experience, and signs in with the email used at checkout.
That sign-in is the last step of the chain: Keyban matches the email against the activated passports from Step 4, runs the on-chain mint, and the passport is now provably owned by the buyer's wallet. They can keep it, transfer it, resell it, or just show it off.
Next steps
- Customise the storefront and the shipping email — embed the DPP URL and a QR code on the product page and in the shipping confirmation email: Shopify integration guide.
- Understand passport sources and editability — why Shopify-sourced passports are read-only: How passports are created.
- Browse the integration endpoints — the admin endpoints behind the OAuth and management flows:
/backend-openapi#tag/Integrations.