Airtable Integration Guide
Turn your Airtable content calendar into a fully automated publishing pipeline. When a record's status flips to Ready, Airtable runs a script that calls IndReelForge and posts to every connected platform — then writes the result back to your base.
Prerequisites
| Step | What to do |
|---|---|
| 1. Create a profile | Dashboard → Profiles → New Profile. The profile name is your user field. |
| 2. Connect socials | Open the profile and click Connect next to each network. |
| 3. Generate an API key | Dashboard → API Keys → New Key (2FA required). Store it safely. |
Recommended Base Structure
| Field | Type | Purpose |
|---|---|---|
Video Name | Single line text | Caption / title for the post |
Video URL | URL | Public link to the video (S3, Cloudinary, Drive, etc.) |
Platforms | Multiple select | Options: instagram, tiktok, youtube, x, linkedin, facebook, threads, pinterest, reddit, bluesky, google_business |
Profile | Single line text | IndReelForge profile name |
Status | Single select | Draft / Ready / Uploaded / Failed |
Upload Date | Date | Auto-filled when posted |
Platform URLs | Long text | JSON written back with per-platform post IDs |
Automation Setup
- Open your base and click Automations in the top bar.
- Click + New automation.
- Trigger → "When a record matches conditions" → Status is Ready.
- Action → "Run a script".
- Under Input variables, add:
recordId→ Current record IDapiKey→ your IndReelForge API key (paste directly or use a base secret)userProfile→ your IndReelForge profile name
Automation Script
Paste this into the script editor:
const { recordId, apiKey, userProfile } = input.config();
const table = base.getTable('Videos');
const record = await table.selectRecordAsync(recordId);
const videoUrl = record.getCellValue('Video URL');
const title = record.getCellValue('Video Name');
const platforms = (record.getCellValue('Platforms') || []).map(p => p.name);
// Build multipart form data
const form = new FormData();
form.append('video_url', typeof videoUrl === 'string' ? videoUrl : videoUrl[0].url);
form.append('user', userProfile);
form.append('title', title);
platforms.forEach(p => form.append('platform[]', p));
// Call IndReelForge
const res = await fetch('https://api.indreelforge.com/api/upload', {
method: 'POST',
headers: { Authorization: `Apikey ${apiKey}` },
body: form,
});
const data = await res.json();
// Write result back to Airtable
await table.updateRecordAsync(record, {
Status: data.success ? { name: 'Uploaded' } : { name: 'Failed' },
'Upload Date': new Date(),
'Platform URLs': JSON.stringify(data.platform_statuses || {}, null, 2),
});
output.set('success', data.success);
output.set('upload_id', data.upload_id || '');
Text-Only Posts
Change the endpoint to /api/upload_text and omit the video fields:
const form = new FormData();
form.append('title', title);
form.append('user', userProfile);
platforms.forEach(p => form.append('platform[]', p));
const res = await fetch('https://api.indreelforge.com/api/upload_text', {
method: 'POST',
headers: { Authorization: `Apikey ${apiKey}` },
body: form,
});
Photo Carousel Posts
Use /api/upload_photos and append multiple image URLs:
const images = record.getCellValue('Images'); // Attachment field
const form = new FormData();
form.append('user', userProfile);
form.append('title', title);
images.forEach(img => form.append('image_url[]', img.url));
platforms.forEach(p => form.append('platform[]', p));
await fetch('https://api.indreelforge.com/api/upload_photos', {
method: 'POST',
headers: { Authorization: `Apikey ${apiKey}` },
body: form,
});
Auto-Schedule with Queue
Add add_to_queue=true to let IndReelForge pick the next optimal time slot:
form.append('add_to_queue', 'true');
Configure time slots per profile in Dashboard → Profiles → Queue Settings.
Tips
| Topic | Detail |
|---|---|
| API key security | Use Airtable's Secrets feature (Automations → Secrets) rather than hardcoding the key in the script |
| Multiple select → string array | getCellValue('Platforms') returns [{id, name}] objects — always .map(p => p.name) |
| Attachment fields | Video and image attachment cells return arrays; use [0].url for the first item |
| Rate limiting | Add a Wait step between runs if you automate bulk publishing |
| Error visibility | Write data.error back to a Notes field so failures are visible in the base |