Rendex
Recipe

Auto-Generate OG Images from Airtable Rows

Give every Airtable record a unique social preview. One templated render call turns the row's title, subtitle, and author into a hosted og: URL you write straight back to the base.

Last updated 2026-05-28

The Problem

Your content, products, or events live in Airtable, but every page ships the same generic OG image — so links shared on X, LinkedIn, and Slack all look identical and forgettable. Generating one card per row by hand in Figma or Canva doesn't scale past a few rows, and standing up Puppeteer or a Vercel OG function just to render images means infrastructure you have to deploy, secure, and pay to keep warm.

The Solution

Point a Make or Zapier automation at your Airtable base. When a row is added or updated, it POSTs your 1200x630 HTML template plus the row's fields to Rendex's /v1/render/link endpoint and gets back a hosted, edge-cached image URL. Write that URL into an ogImageUrl column (or push it into your site's <meta og:image>). Every row gets a unique, on-brand card with zero rendering infrastructure — and it's all on the free tier.

How the Workflow Runs

Airtable

New or updated record

Make / Zapier

POST /v1/render/link with template + row data

Hosted URL

Receive the cached og:image link

Airtable

Write ogImageUrl back to the row

Input → Rendered Output

Left: an Airtable grid row with title, subtitle, and author columns. Right: the same row rendered as a 1200x630 branded OG card on an orange-to-dark gradient, with the hosted URL written back into the row's ogImageUrl field.

Rendered by Rendex

What You Need

  • A Rendex API key (free tier — 100 renders/month, no card required)
  • A Make or Zapier account with your Airtable base connected
  • An Airtable base with title, subtitle, and author columns (plus an empty ogImageUrl field to write back to)
  • A 1200x630 OG HTML template with {{title}}, {{subtitle}}, and {{author}} Mustache placeholders

What This Recipe Uses

Hosted OG Link

POST /v1/render/link returns a signed URL you drop straight into <meta og:image> or an Airtable field — no file to store or serve.

Mustache Templating

One HTML template + a data{} object of row fields. {{title}}, {{subtitle}}, and {{author}} fill in per record.

Edge-Cached Renders

The first crawl renders and caches on the edge; every later share (x-rendex-cache: hit) is free. One viral page = one credit.

Make or Zapier

Use Make's HTTP module or Zapier's native Rendex 'Create Render Link' action (v1.6.0+) — whichever already holds your Airtable connection.

Build It

make-http-module.json
// Make scenario: Airtable "Watch Records" -> HTTP "Make a request"
// HTTP module configuration:
{
  "url": "https://api.rendex.dev/v1/render/link",
  "method": "POST",
  "headers": [
    { "name": "Authorization", "value": "Bearer YOUR_API_KEY" },
    { "name": "Content-Type", "value": "application/json" }
  ],
  "bodyType": "raw",
  "contentType": "application/json",
  "parseResponse": true,            // so {{1.url}} is available downstream
  "body": {
    "format": "png",
    "width": 1200,
    "height": 630,
    "html": "<div style=\"width:1200px;height:630px;box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;padding:72px;font-family:system-ui,sans-serif;color:#fff;background:linear-gradient(135deg,#0f172a,#ea580c)\"><h1 style=\"font-size:64px;line-height:1.1;margin:0\">{{title}}</h1><p style=\"font-size:28px;margin:20px 0 0;color:#fed7aa\">{{subtitle}}</p><p style=\"font-size:22px;margin-top:auto;color:#fdba74\">by {{author}}</p></div>",
    "data": {
      "title": "{{1.title}}",       // mapped from the Airtable trigger
      "subtitle": "{{1.subtitle}}",
      "author": "{{1.author}}"
    }
  }
}
// Add an Airtable "Update a Record" step after this:
//   ogImageUrl  <-  {{2.url}}   (the hosted link from the HTTP response)
render-og.sh
# Both Make's HTTP module and Zapier's Webhooks step send this exact request.
curl -X POST https://api.rendex.dev/v1/render/link \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "format": "png",
    "width": 1200,
    "height": 630,
    "html": "<div style=\"width:1200px;height:630px;box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;padding:72px;font-family:system-ui,sans-serif;color:#fff;background:linear-gradient(135deg,#0f172a,#ea580c)\"><h1 style=\"font-size:64px;line-height:1.1;margin:0\">{{title}}</h1><p style=\"font-size:28px;margin:20px 0 0;color:#fed7aa\">{{subtitle}}</p><p style=\"font-size:22px;margin-top:auto;color:#fdba74\">by {{author}}</p></div>",
    "data": {
      "title": "Shipping faster with edge rendering",
      "subtitle": "How we cut our OG pipeline to one API call",
      "author": "Dana Lee"
    }
  }'

# Response — write "url" back into the Airtable ogImageUrl field:
# {
#   "url": "https://api.rendex.dev/v1/render?p=...&sig=...",
#   "expiresAt": "2026-06-27T00:00:00.000Z",
#   "format": "png",
#   "cacheTtl": 86400
# }
render-og.js
import Rendex from "@copperline/rendex";

const rendex = new Rendex("YOUR_API_KEY");

// A 1200x630 OG template with Mustache placeholders.
const html = `
<div style="width:1200px;height:630px;box-sizing:border-box;display:flex;
  flex-direction:column;justify-content:center;padding:72px;
  font-family:system-ui,sans-serif;color:#fff;
  background:linear-gradient(135deg,#0f172a,#ea580c)">
  <h1 style="font-size:64px;line-height:1.1;margin:0">{{title}}</h1>
  <p style="font-size:28px;margin:20px 0 0;color:#fed7aa">{{subtitle}}</p>
  <p style="font-size:22px;margin-top:auto;color:#fdba74">by {{author}}</p>
</div>`;

// Call this with the fields from each Airtable row.
async function ogImageForRow(row) {
  const { url, expiresAt } = await rendex.renderLink({
    html,
    data: { title: row.title, subtitle: row.subtitle, author: row.author },
    format: "png",
    width: 1200,
    height: 630,
  });

  // 1) Write `url` back to the row's ogImageUrl field via the Airtable API, and/or
  // 2) Drop it straight into your page's social meta tags:
  //    <meta property="og:image" content={url} />
  //    <meta name="twitter:image" content={url} />
  return { url, expiresAt };
}

100 free API calls/month — no credit card required. Get your API key and start building.

Reach for this workflow when your social previews are data, not design — a content calendar, a product catalog, an events table, or a directory where each Airtable row should ship its own share image. Because /v1/render/link returns a hosted, edge-cached URL instead of raw bytes, you never store or serve a file: the first crawler to hit a page triggers one render, and every later share is served from cache, so a post that goes viral still costs a single credit. The HTML template lives in your automation, so a brand tweak means editing one step, not re-exporting hundreds of images. Make's HTTP module and Zapier's Rendex action both speak the same JSON, so you pick whichever platform already holds your Airtable connection. It runs entirely on Rendex's free tier — 100 renders a month, no card — which comfortably covers most content bases and lets you prove the loop before you scale.

Frequently Asked Questions

Related Resources