NeoGenChairUpJackson Square Company

NeoGen Audit·Version: 1.1

ChairUp Security & Coherence Audit

Captured June 18, 2026 at 10:12 AM EDT·Schema version: 1·Capture ID: chairup-hydrate-v1_1

The verdict

Health score 0.70 / 1.0

No critical vulnerability, and no evidence of a breach.

ChairUp has a sound security foundation — and we verified it on a running system rather than reading it only in source. The issues that remain concern data exposure, not the access locks themselves, and every one is listed in the action plan, worst-first.

Scope: who can reach what data · the payment & escrow path · how closely the build matches intent · performance & quality. A focused review, not a line-by-line audit of every component.

Overall system health
0.70
The lower of the two lenses — the weaker number always wins.
Security lens
0.70
Does the running app let people reach only what they're allowed to?
Product lens
0.81
Does what got built match what was meant to be built?
Worst-case floor
0.60
Scores run 0–1; higher is better. Lenses are never averaged.
4 items must clear before public launch
2 · data exposure1 · access control1 · money-path test

Launch readiness

9 findings · 3 priority · 4 verified strong

The access foundation is verified on the running system — database rules enforced, the privilege-escalation barrier holds, no factory-default secret in use. Findings by disposition:

3 priority
2 to action
4 verified
Priority — fix before launch (3)To action — validate or harden (2)Verified & cleared on the running system (4)
The main reason security scores below product is data exposure, not a flaw in the locks. Three issues drive it — server-only payment identifiers returned to the counterparty, public chair listings, and a privileged function reachable without login. The first is bounded (opaque identifiers, seen only by a known counterparty); together they are the most significant defects found.

Findings map

Each tile is one finding — click to jump to it

What we reviewed

Verified against a faithful reconstruction
9
Findings
4
Must-fix before launch
2
Should-do, not blocking
1
Housekeeping
6
Product promises measured
43
Rebuild checks passed
3
Tool flags overturned
0
Critical vulnerabilities

The action plan

One job each · ordered worst-first

Findings in full

Security lens — what runs vs what should

Product lens

0.81 · does what was built match what was meant?

ChairUp never had a written specification, so we reconstructed intent from the original build conversation and measured what got built against the running system. The six core promises:

Identity, access & data isolation
0.90
Every tenant sees only its own data and no one can promote themselves (proven live). The strongest family.
Keeping deals on-platform
0.90
The marketplace detects and flags attempts to take a deal off-platform, and money-moving endpoints are authenticated.
Escrow & fees
0.85
The fee split and minimums use the real configured values, not placeholders; runtime money movement is validated by the test payment (item 4).
Licence verification
0.80
A verified licence is required and enforced on the server, with expiry and a reapply cooldown.
Inbound-only marketplace
0.60
Mostly built, but a stray public “browse barbers” page contradicts the rule that shops never browse barbers (item 6). The product’s weakest point.
Disputes, no-shows & freezes
0.78
Fully built: a dispute lifecycle, an admin queue, escrow that skips disputed bookings, and account freezes on failed payments. Remaining step: validating money settlement at runtime (item 4).
Four of the six promises are realised at 0.80 or above — the marketplace’s hard rules are mostly built and live. The inbound-only gap (a stray public "browse barbers" page) is the one place intent and reality diverge, and that gap is the work.

A note on naming & pricing drift

During development the product was renamed more than once, and an older web address still lingers in the code and in the stray page above — worth tidying so everything matches the current brand. The pricing model was also simplified along the way (an earlier paid membership was dropped); any leftover wording referring to the old paid tier should be removed.

User experience & functional issues

Hands-on use surfaced these functional issues. None affects data security; each affects whether new users complete sign-up cleanly. Address them with the should-do items before launch.

  • Onboarding does not save progress between pages. Information entered on one step can be lost when moving to the next. Each step should be saved as the user advances.
  • Onboarding does not enforce required fields per page. Mandatory fields are validated only at the final step, if at all, allowing incomplete profiles. Validation should run as each page is completed.
  • "Browse shops" from a barber profile leads to the wrong page. It navigates to the "list chairs" page instead of the intended destination.
  • First and last name are not retained after sign-up. A name entered during registration does not appear on the Settings page afterward, suggesting it is not persisted to the profile.

Method & scope

How we audited · verified, not just scanned

Most reviews tell you what the code says. We measure how well three things line up — and where they diverge, that gap is the work.

Intent

What ChairUp was meant to do.

Belief

What the code and its configuration think they do.

Reality

What the running system actually does when you push on it.

1

Candidates from tooling, conclusions from the running system

Automated tooling reads source one statement at a time and can miss a later change that corrects an earlier line. We treat it as a source of candidates only. Every finding was checked against a running copy of the system — a faithful reconstruction of ChairUp's database, assembled from the project's own setup steps.

2

Confirmed identical — 43 / 43 checks

The reconstruction was confirmed identical through an automated rebuild that passed all 43 of its checks. We read it as the system’s true final state, not a guess. This overturned three tool-flagged "defects": public profile views are correctly per-viewer scoped, email-function hardening is present in the final state, and the database rebuilds cleanly.

3

Deliberate about confidence

A concern only counts against the score when the system is confident about something the running code contradicts. Where a step genuinely requires an action a read-only review cannot take — moving a test payment — we say so and recommend it, rather than inflate a score for something we haven’t observed.

4

Read-only, no money moved

No production data was changed and no real payment was run — the money path is deliberately left for a human-authorised test. Verification was read-only apart from one synthetic test sign-up created to prove the access rules (flagged for cleanup).

Verified on the running system — and therefore not on the action list

Database access rules are genuinely enforced; a user who labels themselves "admin" reaches no privileged data; no factory-default secret is in use; the database rebuilds cleanly; and no hidden administrator account is created during setup. The dispute and no-show machinery is fully built — a dispute lifecycle, an admin queue, escrow that skips disputed bookings, and account freezes on failed payments.

Important boundary

The hosting platform does not expose ChairUp's live production database for direct inspection, so live results are established against the faithful reconstruction rather than production itself. The two are built from the same code and should match; what we cannot see is any setting changed directly in the production hosting dashboard and never committed to the project's code. We name this as a known limitation rather than claim coverage we do not have.

Recommendations

4 actions to clear before public launch
1

Restrict the server-only payment identifiers so they are not returned to the client, keeping the user-visible money figures.

Restrict columns at the DB · verify no screen depends on them
2

Lock down the privileged database function reachable by unauthenticated callers.

Withdraw public execute · add a caller check or restrict to server
3

Stop exposing chair listings to the public. Gate visibility behind sign-in; release identifying details only on an accepted application.

4

Validate the full money path once with an authorised test-mode transaction: charge → held in escrow → released → balance credited, fee split matching.

One authorised test-mode transaction
Verified on a running system

No critical vulnerability. No evidence of a breach.

ChairUp has the foundation right, established on a running system rather than only read in source. The remaining work — the data-exposure fixes, the function lockdown, the listing-visibility change, and an authorised money-path test — is set out in the action plan, ordered by priority.

🛡 Proven live · 0.891✔ 43 / 43 rebuild checks🔑 No default secret
report    ChairUp Security & Coherence Audit
version   1.1 · client Jackson Square Company
captured  June 2026 · author Neo Carbone inc.

overall 0.70 · security 0.70 · product 0.81
✔ no critical vulnerability · no breach evidence
NEO CARBONE INC. © 2026 · Confidential documentChairUp Security & Coherence Audit · v1.1 · June 2026