# Points & rewards stores > Sell your products for points — your site keeps the balances; we price every variant in points, show them with the embed, keep your prices in sync and produce and ship each order. Source: https://swaglists.com/docs/points-store For rewards programs, company stores and loyalty catalogs where customers pay with **points** your website keeps. We never hold point balances: we give every product variant a points price, show it, and produce and ship the orders your server places. ## Setup 1. **Settings → Pricing:** choose *Our wholesale price + my markup* so your prices follow our costs automatically, turn on **Show prices in points**, and set how many points one dollar is worth (e.g. 100) and the rounding (e.g. up to a multiple of 10). Accept the pricing terms (needed for live orders). See [Retail prices](https://swaglists.com/docs/pricing.md#retail-prices). 2. **Developers → Embed:** create a publishable key for your website and add the [embed](https://swaglists.com/docs/embed.md) where the products should appear — `data-button-label="Redeem"` and `data-points-label="points"` (or your program's name) suit most programs. 3. **Developers → API keys:** create a secret key for your server. ## Redeeming ```text customer picks a variant ──► swaglists:select event (product_variant_id, quantity, retail_points) your server ──► GET /v1/product_variants?sku=… (re-check retail_points — never trust the browser) ──► deduct the points from the customer's balance ──► POST /v1/orders { items: [{ product_variant_id, quantity }], recipient } we ──► charge your prepaid credits the wholesale price, produce and ship under your brand ``` Deduct points only after `POST /orders` succeeds (or refund them when it fails), and send an `Idempotency-Key` so a retried request never creates a second order. Order updates and tracking arrive as [webhooks](https://swaglists.com/docs/webhooks.md); refund the points if an order is canceled. Credits: an order is only sent to production when your credits cover it — keep enough credits (Billing) or choose what happens otherwise in Settings → Orders. ## Keeping points prices in sync Load every variant's `retail_points` once with `GET /v1/product_variants`, then subscribe to [`product.prices_changed`](https://swaglists.com/docs/events.md#product.prices_changed): it lists each variant whose points price moved, with the old and new value — after our costs change, or when you change your markup or points settings. The embed always shows current prices. ## Taxes Sales tax on your orders is added to the wholesale charge from your credits (unless your account is tax exempt); your customers pay only points.