Case 10 · Commerce

Sold once.
Trusted every day.

The commerce system behind WPress Sentinel: Stripe Checkout embedded in presssentinel.com, a licensing server that issues, activates and moves keys, and a plugin that believes only answers it can verify.

Commerce Platform — brand markCommerce Platform — brand mark
01 // Role
Commerce architecture · Engineering
02 // Parts
Checkout · licensing server · plugin client
03 // Payments
Stripe Checkout + Billing
04 // Status
Live — presssentinel.com

A The brief

Selling a security plugin means the sale is the easy part. Every site then asks, every day, whether it is still allowed to run — and that answer has to be impossible to forge, survive the licence server being down, and never lock out a paying customer by mistake.

A.2 What it had to do

  1. 01A checkout on our own site, with card data never touching our server
  2. 02Licences issued the moment payment clears — exactly once
  3. 03Answers the plugin can prove came from us
  4. 04Paying customers never locked out by an outage

B · Checkout to licence

Bought. Issued. Verified.

Follow one purchase from checkout to an activated site. Then take the licence server offline, or refund the order, and see how the plugin answers each.

PRESSSENTINEL // CHECKOUT + LICENSING
No licence
  1. 01CheckoutEmbedded Stripe Checkout · price fixed by the server
  2. 02WebhookSignature checked · each session handled once
  3. 03Licence issuedStored hashed and encrypted · emailed
  4. 04Site activatedSeat claimed atomically · site fingerprint hashed
  5. 05Answer verifiedEd25519 signature · bundled public key

Licence

WPS-····-····-····-····

0 / 1 site · —

Customer site · wp-admin

Locked

Only the licence screen is available.

C · Capabilities

What it does.

01Embedded checkout
Stripe Checkout inside presssentinel.com. The server sets price, mode and quantity — nothing in the page can change them.
02Issued once
Each paid session can create one licence and only one; a repeated webhook is recognised and ignored.
03Keys that read clearly
WPS- keys from an alphabet without 0, O, 1 or I, stored as a hash for lookup and encrypted for resending.
04Seats claimed atomically
One site per licence, claimed in a single database step — and re-activating the same site never costs a seat.
05Moving house
Move a licence to a new site yourself, or automatically once the old one has been silent for 72 hours — with an emailed undo link.
06Self-serve billing
Cancel, change the card or download invoices in Stripe’s customer portal, reached by a signed link.
07Signed updates
Update metadata carries the package’s checksum and size; downloads use 15-minute tokens with no key in the URL.
08Seven-day grace
If the licence server can’t be reached, the last signed “valid” holds for a week. Paying customers notice nothing.

D · Engineering

How it’s built.

  1. 01

    One contract first

    Checkout, licensing server and plugin are built against one written contract. Changes go into the contract before they go into code.

  2. 02

    Only signed answers count

    Every licence answer is signed with Ed25519 and checked against the public key bundled in the plugin, within a 24-hour clock window. An unsigned error can never lock a site.

  3. 03

    Webhooks that prove themselves

    Stripe signatures are verified with a five-minute tolerance. With no secret configured, the endpoint refuses everything rather than trusting anything.

  4. 04

    Limits that can’t be spoofed

    Rate limits key on the connecting address, never on forwarded headers, so a request can’t pretend to be someone else.

Stack

  • PHP 8
  • WordPress
  • Stripe Checkout
  • Stripe Billing
  • libsodium · Ed25519
  • REST API
  • WP-Cron

Brand system

  • Sentinel blue#2F86FF
  • Bronze#D39A63
  • Ground#08090C
  • Verified#35C88A

E · Impact

By the numbers.

3
Parts, one written contract
6
Stripe events handled
7 days
Grace if the server is unreachable
0
Card details on our servers

Have something ambitious in mind?

Tell us what you’re creating — we reply within two business days.

↯ Quick contact

Just a quick question?

Ask anything — we reply within two business days.