Blog SaaS 7 min read

Integration Logo Grid Placeholders in App Marketplaces

Keep integration marketplace grids polished with integration logo placeholder images for third-party app logos that are missing, loading, or pending partner submission.

integration logo placeholderapp marketplace gridpartner logo fallbackimage fallbackSaaS integrations
Integration Logo Grid Placeholders in App Marketplaces

Integration marketplaces display grids of partner logos from dozens or hundreds of third-party services. Logo submissions are inconsistent: some partners submit high-quality SVGs, others submit JPEGs with white backgrounds, and some submit nothing at all. Integration logo placeholder images handle the gap between an integration going live in the database and a polished logo asset being available.

The fallback.pics API generates correctly sized, monogram-style placeholder logos from a URL. For any integration where a real logo is unavailable, the API can generate a placeholder with the first two letters of the integration name—similar to an avatar placeholder—that keeps the grid visually consistent.

Why logo grids break

Integration logo grid failure modes

The first failure mode is the missing logo: an integration is added to the database before the partner submits a logo. The grid has a slot for it but no image. If the template renders an empty src, the broken image icon appears in the grid.

The second failure mode is the expired logo URL: a partner updates their brand and removes the old logo from their CDN without notifying your team. Your database still has the old URL, which now returns a 404.

The third is the wrong-size logo: a partner submits a wide banner logo (e.g., 400x120) for a square tile grid (64x64). Without server-side normalization, the image renders with incorrect aspect ratio or overflows its container.

Placeholder sizing

Standard integration logo dimensions for marketplace grids

Integration marketplace tiles most commonly use square logos. Small grid tiles are 40x40 or 48x48. Medium cards use 64x64 or 80x80. Large feature tiles use 120x120. Details pages or sidebars sometimes show 160x160.

For horizontal list views (integration name + logo in a table row), logos appear at 32x32 or 40x40. Always set explicit width and height to prevent layout shift.

Implementation text
<!-- Small tile logo (48x48) -->
<img
  src="https://fallback.pics/api/v1/avatar/48?text=SF"
  width="48"
  height="48"
  alt="Salesforce integration logo placeholder"
/>

<!-- Medium card logo (80x80) -->
<img
  src="https://fallback.pics/api/v1/square/80/3B82F6/FFFFFF?text=HB"
  width="80"
  height="80"
  alt="HubSpot integration logo placeholder"
/>

<!-- Feature tile (120x120) -->
<img
  src="https://fallback.pics/api/v1/square/120/7C3AED/FFFFFF?text=SL"
  width="120"
  height="120"
  alt="Slack integration logo placeholder"
/>

Monogram generation

Generate monogram placeholders from integration names

The avatar route with a two-letter initials parameter produces a monogram that serves as a recognizable identifier for the integration even without a real logo. Take the first letter of each word in the integration name (Salesforce → SF, HubSpot → HS, Google Sheets → GS).

Assign a consistent color per integration by hashing the integration name to a color index. This ensures the same integration always gets the same placeholder color—important for recognition across sessions and devices.

Implementation tsx
const PLACEHOLDER_COLORS = [
  '7C3AED', '3B82F6', '10B981', 'F97316',
  'EC4899', 'EAB308', '14B8A6', '6366F1',
];

function integrationInitials(name: string): string {
  return name
    .split(/\s+/)
    .slice(0, 2)
    .map((w) => w[0].toUpperCase())
    .join('');
}

function integrationPlaceholderUrl(name: string, size = 80): string {
  const initials = integrationInitials(name);
  const colorIndex = name.charCodeAt(0) % PLACEHOLDER_COLORS.length;
  const bg = PLACEHOLDER_COLORS[colorIndex];
  return `https://fallback.pics/api/v1/avatar/${size}/${bg}/FFFFFF?text=${initials}`;
}

onerror pattern

Fallback to monogram when real logo fails to load

Even for integrations that have submitted logos, keep the onerror fallback active to handle CDN failures and expired URLs. Generate the monogram placeholder at the same size as the real logo so there is no layout shift when the fallback triggers.

Implementation tsx
function IntegrationLogo({
  integration,
  size = 80,
}: {
  integration: { name: string; logoUrl?: string };
  size?: number;
}) {
  const fallback = integrationPlaceholderUrl(integration.name, size);
  return (
    <img
      src={integration.logoUrl ?? fallback}
      width={size}
      height={size}
      alt={`${integration.name} logo`}
      onError={(e) => {
        e.currentTarget.onerror = null;
        e.currentTarget.src = fallback;
      }}
    />
  );
}

Partner submission flow

Display placeholder during partner logo review

If your marketplace has a partner logo submission and review workflow, the integration may go live before the submitted logo clears your review queue. Display the monogram placeholder in the 'pending review' state and swap in the real logo only after it passes review.

This is preferable to hiding the integration from the grid until review completes—a missing entry is more confusing than a placeholder entry.

Implementation tsx
// Integration with logo review state
function logoSrc(integration: Integration): string {
  if (integration.logoStatus === 'approved' && integration.logoUrl) {
    return integration.logoUrl;
  }
  return integrationPlaceholderUrl(integration.name);
}

Dark mode

Dark mode logo grid considerations

Real partner logos often have transparent backgrounds designed for light mode. On a dark background they appear as white-border-free logos that may be nearly invisible. A monogram placeholder with an opaque colored background avoids this entirely.

Consider normalizing all partner logos server-side to add an opaque background before serving them, or maintain separate dark-mode logo variants. Until you have that infrastructure, the monogram placeholder is the safest option for dark mode.

Key takeaways

What to standardize before shipping

  • Integration logo grids break in three ways: missing logo, expired CDN URL, and wrong-aspect-ratio submission—cover all three with a monogram fallback.
  • Generate consistent monogram placeholders from integration names by extracting two-letter initials and hashing the name to a color.
  • Use the avatar route for circular logo tiles and the square route for card-style logo containers.
  • Keep onerror active even for integrations with submitted logos to handle CDN failures and URL expiration.
  • Display monogram placeholders for integrations pending logo review rather than hiding them from the grid.

Production fallback layer

Use fallback.pics anywhere an image URL is accepted.

Start with one deterministic URL and standardize fallback behavior across your design system.

Read the docs