Skip to main content
The agent public profile is the public, indexable reputation page for one agent: headshot, bio, service areas, badges, aggregate rating, published testimonials, and a referral CTA. The profile follows the Growth Studio public render pattern: a draft/published lifecycle, an unauthenticated route that only ever reads PUBLISHED config, and rendering through approved Winnerr block components.

Profile lifecycle

StatusBehavior
DRAFTEdits land in draftConfig. The public URL still serves the last publishedConfig, or 404 if never published.
PUBLISHEDpublishedConfig is live at the public URL. Subsequent draft edits do not affect the live page until re-published.
Editing the profile updates draftConfig. The live page does not change until you call publish:
curl -X POST https://api.winnerr.ai/api/reputation/profile/publish \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "agentUserId": "user_789" }'
Publish validates the saved draftConfig against the approved-block schema, copies it into publishedConfig, flips the status to PUBLISHED, and stamps publishedAt. If the body is omitted, the publish call defaults to the caller’s own profile.

Slug, custom domain, and branding

Each AgentPublicProfile carries:
FieldPurpose
slugOrg-scoped slug used in the public URL.
customDomainOptional vanity domain (same pattern as ClientPortal).
brandKitIdReference to a Brand Kit for colors, logo, voice, and compliance text.
displayName, headline, bioMarkdownProfile copy.
headshotR2KeyThe headshot image, served from R2 via R2_PUBLIC_URL.
serviceAreas, specialtiesArrays surfaced as chips on the profile.
licenseNumber, brokerageNameHydrated from AgentInfo.
socialLinksOptional public socials.
seoTitle, seoDescription, isIndexableSearch engine and crawler controls.
The Brand Kit is shared with the marketing surface, so updating colors or compliance footer once propagates everywhere the agent’s brand renders.

What renders on the profile

Once published, the profile assembles:
  • Hero — headshot, display name, headline, brokerage info, aggregate rating.
  • Aggregate stats — total reviews, average rating, NPS, response rate, review velocity.
  • Testimonials — the agent’s PUBLISHED + PUBLIC testimonials, ordered by sortOrder then createdAt. Featured testimonials surface first.
  • Badges — awarded AgentBadge records and progress on ReputationMilestone goals.
  • Referral CTA — a form that posts to the public referral endpoint.
Permission flags on each testimonial are honored automatically: a testimonial without permissionUsePhoto simply omits the photo; one without permissionUseName falls back to authorDisplayName (“Jane D.”).

Embeddable reviews widget

The same approved testimonials and reputation aggregate that power the profile can also be embedded on your own website. Widgets are created and managed separately under Reputation → Widgets — see Reviews widget for the full guide including the one-line embed snippet, layout options, and the per-site origin allowlist.

Reputation aggregate

The ReputationAggregate is the denormalized rollup that powers the profile, widget, broker dashboards, and lead routing. It is computed at agent scope (one row per agent) and optionally at org scope (scope: ORG, agentUserId: null) for org-wide rollups. Read it via the authenticated API:
curl https://api.winnerr.ai/api/reputation/aggregate?agentUserId=user_789 \
  -H "Authorization: Bearer $TOKEN"
Aggregates recompute automatically when a testimonial is published or unpublished.