Enrich Your CRM Automatically with Company Logos, Colors & Metadata
How to build automatic company enrichment for your B2B SaaS or CRM — pulling logos, brand colors, industry classification, and employee count from a single domain lookup.
Every B2B SaaS has the same problem: a new user signs up with their work email, and your app knows almost nothing about their company. No logo, no industry, no size, no context. Building a rich, personalized experience requires data you do not have.
Company enrichment solves this by turning a domain name into a full company profile — automatically, in milliseconds.
What Enrichment Gives You
From a single domain (stripe.com), you can pull:
- Company logo (PNG, WebP, SVG at any resolution)
- Brand colors (primary, secondary, accent, background)
- Company name, legal name, and description
- Industry classification (primary and secondary)
- Employee count range and growth trend
- Social profiles (LinkedIn, Twitter/X, GitHub)
- Technology stack
- Founding year
- Headquarters location
This is the data that powers the polished UX of products like Notion, Linear, and Superhuman — where company profiles feel complete from the moment a user first logs in.
Implementing Auto-Enrichment on Signup
The best time to enrich is immediately after signup, before the user sees the dashboard for the first time:
// lib/enrichment.ts
export interface CompanyProfile {
domain: string;
name: string;
description: string;
logoUrl: string;
colors: {
primary: string;
secondary: string;
accent: string;
};
industry: string;
employeeCount: string;
social: {
linkedin?: string;
twitter?: string;
github?: string;
};
}
export async function enrichCompany(domain: string): Promise<CompanyProfile | null> {
const [logoRes, enrichRes] = await Promise.all([
fetch(`https://img.logorouter.com/${domain}?size=256&format=webp`),
fetch(`https://api.logorouter.com/v3/${domain}/enrichment`, {
headers: { Authorization: `Bearer ${process.env.LOGOROUTER_API_KEY}` },
}),
]);
if (!enrichRes.ok) return null;
const data = await enrichRes.json();
return {
domain,
name: data.name,
description: data.description,
logoUrl: `https://img.logorouter.com/${domain}?size=256&format=webp`,
colors: data.colors,
industry: data.industry?.primary ?? 'Unknown',
employeeCount: data.employees?.range ?? 'Unknown',
social: data.social ?? {},
};
}Wiring It into Signup
// app/api/auth/signup/route.ts
import { enrichCompany } from '@/lib/enrichment';
import { db } from '@/lib/db';
export async function POST(req: Request) {
const { email, name, password } = await req.json();
// Create the user
const user = await db.users.create({ email, name, password });
// Extract domain from work email
const domain = email.split('@')[1];
const isPersonalEmail = ['gmail.com', 'outlook.com', 'yahoo.com'].includes(domain);
// Enrich in the background — do not block the response
if (!isPersonalEmail) {
enrichCompany(domain).then(async (profile) => {
if (profile) {
await db.organizations.upsert({
domain,
name: profile.name,
logoUrl: profile.logoUrl,
industry: profile.industry,
primaryColor: profile.colors.primary,
});
}
});
}
return Response.json({ user, message: 'Account created' });
}Displaying Enriched Data in Your Dashboard
Once enriched, use the data to build a polished company profile component:
// components/company-profile-header.tsx
function CompanyProfileHeader({ organization }) {
return (
<div
className="flex items-center gap-4 p-6 rounded-xl border"
style={{ borderColor: organization.primaryColor + '40' }}
>
<img
src={organization.logoUrl}
alt={`${organization.name} logo`}
className="size-16 rounded-xl object-contain bg-white p-1 shadow-sm"
/>
<div>
<h1 className="text-xl font-semibold">{organization.name}</h1>
<p className="text-sm text-muted-foreground">{organization.industry}</p>
{organization.employeeCount && (
<span className="mt-1 inline-flex items-center text-xs text-muted-foreground">
{organization.employeeCount} employees
</span>
)}
</div>
</div>
);
}Keeping Data Fresh with Webhooks
Companies rebrand, get acquired, and change their logos. Set up a webhook to stay current:
// app/api/webhooks/logorouter/route.ts
export async function POST(req: Request) {
const event = await req.json();
if (event.type === 'logo.updated' || event.type === 'brand.updated') {
const { domain } = event.data;
// Re-enrich this company
const freshProfile = await enrichCompany(domain);
if (freshProfile) {
await db.organizations.update({ domain }, { logoUrl: freshProfile.logoUrl });
}
}
return Response.json({ ok: true });
}Enrichment API on Startup and above
Get logos, colors, industry classification, employee count, and social profiles from a single domain lookup. Try the free tier to explore the Logo API first.
Startup — from $29/monthCompany logos and brand data, ready in 60 seconds
500,000 requests per month, completely free. No credit card. No contracts. Upgrade to a paid plan when you are ready to scale.
- 500K requests / month free
- 30M+ company logos
- Sub-50ms global CDN
- PNG, WebP & SVG formats
- No credit card required
Topics covered