Product
8 min read

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.

Emma Williams

Emma Williams

Product Manager

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:

typescript
// 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

typescript
// 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:

tsx
// 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:

typescript
// 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/month
Start free — explore the API
Start building today

Company 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

Product
crm
enrichment
b2b saas
metadata
company data
automation