Sell your society's publications, merchandise, and back issues online. Stripe + PayPal checkout (cart-based, not external redirect — buyers stay on your site).

What you can do

  • Sell society-published books from the Library catalog (one tick box on each item).
  • Sell non-library merchandise — apparel, lapel pins, maps, anything — from a separate Store Products list.
  • Per-item shipping fees (multiplied by quantity at checkout).
  • Stock tracking (set a quantity, decrements on purchase, "Sold out" badge when zero).
  • Stripe Payment Element (card + Apple Pay + Google Pay + Link, all inline).
  • PayPal Smart Buttons (PayPal + Venmo, also inline).
  • Sell downloadable files — a PDF index, a scanned booklet. The buyer gets download links by email, good for 30 days and five downloads.
  • Give members a lower price on any product.
  • Charge sales tax, if your state requires it, set under Settings → Organization → Sales Tax Rate.
  • Per-order shipping address capture and admin order detail with fulfillment status (pending → paid → shipped → completed).

How to add your first product

Two paths depending on what you're selling:

Society-published books (county histories, family genealogies, transcribed records): use the Library. Library → Library Catalog → [item] → Edit. In the Store Listing section, tick List this item for sale in the Store, make sure Value is above 0 — that's its price — set the shipping fee per copy, and save. Recording a value on its own never puts an item in the Store, so things held in the collection stay out of it.

Other merchandise (T-shirts, pins, maps, anything that isn't a book): Money → Store Products → Add New. Title, SKU, description, price, shipping fee, image URL, store category, optional stock quantity. Save.

The storefront shows both sources merged together — buyers don't know (or care) which source a product came from.

How to set up a storefront page

SocietyPress creates a Store page and a Cart page when it is first switched on. The Store page shows a grid of products with category filters and a search box, each with Add to Cart; the Cart page handles checkout, with the Stripe and PayPal payment options appearing once the cart has something in it. If you deleted either page, create a page and choose the matching page template — "Store" or "Shopping Cart" — in the page settings.

How buyers get around a long storefront

Twenty products to a page, with numbered page links under the grid. A society selling its whole back catalogue gets a browsable storefront instead of one endless scroll.

Once a list runs past 40 items, a Show control appears above the grid offering 20, 50, or All. Below that, the pager on its own is less to look at than a choice about page length, so the control stays hidden. All is there for buyers who would rather have everything in front of them and use the browser's own find. The choice rides in the address as sp_store_show, so a buyer can bookmark or share the view they picked.

The category list stays beside the products as the buyer scrolls, so someone two screenfuls down can switch categories without scrolling back up. If your theme has a header pinned to the top of the window, the list parks below it — SocietyPress measures the header rather than guessing, and re-measures when the window is resized. A society with more categories than fit a screen gets a list that scrolls on its own.

Changing category or page size always returns to page one — landing on page 4 of a category that only has one page reads as a bug.

On a phone none of this applies: the layout stacks, and the categories become a row of pills above the grid.

How shipping fees work

Each product has a per-unit shipping fee. At checkout, line items multiply: unit_price × qty + shipping_fee × qty.

Cart total breakdown:

  • Subtotal (sum of price × qty per line)
  • Shipping (sum of shipping_fee × qty per line, only shown when > 0)
  • Total

Buyers see the breakdown live as they adjust quantities. Stripe and PayPal both charge the inclusive total.

This is per-item shipping, not flat-rate or weight-based. If you need flat-rate (e.g., "$8 for any order regardless"), set every product's shipping fee to 0 and add a single fixed-price "Shipping" product the buyer adds to their cart. Hacky but works.

How orders flow

  1. Buyer fills cart, clicks Checkout.
  2. Stripe Payment Element or PayPal Smart Button captures payment inline.
  3. SocietyPress writes the order in pending status with the cart's items.
  4. Stripe / PayPal confirms payment via webhook → order flips to paid.
  5. Stock decrements automatically (only for products with a stock_qty set).
  6. You see the order in Money → Store Orders and ship it. Mark it "shipped" → "completed" as you go.
  7. The buyer gets an order confirmation by email, with download links for any files they bought. Marking an order shipped doesn't email them — if they'd like to know, tell them yourself.

How to manage orders

Money → Store Orders. List with status tabs (All / Pending / Paid / Shipped / Completed / Refunded / Failed). Click an order to see details: customer, items, total, shipping address, payment method, transaction ID.

Per-order actions: mark shipped, mark completed, issue a refund (one click, through Stripe or PayPal). Refunds restore stock automatically.

How stock tracking works

Each product has an optional stock_qty. Leave it blank for unlimited (the common case). Set a number to track inventory.

When a product hits stock_qty = 0, the storefront shows "Sold out" instead of Add to Cart. Buyers can't add a sold-out item.

When an order is paid, stock decrements by the purchased quantity. When an order is refunded, stock restores. When an order is failed (payment didn't go through), stock restores too.

If something looks wrong

Checkout says Stripe isn't set up. Add your publishable and secret keys under Settings → Events → Online Payments — the same Stripe connection serves the Store, donations and event registrations. Test mode keys work; switch to live when ready.

PayPal Smart Button doesn't appear. Check the PayPal part of Settings → Events → Online Payments. Both client ID and secret must be filled in. The button is hidden when either is blank.

Orders are stuck in pending after payment. Webhook isn't reaching your site. Stripe dashboard → Developers → Webhooks → recent attempts shows the failure. Re-copy the signing secret into your settings if it doesn't match.

Stock isn't decrementing. Verify the product has stock_qty set (not blank). Blank = unlimited; only set values track stock. If stock IS set and not decrementing, the order may have failed payment — check its status.

Buyer says they paid but never got an order confirmation email. Check your site can send email at all — "Lost your password?" on the sign-in page with your own address is the quickest test; if it never arrives, see Email Setup. Buyer's email address is captured during checkout — check the order detail to confirm it's right.

A library item shows up in the store but shouldn't. Open the library item and untick List this item for sale in the Store. Only ticked items are sold.

There's no Show 20 / 50 / All control. It only appears once the list runs past 40 items. Below that everything fits in a page or two and the pager alone does the job. Filtering to a small category hides it too — the count that matters is the one being shown.

The category list slides under my site header. SocietyPress measures a pinned header and parks the list below it, but only for a header it can recognize — a header element, .site-header, or #masthead — that is actually stuck to the top of the window. If your theme's header is none of those, set --sp-store-sticky-top in your theme's CSS to the height you want cleared, plus a little breathing room.

  • Library — sell society-published books from the catalog
  • Donations — same Stripe path is reused