How to Implement OG Images

Step-by-step guide to adding Open Graph images to your website

1. Basic HTML Implementation

The most straightforward way to add OG images is by including meta tags in your HTML <head> section.

Essential Meta Tags

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Your Page Title</title>
    
    <!-- Essential Open Graph meta tags -->
    <meta property="og:title" content="Your Page Title" />
    <meta property="og:description" content="Brief description of your content" />
    <meta property="og:image" content="https://yoursite.com/og-image.png" />
    <meta property="og:image:width" content="1200" />
    <meta property="og:image:height" content="630" />
    <meta property="og:image:alt" content="Description of your image" />
    <meta property="og:url" content="https://yoursite.com/current-page" />
    <meta property="og:type" content="website" />
    
    <!-- Twitter Card meta tags -->
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:title" content="Your Page Title" />
    <meta name="twitter:description" content="Brief description of your content" />
    <meta name="twitter:image" content="https://yoursite.com/og-image.png" />
    <meta name="twitter:image:alt" content="Description of your image" />
</head>
<body>
    <!-- Your page content -->
</body>
</html>

Important Notes

  • • Use absolute URLs for the image source
  • • Include image dimensions for faster loading
  • • Add alt text for accessibility
  • • Test URLs are publicly accessible

2. Next.js Implementation

Next.js provides built-in support for Open Graph images through the metadata API.

App Router (Next.js 13+)

// app/page.tsx or app/your-page/page.tsx
import type { Metadata } from 'next';

export const metadata: Metadata = {
  title: 'Your Page Title',
  description: 'Brief description of your content',
  openGraph: {
    title: 'Your Page Title',
    description: 'Brief description of your content',
    url: 'https://yoursite.com/current-page',
    type: 'website',
    images: [
      {
        url: 'https://yoursite.com/og-image.png',
        width: 1200,
        height: 630,
        alt: 'Description of your image',
      },
    ],
  },
  twitter: {
    card: 'summary_large_image',
    title: 'Your Page Title',
    description: 'Brief description of your content',
    images: ['https://yoursite.com/og-image.png'],
  },
};

export default function Page() {
  return (
    <div>
      {/* Your page content */}
    </div>
  );
}

Pages Router (Next.js 12 and below)

// pages/your-page.tsx
import Head from 'next/head';

export default function YourPage() {
  return (
    <>
      <Head>
        <title>Your Page Title</title>
        <meta name="description" content="Brief description of your content" />
        
        <meta property="og:title" content="Your Page Title" />
        <meta property="og:description" content="Brief description of your content" />
        <meta property="og:image" content="https://yoursite.com/og-image.png" />
        <meta property="og:image:width" content="1200" />
        <meta property="og:image:height" content="630" />
        <meta property="og:url" content="https://yoursite.com/current-page" />
        <meta property="og:type" content="website" />
        
        <meta name="twitter:card" content="summary_large_image" />
        <meta name="twitter:image" content="https://yoursite.com/og-image.png" />
      </Head>
      
      <div>
        {/* Your page content */}
      </div>
    </>
  );
}

3. React with Helmet

For React applications without Next.js, use React Helmet to manage meta tags.

Installation

npm install react-helmet
# or
yarn add react-helmet

Usage Example

import React from 'react';
import { Helmet } from 'react-helmet';

function BlogPost({ title, description, imageUrl, pageUrl }) {
  return (
    <>
      <Helmet>
        <title>{title}</title>
        <meta name="description" content={description} />
        
        <meta property="og:title" content={title} />
        <meta property="og:description" content={description} />
        <meta property="og:image" content={imageUrl} />
        <meta property="og:image:width" content="1200" />
        <meta property="og:image:height" content="630" />
        <meta property="og:url" content={pageUrl} />
        <meta property="og:type" content="article" />
        
        <meta name="twitter:card" content="summary_large_image" />
        <meta name="twitter:image" content={imageUrl} />
      </Helmet>
      
      <article>
        {/* Your blog post content */}
      </article>
    </>
  );
}

export default BlogPost;

4. Dynamic OG Images

For blogs and e-commerce sites, you can generate OG images dynamically based on content.

Next.js API Route Example

// app/api/og/route.tsx
import { ImageResponse } from 'next/og';

export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const title = searchParams.get('title') || 'Default Title';
  const description = searchParams.get('description') || 'Default Description';

  return new ImageResponse(
    (
      <div
        style={{
          fontSize: 48,
          background: 'linear-gradient(to right, #7c3aed, #2563eb)',
          width: '100%',
          height: '100%',
          display: 'flex',
          flexDirection: 'column',
          alignItems: 'center',
          justifyContent: 'center',
          color: 'white',
          textAlign: 'center',
          padding: '60px',
        }}
      >
        <div style={{ fontSize: 64, fontWeight: 'bold', marginBottom: 30 }}>
          {title}
        </div>
        <div style={{ fontSize: 32, opacity: 0.9 }}>
          {description}
        </div>
      </div>
    ),
    {
      width: 1200,
      height: 630,
    },
  );
}

// Then use in your metadata:
export const metadata: Metadata = {
  openGraph: {
    images: ['/api/og?title=Your Title&description=Your Description'],
  },
};

5. Testing & Validation

Pre-Launch Checklist

Image is 1200×630 pixels
File size is under 8MB
Image URL is publicly accessible
Uses absolute URLs (https://)
Alt text is descriptive
Text is readable at small sizes

Common Issues

  • • Image not loading: Check URL accessibility
  • • Wrong image showing: Clear platform cache
  • • Blurry preview: Use correct dimensions
  • • Text too small: Increase font size

Ready to Test Your Implementation?

Use the testing tools above to validate your OG images work correctly across all platforms.