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.
Scan
Client scans QR or opens byname.app/p/slug
Verify
Phone OTP via SMS provider
Submit
Stars + comment, posted to /v1/ratings
Score
Trust engine evaluates 0–100
Route
Publish or hold for moderation
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.
