How to Post from Airtable to Social Media

12 min read Content teamsUpdated 2026-05-06

Airtable is the de-facto content calendar tool for marketing teams — flexible, collaborative, and friendly to non-engineers. But Airtable Automations alone can't publish to TikTok, YouTube, or LinkedIn — there's no native node, and writing per-platform integrations from inside an Automation Script is a multi-week project. By pairing Airtable with CodivUpload, you get a multi-platform scheduler where the Airtable record is the source of truth and CodivUpload is the publishing engine. The setup is one Automation Script (about 30 lines of JavaScript) that reads a row, posts to CodivUpload, and writes the returned post ID back. This guide walks through the schema, the Automation Script, the sync-back automation that mirrors live status from CodivUpload back to Airtable, and the patterns for handling per-platform results in linked tables.

Prerequisites

  • An Airtable workspace on a Pro or higher plan (scripting requires Pro)
  • A CodivUpload API key from Dashboard → API Keys
  • A CodivUpload profile with the relevant social accounts connected

Step-by-step

  1. 1

    Create the Airtable schema

    Build a Posts table with these fields: Caption (long text — the post body), Media URL (URL — public HTTPS link to image or video), Scheduled At (date+time), Platforms (multi-select where each option is one of: instagram, tiktok, x, linkedin, youtube, facebook, threads, pinterest, bluesky, google_business, snapchat), Status (single select with options: draft, ready, scheduled, publishing, completed, failed), Profile (single select listing your CodivUpload profile names), CodivUpload Post ID (text — populated by the script), and Result URL (URL — populated by sync-back).

  2. 2

    Add a Send to CodivUpload button

    Add a Button field to the table. Configure it to run an Automation Script (Airtable's scripting environment runs in a sandboxed JS runtime). The script reads the row's fields, builds the CodivUpload payload using profile_name + platforms, and stores the returned post id back on the row.

    let table = base.getTable("Posts");
    let record = await input.recordAsync("Pick a post", table);
    if (!record) return;
    
    let platforms = (record.getCellValue("Platforms") || []).map(p => p.name);
    
    let payload = {
        post_type:      "image",
        profile_name:   record.getCellValueAsString("Profile"),
        platforms:      platforms,
        media_urls:     [record.getCellValue("Media URL")],
        description:    record.getCellValue("Caption"),
        scheduled_date: record.getCellValueAsString("Scheduled At"),
    };
    
    let res = await fetch("https://api.codivupload.com/v1/posts", {
        method: "POST",
        headers: {
            "Authorization": "Bearer YOUR_API_KEY",
            "Content-Type": "application/json",
        },
        body: JSON.stringify(payload),
    });
    
    let json = await res.json();
    await table.updateRecordAsync(record, {
        "Status":              { name: res.ok ? "scheduled" : "failed" },
        "CodivUpload Post ID": json.post_id || "",
    });
  3. 3

    Add a sync-back automation

    Schedule a 15-minute Automation that runs an Inspect script: fetch all rows where Status is scheduled or publishing, GET https://api.codivupload.com/v1/posts/{Post ID} for each, and update the Status column based on the response. This keeps Airtable in sync with the actual publishing state without you having to refresh manually. For very high-volume bases, switch to webhooks via /v1/webhooks pointing at an Airtable webhook trigger — push instead of poll.

  4. 4

    Show per-platform results in a linked Destinations table

    Create a Destinations table linked to Posts. After the sync-back fires, populate it with one row per platform — Platform, Status, Post URL, Error Message. Now your team sees granular per-platform results inside calendar view: a post can appear green on Instagram and red on TikTok if one destination failed, and the Error Message column tells you exactly why.

  5. 5

    Bulk-schedule from a filtered view

    Adapt the script to loop over a view filtered by Status=ready. Set up the trigger as When record matches conditions (Status changes to ready) so each row goes through the full pipeline automatically. Throttle with a small delay (200 ms) between iterations to stay under your API key's rate limits.

Frequently asked

Do I need Airtable Pro?+

Yes — scripting and Automation Scripts are Pro features. Free workspaces can use Zapier or Make as a bridge instead, but you lose the inline script flexibility and add a third party to the data path. Pro is $20/user/month and the scripting alone usually pays for itself in time saved.

Can I bulk-schedule a month of content from Airtable?+

Yes. Adapt the script to loop over a view filtered by Status=ready. Each iteration calls POST /v1/posts and writes the returned id back to the row. Throttle with a small delay (200 ms) between calls to stay polite. Realistic throughput: ~10 posts/second, so a month of daily content (30 posts) finishes in 3 seconds.

How do I handle different post types — images vs videos?+

Add a Post Type field to the table (single select with image, video, text, document) and pass record.getCellValue('Post Type') as the post_type field in the payload. For text posts, omit media_urls entirely. For documents, use a PDF URL. The same script handles all four with conditional payload construction.

What if the user picks platforms that the profile isn't connected to?+

CodivUpload returns a 400 with a clear error message naming the missing platform. The script catches that in the !res.ok branch and marks the row as failed. Add an Inspect Failed automation that posts to Slack with the error so the team can fix the connection before retrying.

Can I trigger the post on a date+time stored in Airtable?+

Yes — that's the schedule_date field in the payload. Pass record.getCellValueAsString('Scheduled At') and CodivUpload queues the post for that exact moment. Don't trigger the Airtable script at that time — trigger it any time before, and let CodivUpload's queue handle the actual scheduling.

How do I avoid duplicate posts if someone clicks the button twice?+

Pass an idempotency_key in the payload (e.g. set it to the Airtable record's ID + a stable suffix). CodivUpload deduplicates POST /v1/posts requests by idempotency_key for 24 hours — repeated clicks within that window return the original post_id without re-publishing.

Can the sync-back run more often than every 15 minutes?+

Yes — Airtable Automation triggers can fire as often as every 1 minute on Pro+ plans. But for high-volume bases you should switch to webhooks (POST /v1/webhooks pointing at an Airtable webhook URL). Webhooks fire instantly when status changes; polling at 1-minute resolution still has a 0-60 second lag and burns Airtable automation runs.

Related guides

Ready to automate?

Free plan includes 30 posts/month across 11 platforms. No credit card required.

See pricing