Koovira Dev Docs
20-modules/business-directory/overview.md

Module: Business Directory & Marketplace (business_directory / โ€”)

Status: ๐ŸŸก Partially implemented (3M listings; claim conversion = 0.00%) ยท Last validated: 2026-09-06 ยท Priority: P0

The scraped/imported business directory + city marketplace discovery, and the merchant claim funnel that converts a scraped listing into an owned profile. Validated against classs/BusinessListingsModule.php, classs/ClaimKycModule.php + schema.

A. Purpose

Discovery of ~3M businesses (SEO + city marketplace), with a claim โ†’ verify โ†’ own path that is the top-of-funnel for merchant acquisition. Revenue: verified badge, boosts (buyBoost), and downstream module memberships once claimed.

B. Actors

Anonymous searcher; a business owner claiming their listing; admin (claim approval).

C. Entry points

/businesses.php, /directory.php, /marketplace.php?city=. Claim via ClaimKycModule (claim_otp.php).

Reachability caveat โ€” UPDATED 2026-09-06: directory.php and marketplace.php are still not in any nav registry (grepped incfiles/nav/_nav_map.php โ€” zero hits for marketplace.php; directory.php appears only in a comment, "nothing links to"), reachable mainly via Universal Entry routing and SEO. But businesses.php is now nav-linked ("Browse Directory") and a brand-new page, /business_directory_intro.php ("Claim Your Business"), was added to the main nav on 2026-09-05 โ€” see incfiles/nav/_nav_map.php:302-313 and the page's own header comment at business_directory_intro.php:1-36. This directly changes the headline gap below โ€” read that section's correction before citing "no CTA" from this doc's own earlier text.

E. Feature registry (prefix DIR-)

IDFeatureActorMethodTablesStatus
DIR-001Search businessesanonsearchBusinesses :993entity_listings๐ŸŸข
DIR-002Business profile viewanongetBusinessProfile :797company_business_profiles, entity_listings๐ŸŸข
DIR-003Save business profileownersaveBusinessProfile :534company_business_profiles๐ŸŸข
DIR-004Module listings for a companyownercompanyModuleListings :930module tables๐ŸŸข
DIR-005Claim a listingownerClaimKycModule::submitListingClaim :685claim_kyc_requests, entity_listing_claims๐ŸŸก (0 claims)
DIR-006Buy boost (paid promotion)ownerbuyBoost :1366company_business_boost_orders๐ŸŸก

G. Data model (2026-09-06)

TableRowsRole
entity_listings3,025,389scraped/imported business listings (the directory)
entity_listing_claims0claims ever recorded
company_business_profiles98 (corrected 2026-09-06: doc previously said 63; live COUNT(*) today is 98 โ€” see also ../business-profiles/overview.md BIZ-003, same table)owned business profiles

H. The headline gap (corrected 2026-09-06 โ€” the promotion gap is now closed, conversion isn't)

Claim conversion is still = 0.00% (entity_listing_claims = 0, live count today). 3.02M listings, 0 ever claimed, despite a fully-built claim funnel (OTP gate, KYC document upload โ€” 6 claim_kyc_documents rows exist).

(correction: this doc previously said the gap was "entirely promotion-side: no landing page, no intro config, no claim CTA" โ€” that is no longer true as of yesterday. business_directory_intro.php (added 2026-09-05, public, $kvRequireLogin = false) is now a full intro-config landing page ("Claim Your Business") wired into the main nav [incfiles/nav/_nav_map.php:311], built on the same shared intro renderer as careerlab_intro.php/services_intro.php. The landing page itself documents why it was added: a prior audit found entity_listings at 3,024,465 rows and entity_listing_claims at zero, traced the cause to "no landing page, no intro-registry entry, no nav path", and this file fixes exactly that. So the CTA now exists and is nav-reachable โ€” the remaining 0.00% is either (a) too recent to have converted yet (shipped 2026-09-05, one day before this count), or (b) a funnel/awareness problem downstream of the CTA (e.g. traffic, positioning, conversion on the intro page itself) rather than the CTA's mere existence. Re-check the claim count in a few weeks before re-asserting "no CTA" as the root cause.)

See ../../30-core/kyc-trust.md for the claim engine.

K. State machine (claim)

unclaimed โ†’ submitted (OTP + docs) โ†’ under_review โ†’ approved (owned) / rejected / more_info โ†’ appealed โ†’ resubmitted (loop back to under_review) or withdrawn. (corrected 2026-09-06: doc previously named the states claim_submitted and appeal; the real, validated state list is ['submitted', 'under_review', 'more_info', 'approved', 'rejected', 'appealed', 'resubmitted', 'withdrawn'] per ClaimKycModule.php:547, with 'unclaimed' as the pre-claim listing state [:589, :735].) On approval the listing links to a company_business_profiles row and unlocks module enrollment.

L / M / N

Errors: DIR-E001 claim still not converting (0 claims) โ€” the promotion CTA now exists (business_directory_intro.php, nav-linked 2026-09-05), so this is no longer a "no CTA" gap; treat it as Requires Verification (funnel/traffic) until claims start appearing. DIR-E002 marketplace.php/directory.php (still) unreachable from nav โ€” businesses.php and business_directory_intro.php are the nav-reachable pair now. Depends on KYC, membership, boosts (wallet), Universal Entry (routes here). Change-impact: the claim CTA + landing page shipped 2026-09-05 โ€” re-test the claim funnel end-to-end (it works; it's now surfaced) and re-check entity_listing_claims/claim_kyc_requests counts in the next audit pass to see whether the CTA actually moved conversion.