Business ownership is an email match, not an account/claim flow. Load-bearing platform architecture.
Decision: a business owner is recognized by an email match, with no claim system, no verification queue, no support tickets.
// admin_email is AUTHORITATIVE once set; the scraped email is only the
// implicit owner while UNCLAIMED. (Refined v2.2.396 — see the lock below.)
$isBusinessAdmin = $business->admin_email
? ($user->email === $business->admin_email)
: ($user->email === $business->email);
businesses.email — the scraped canonical contact email (public). Grants ownershipONLY while the listing is unclaimed (admin_email empty).
businesses.admin_email — the claimed / operator-set owner (never shown publicly).Set by a redeemed claim code or by Doozer staff. Solves the agency case: one admin_email across many businesses = one login to manage many.
The claim lock (v2.2.396). Originally ownership was email OR admin_email — which let a listing have TWO owners at once: whoever controlled the scraped inbox AND a different person who redeemed a claim code. Now, once admin_email is set the listing is locked to that email: the scraped email no longer grants ownership, and a claim code from a different email is refused (it cannot take over). The redeemed code records redeemed_by_email (attached to who used it). To CHANGE the email on a claimed listing the owner must request a new code, mailed to the business address (operator voids the old + clears admin_email so the new code can bind). The ownership test lives in ONE place: businessIsClaimedByViewer / businessOwnerAccount (premium.php); the redeem guard is in claimCodeRedeem (claim-codes.php).
Login is the existing magic-link flow (lb_users / currentUser()); when the email matches either column, the avatar dropdown reveals "Manage [Business]". Self-healing email backfill: repeated visits from one fingerprint enqueue a priority scrape that tries harder to find a contact email, so "I tried last week, it didn't work; today it does."
A three-tier education affordance (footer utility row, an about-this-listing page, a soft heuristic nudge) explains the model without nagging. This embodies the no dark patterns ethos and underpins owner-facing parts of the flywheel.