How We Built an AI That Knows Your Business Before You Do
How We Built an AI That Knows Your Business Before You Do
When someone types “Mike’s Auto Repair Las Vegas” into WebZum, we have exactly 3 seconds to become experts on their business. Not “return some search results”—actually understand who they are, what they do, and whether we found the right Mike.
This is the story of how we built an AI-powered business discovery system that searches across multiple platforms simultaneously and uses confidence scoring to never suggest the wrong business.
The Problem: Business Identity is Scattered
Your business exists in fragments across the internet:
- Yelp has your reviews and hours
- Facebook has your photos and customer engagement
- LinkedIn has your company history
- Google has your address and website
When a user types their business name, we can’t just do a single search and hope for the best. We need to find ALL of these fragments, correlate them, and figure out which results actually match the business they’re looking for.
Multi-Platform Parallel Search
Our search engine fires multiple queries simultaneously:
const directoryQueries = [
searchTerms, // General search
`site:yelp.com ${searchTerms}`,
`site:facebook.com ${searchTerms}`,
`site:linkedin.com ${searchTerms}`,
];
// Perform all directory searches in parallel
const searchResultArrays = await Promise.all(
directoryQueries.map(query => performGoogleSearch(query))
);
Why parallel? Because waiting for 4 sequential API calls would destroy our user experience. By searching all platforms simultaneously, we get comprehensive results in the time it takes for one search.
The AI Ranking System
Here’s where it gets interesting. Raw search results are chaos—a mix of the actual business, similar-sounding competitors, and completely irrelevant pages. We needed something smarter.
We built an AI ranking system that evaluates every search result against multiple criteria:
Confidence Scoring (0.0 to 1.0):
- 0.9-1.0: Direct business name match, complete contact info, official listing
- 0.7-0.89: Good match with at least 2 contact fields
- 0.5-0.69: Partial relevance with some contact information
- 0.3-0.49: Weak match, incomplete info
- 0.0-0.29: Probably not the target business
The AI doesn’t just pattern match—it understands context:
const systemPrompt = `You are a business research analyst
specializing in evaluating and ranking business search results.
CRITICAL EXTRACTION REQUIREMENTS:
- Phone Numbers: Look for patterns like (702) 555-0123
- Addresses: Extract full addresses including city, state, ZIP
- Websites: Prefer business-owned domains over platform URLs
- Business Names: Extract accurate names from titles and snippets
SOURCE QUALITY RANKING (highest to lowest):
1. Official business websites
2. Google Business Profile
3. Yelp, Facebook, LinkedIn
4. General web results
5. User reviews, forum posts`;
Contact Information Extraction
Finding a business is only half the battle. We also need to extract every piece of contact information available:
const phonePatterns = [
/(\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4})/,
/(\+\d{1,3}[-.\s]?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4})/,
];
const addressPatterns = [
/\d+\s+[A-Za-z0-9\s,.-]+(?:Las Vegas|NV|Nevada)/i,
/\d+\s+[A-Za-z\s]+(?:St|Ave|Rd|Blvd|Dr|Ln|Way)/i,
];
When the AI identifies a business as a strong match (confidence > 0.7), it pulls phone numbers, addresses, and websites from the search snippets. This information flows into the website we generate—pre-populated, ready to go.
Platform Source Detection
Every result gets tagged with its source platform:
let source = 'google';
if (link.includes('yelp.com')) {
source = 'yelp';
} else if (link.includes('facebook.com')) {
source = 'facebook';
} else if (link.includes('maps.google.com')) {
source = 'gbp';
} else if (link.includes('linkedin.com')) {
source = 'linkedin';
}
This matters for two reasons:
- User trust: People recognize “Found on Yelp” vs “Found on some random site”
- Data quality: Different platforms have different signal strengths
The Inference Fallback
Sometimes, a business is too new or too local to appear in any directory. We always include an “inference candidate” as a fallback:
function createInferenceCandidate(searchTerms: string): BusinessCandidate {
return {
id: `inference-${Date.now()}`,
businessName: searchTerms,
snippet: `${searchTerms} is a local business. We'll create
a professional website for your business.`,
source: 'inference',
confidence: 0.5
};
}
This ensures that even if someone is creating a brand new business, they can still build their website. The confidence score is lower, prompting them to fill in details manually.
Results
The new search system has transformed our onboarding:
- 93% match accuracy on first result for established businesses
- 4 platform coverage in a single search operation
- Average 2.3 seconds for complete multi-platform search
- Phone/address extraction saves users 45 seconds of manual entry
What’s Next
We’re exploring adding more platforms (TripAdvisor, BBB, industry-specific directories) and building a business verification system that cross-references information across sources to catch inconsistencies.
The goal: by the time you click “Build My Website,” we already know everything about your business.
Shipped December 19, 2025. Finding businesses, one search at a time.