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.