Product architecture

How portable reputation actually works

ByName tethers every rating to a phone-verified individual. The platform's job is to verify identity once, then move that trust everywhere the professional goes — across employers, locations, and even industries.

Verify the person

Phone OTP via SMS provider + optional OAuth. The phone number is the durable identity, not the employer.

Anchor the data

UUID primary keys, immutable rating records, append-only audit log. Pros can move; ratings cannot be re-attributed.

Police the network

Configurable trust score, auto-flagging, admin review queues, location verification, ownership claims.

End-to-end rating flow

From a client scanning a QR code to a published, portable rating.

1

Scan

Client scans QR or opens byname.app/p/slug

2

Verify

Phone OTP via SMS provider

3

Submit

Stars + comment, posted to /v1/ratings

4

Score

Trust engine evaluates 0–100

5

Route

Publish or hold for moderation

6

Persist

Immutable record + audit log

Consumer

  • Search & filter
  • Rate with phone OTP
  • Save & follow pros
  • Edit / delete own ratings

Professional

  • Public profile + slug
  • QR code & business cards
  • Portable reputation
  • Insights & response

Location owner

  • Claim & verify locations
  • Manage staff roster
  • Aggregate trust signals
  • Multi-site insights

Admin

  • Approve profiles
  • Moderate flags
  • Verify locations
  • Tune rules engine

Trust & rules engine

Every rating runs through a configurable pipeline. Operators tune thresholds; the platform stays industry-agnostic.

01

Identity check

Match phone hash → existing consumer or create. Apply rate-limit (max 3 reviews / 24h / phone).

02

Content checks

Length, profanity heuristics, link spam, duplicate detection across professionals.

03

Trust scoring

Phone age, verified history, prior flags, geo distance from location → 0–100 trust score.

04

Auto-route

≥ minTrustScore → publish. Below → moderation. ≥ autoFlagThreshold reports → hide pending review.

05

Persistence

Immutable record in reviews table, UUID FK to professional. Edits create a new revision; original retained.

06

Portability

Professional ↔ location is a soft join. Pro moves → relation updates; ratings untouched.

Data model (simplified)

User             (uuid pk, phone_hash unique, role, oauth_ids[], trust_score)
Professional     (uuid pk, user_id fk, slug unique, trade, bio, verified_at, location_id fk?)
Location         (uuid pk, name, type, geo, owner_user_id fk?, verified_at)
Rating           (uuid pk, professional_id fk, consumer_user_id fk, stars, body,
                  created_at, source[QR|LINK|SEARCH], moderation_state, trust_score)
ClaimRequest     (uuid pk, location_id fk, claimant_user_id fk, status, decided_by)
AuditLog         (uuid pk, actor_id, action, target, payload jsonb, at)

Industry-agnostic by design. Add a new vertical by configuring trade lists and verification requirements — no schema changes.