Each stroke is one of our 48 static hosts, read on 13 October 2026 at 16:43. Strokes inked: 0. Not one of them could report a sale.
Count the Sale, Never the Person
countline is one file for a static shop.
It counts each visit, each checkout click and each paid order.
It sets no cookie and keeps nothing on the device.
Meta, Google and TikTok hear of a sale only after the visitor says yes to jambline.
The Line
Drop countline.js into the site's public/ folder and put this in the head of every page. The site slug is the one Galley already knows the site by.
<script defer src="/countline.js"
data-count-site="paintedmoons"
data-count-beacon="https://galley-weld.vercel.app/api/v1/beacon"></script>
Then two marks. The button that starts checkout carries data-count-sku. The page Stripe returns to carries data-count-session and data-count-amount, and the shop's own code fills the amount once its read of the order says paid. Until then the sale is not counted, so a refreshed or abandoned success page never adds one.
What Leaves the Page
| Count | When | Sent to Galley's beacon | Never sent |
|---|---|---|---|
| The visit | every page load | site, path, referrer | a cookie, an id, anything stored on the device |
| The checkout click | a click on the marked button | site, sku | who clicked |
| The paid order | the success page sets the amount | site, sku, amount, currency, 16 hex characters of a SHA-256 of the session id | the session id itself, a name, an email |
| The pixels | the paid order, after jambline's yes | to Meta, Google and TikTok through jambline: value, currency, sku, the same hash | anything at all before the yes |
The hash lets a reader of Galley's counts tell one order from a refreshed page. It cannot be turned back into the session, and it is different on every shop.
Fit It
Check what a host carries today:
node bin/countline.mjs check https://paintedmoons.vercel.appFit a Vite, Astro or Next repo. The first run prints the diff; --write commits it on a branch and --pr opens the pull request:
node bin/countline.mjs install ../paintedmoons --site paintedmoons --write --prWe pointed ads at pages that could not have told us what they sold, and our own shops were among them. The seed run of 13 October lists all 48 hosts, and the nine Painted studios that already read their orders back from Stripe are where the line pays first.
Two limits, stated. Galley's beacon counts paths today, so a checkout click or a sale rides in the path and adds one to the site's views until the beacon reads the event field. And adstudio's lead door needs a secret in the request, so data-count-lead points at the shop's own server route, which only a server-rendered success page has.