Snappy’s catalog spans physical products, experiences, gift cards, and donations - the full range, so there’s something for everyone. This guide leans into the tangible and experiential, because that’s where the delight compounds. Think of it as where to point the spotlight, with everything else close at hand.
What you’re building
A storefront with four surfaces, each backed by Snappy endpoints:For You
A personalized landing page of curated picks.
Catalog
The full browsable store - categories, search, filters, sort.
Product detail
Rich pages with galleries and up to three levels of variants.
Checkout
Recipient details and a shipping address, validated as they type.
Before you start
The only real setup task on your side is billing. Snappy fulfills real products to real doorsteps, so before you can place an order you need a Billing Method configured (see Billing Methods).1
Configure a billing method
In your Snappy account, set up a billing method under the account you’ll be ordering against. This is a one-time setup in the dashboard - no code required.
2
Grab your IDs
You’ll need three identifiers as you build:
accountId- the account orders are billed to. At checkout you pass it as theSnappy-Account-Idheader (not in the body).billingMethodId- the billing method within that account. Discover available methods withGET /v3/billing-methods.collectionId- the product collection you’re merchandising from. Most partners get a collection scoped to their program; if you’re not sure which one is yours, ask your Snappy contact.
3
Get your API key
All requests authenticate with an
X-Api-Key header. Your key carries scopes - for this guide you’ll want products:read, collections:read, billingMethods:read, and orders:create. See Authentication & Security.Step 1 - Fetch the catalog
Your storefront needs products. Snappy gives you a collection of them through the v3 products endpoint:- Fetch live - call Snappy when you render a page (with a short cache). Simplest to build, and you never have to think about whether prices or availability are current - they always are, straight from the source.
- Bulk import - pull the whole catalog into your own database and serve from there. A natural fit if you already have catalog infrastructure (your own search index, merchandising tools, an existing product schema). The tradeoff: your copy can drift from ours, so you’ll subscribe to webhooks to keep availability and pricing in sync (more on that below).
links.next until it’s null.
mediadrives your product imagery - use the first image as the card thumbnail.category.fullNameis a breadcrumb you can split for category filters.tagsare your personalization fuel (next step).typetells you whether this isphysical,digital,giftCard, ordonation(a single value, not an array) - useful for steering merchandising.priceRangeis what you’ll map into points.
Keeping a local catalog in sync
If you’ve chosen the bulk-import route - pulling the catalog into your own database with the Export endpoints rather than fetching live - there’s one job you take on in return: keeping your copy fresh. A product that’s out of stock or repriced on our side should reflect that on yours, ideally within minutes. Snappy handles this with webhooks. Subscribe to the stock availability event and update your local records as changes roll in, instead of re-importing the whole catalog on a timer.Step 2 - Model your points economy
Snappy’s catalog is priced in real currency. Your users think in points - recognition points, loyalty tier points, anniversary credits, whatever your program calls them. The bridge between the two is a ratio you decide and own. Pick a ratio that feels generous and legible. A round number is your friend:Step 3 - A personalized “For You” page
The “For You” page is where you earn the user’s attention. Instead of dropping them into a 2,000-item grid, you greet them with a handful of curated rails that feel hand-picked. The raw material is tags. Snappy tags span categories (“Home & Kitchen”), occasions (“Birthday”), and values (“Sustainable”, “Women-Owned”). Pull the list:GET /v3/product-tags returns a paginated { data, links } envelope (page-number pagination, page[size] max 100). Follow links.next if you need more than one page.include=tags and matching on tag names client-side (the standalone GET /v3/products endpoint also supports server-side filter[tagId] / filter[brandId] if you’d rather filter the whole catalog by ID):
Step 4 - The personalization flow
A “For You” page is only as good as what it knows. The fastest way to learn is to ask - once, gently, up front. Show a short interest picker the first time someone visits: a grid of friendly, image-led cards (“Wellness,” “Travel,” “Food & Dining,” …). Ask them to pick at least two, then assemble their rails from those choices.1
Present the interests
Render your interest buckets as tappable cards. Lead with imagery - people pick with their eyes. Require a minimum of two so you have enough signal to personalize, but keep it optional to finish: never trap someone behind this screen.
2
Store the selection
Save the chosen interest labels against the user (your database, or a cookie for a logged-out demo). That’s all the state you need.
3
Assemble their page
On the next render, build one rail per selected interest using
buildRail from Step 3, plus a featured hero and a couple of evergreen rails (“Popular this month,” “Worth saving for”).Keep this flow simple and structured - a fixed set of interests, not an open-ended “tell us in your own words” text box. Structured input is faster for users, easier to map to tags, and produces more predictable rails.
Step 5 - The catalog page
Some people know exactly what they want. The catalog page is for them: the full store, with the controls to slice it down fast. Four controls cover the vast majority of needs, and the v3 endpoint backs all of them:Step 6 - Product detail pages
When someone taps a product, give them a page worth the tap: a real gallery, a clear description, and confident variant selection. Pull the full detail for a single product. The list response you’ve been using is a lightweight summary; for the detail page, request the product directly and ask for its aggregated options matrix.media is always present, and fields=options adds the aggregated option matrix. The full list of orderable variants comes from a separate endpoint (below).
Showing variants (up to three levels)
Many products come in variations - a hoodie in three colors and five sizes, a laptop in two configurations etc. Snappy models this across up to three option levels (for example: Color, Size, and a third axis like Sports Team or Material). Rendering it cleanly takes two pieces:- The product’s aggregated
options(fromGET /v3/products/{productId}withfields=options) - what you render pickers from. Each option value carries afirstSelectableVariantyou can default to. - The product’s variants (a separate, paginated endpoint) - each concrete, orderable variant with its
selectedOptions, price, and media. The order is placed against a variant, not a product.
options come back on the product like this:
fields=price (or price,priceBreakdown) for pricing and include=brand for the variant brand:
The variant object carries no inline stock flag. To confirm a specific variant can ship to a country, call
GET /v3/variants/{variantId}/availability.Step 7 - Search and related products
Two features make a store feel alive: a search box that finds things, and “you might also like” rows that keep people exploring. Both are first-class in v3. Product search - there’s no separate search endpoint. Usefilter[search] on the catalog endpoint (Step 5) - free-text ranked across product title, category, and brand:
Step 8 - Checkout
Checkout is where good intentions meet reality: you need a real recipient and a real address. The kindest thing you can do here is make the address easy to get right.Validate the address as they type
Snappy’s autocomplete endpoint turns a half-typed string into clean, structured, shippable addresses - fewer failed deliveries, fewer support tickets.addressLine1, addressLine2, city, state, zipcode) maps onto the place-order shape (address1, address2, city, provinceCode, postalCode, plus countryCode). For verified-deliverable addresses, run a pre-flight POST /v3/orders/addresses/validate before placing the order.
Step 9 - Place the order
This is the payoff, and it’s refreshingly simple. One call creates the order:If you’ve integrated with Snappy before, you may remember a two-step dance: create a gift, then claim it. This endpoint collapses that into a single atomic call. You hand over the variant and the recipient; you get back an order. Less code, fewer round-trips, no half-finished states.
GET /v3/orders/{orderId}.
The idempotency key matters
The top-levelidempotencyKey (1 to 120 characters) makes the call safe to retry. Send the same key twice and you get the same order back - no duplicate, no double-charge. This is your safety net against the classic failure modes: a flaky network, a double-clicked “Redeem” button, a retried request.
Handle the errors people will actually hit
A few failures are worth handling gracefully, because they map to real human moments:
Every failure uses the standard v3 error envelope -
{ message, errorCode, errors[] }. Branch on errorCode, and surface message only when it’s safe to show an end user.
Step 10 - Track fulfillment with webhooks
The order is placed - now keep the recipient (and your support team) in the loop without polling. Subscribe to Snappy’s order webhooks and let updates come to you. Orders move through a predictable fulfillment lifecycle, and each transition fires an event. The fulfillment status values on V3 Orders are:
Every V3 webhook arrives in the same envelope - a
webhookData block describing the event and an eventData block with the payload. A delivery-status webhook looks roughly like:
Putting it together
We hope this guide has been a useful introduction to how to build a rewards experience on Snappy. As always, our team is available to help you craft the best experience for your customers. Reach out to your Snappy representative for any questions, needs, or feedback.API Reference
Full endpoint specs for everything used in this guide.