Pacing Spaces
A private page for each client, plus a staff hub to run them. Internal for now: only the team can open them.
Next steps
Approve the new landing page
Send the product photos
Review the October report
Quick links
Latest proposal
Meeting notes
Monthly report
Ask us for something
Each client we work with gets a small private site of its own, at its own pacing.agency address, where the work lives in one place: the meeting bar with the last and next meeting, the next steps, the links that matter, and a form to ask us for something. We built it because the first one, made for a single client, was never going to survive being copied twelve times. So there is one engine, and each client is a short config file on top of it.
It's internal for now: every space is up, and only our team can open them.
What a client gets
- A home page that fits them. A paid-search board, a tool page, a tracking page or a report with numbered chapters, chosen per client.
- The meeting bar. On every page: when we last met and when we meet next.
- Next steps and quick links. No hunting through email for the proposal or the last set of notes.
- A request form. A client writes what they need, picks a category and can drop in a screenshot. It lands in our CRM as a client request, and Ben and Cam get an email.
- Nothing sensitive. No personal enquiry details and no invoice files, only the status of things.
What the team gets
A staff hub, for Ben and Cam only. It has a morning view of open and overdue tasks, open client requests and the spaces we host, a page per client, the tools each client uses, and a requests list you can filter by client. An access page shows who can open what and flags where that's drifted from what's actually switched on in Cloudflare. Deploys and access changes are queued from the hub, with a log of who asked for what.
How access works
Cloudflare Access is the lock: Google sign-in, named email addresses only, never a whole domain. Both Workers also check the sign-in token themselves and refuse the request if it's missing or wrong, so a mistake in one place doesn't leave a door open. Access is set up before a space is deployed, so an address is never public, not even for a minute. Pages are marked noindex, and the default Workers addresses are switched off.
How it's put together
It's two Cloudflare Workers in one repo. One is the client-space engine: it reads each client's config from our ops repo, builds static pages, and runs a small request endpoint. The other is the staff hub. Client facts (address, who can sign in, links, meeting dates) stay in the ops repo, not in the engine, so the engine can be shared without the facts leaking into it.
| Piece | Job |
|---|---|
| Cloudflare Access | Google sign-in for named people, one app per address. |
| Cloudflare Workers | One per client space, plus one for the staff hub. Static pages and the request endpoint. |
| Cloudflare D1 | The hub's action queue and activity log. |
| Twenty | Where client requests and tasks are saved, and where the hub reads them from. |
| Resend | The email to Ben and Cam when a request comes in. |
| GitHub | The code, the checks on each change and the deploy workflow. |
It's built for how we work, so the alternative, a hand-made dashboard for every client that slowly goes out of date, never happens.
Other things we built
- Built by us
Pacing Journey
The stored visits and forms from one person on one timeline.
See the build+4
- Built by us
Pacing TechStack
Our in-house scanner lists the tools and tracking a website runs. A quick scan takes about 5 seconds.
See the build - Built by us
Pacing CRM
Our own CRM: a form fill becomes a person, a deal and an instant alert.
See the build
+2
Bring your numbers.
We'll tell you if the spend makes sense.
- A 15-minute callYour goals, your challenges, and whether we're the right fit.
- A 1-hour discovery callWe dig into your numbers. Worth a hundred emails.
- A concrete planAds, a custom build or both, as a one-off project or ongoing.








