automations.help

Reviews & UGC

Collect photo and video UGC in Airtable

Your best content is already being made — customers shoot it and drop it in photo reviews, email replies, and DMs, where it dies. This pulls every photo and video into one Airtable library the moment it lands: the file attached, who sent it, which product, which source, and — the part most teams skip — whether you actually have the right to run it in an ad. Build it yourself with the steps below, or we build it on the accounts you already pay for and hand you the keys, so you own the whole thing with no monthly fee. Free teardown of where your UGC is currently leaking first.

Difficulty
Intermediate
Time to build
4-6 hrs
Updated
  • Airtable
  • Klaviyo
  • n8n

The manual way today

UGC arrives in four or five different places and stays there. A photo review sits inside Loox or Okendo. A customer replies to your post-purchase email with a phone video, and it's now buried in a shared inbox. Someone tags the brand on Instagram or sends an unboxing clip in a DM. When the ad team needs 'that great video the woman sent of the candle,' someone goes digging through three apps and a Slack thread, usually gives up, and shoots something in-house instead.

Two things bleed. The first is content you already paid for in product and shipping but never use — real customers using your product is the creative that converts, and it's evaporating because there's no home for it. The second is legal exposure nobody tracks: a photo left in a review usually comes with the review app's on-site display license, but a video a customer DM'd you grants you nothing automatically. Run it as a paid ad without explicit permission and you've got a real problem. So teams either never use the good stuff, or use it and quietly hope no one asks. Neither shows up in a report.

What running looks like

Every photo and video a customer sends — through a review, an email reply, a submission form, an SMS — lands as a row in one Airtable base within minutes: the file attached, the customer's name and email, the order and product, the source it came from, and a usage-rights status that starts at 'Not requested' until someone actually secures permission. The content team works from a 'Rights granted' view instead of digging through apps. Duplicates are caught, ad-use is gated behind real consent, and the library is yours — exportable, documented, no platform holding it hostage.

01The build

How to build it

  1. Design the Airtable base before wiring anything to it

    Needs a human

    The base is the whole point, so model it first. One table — call it UGC Library — with these fields: Asset (an attachment field, holds the photo or video), Type (single select: Photo / Video), Customer name, Email, Order number, Product, Source (single select: Photo review / Email reply / Submission form / SMS / DM / Tagged post), Submitted date, Star rating (for review-sourced assets), Caption or quote, Usage rights (single select: Not requested / Requested / Granted / Denied), Where used (free text — which ad, which PDP), and Internal notes. Decide the four rights states now, because every downstream step writes to that field. Build the views you'll actually work from while you're here: 'New — needs triage', 'Rights granted — ready for ads', and a grouped-by-Product gallery view.

  2. Capture photo and video reviews from your reviews app

    Runs itself

    Your reviews app is the highest-volume, lowest-friction source — Loox, Okendo, Yotpo, Judge.me, and Stamped all let customers attach photos or video. Most push each submission into Klaviyo as a metric event carrying the media URL, or expose a native 'new review' webhook. In n8n, listen for that event and filter hard to only the ones that actually have a media attachment — text-only reviews don't belong in a UGC library and shouldn't create rows. Pull the media URL, the star rating, the product, and the reviewer's email off the event.

  3. Catch the email, SMS, and DM submissions a review app never sees

    Runs itself

    The content customers send outside a review is where the gold usually is, and it's the messiest to capture. Run a Klaviyo flow (or extend your post-delivery review ask) that invites customers to share a photo or clip — and point them at a hosted submission form (an Airtable form view or Typeform) rather than 'just reply to this email.' Form submissions arrive structured, with the file and fields already mapped, which is far cleaner than parsing attachments out of a shared inbox. For genuine email replies and DMs, the honest answer is there's no tidy official feed at small scale: drop the same form link into your DM and reply templates so unstructured content gets funneled into a structured channel n8n can read.

  4. Normalize every source through one n8n workflow

    Runs itself

    Point all the inputs — the review event, the form webhook, any inbox poll — at a single n8n workflow so there's one place that knows how to turn 'a thing a customer sent' into a library row. For each incoming item, download the media binary from its URL (you'll re-host it in the next steps), then map that source's fields onto the common schema from step one: a Loox review's 'reviewer_name' and a form's 'Your name' both write to Customer name. One normalizer, many sources — add a new source later by feeding it into the same workflow, not by building a second pipeline.

  5. Dedupe so the same clip never lands twice

    Runs itself

    Sources overlap and webhooks retry, so dedupe before you create a record or you'll get a library full of doubles. Within a single source, key off that source's stable ID — the review ID, the form submission ID, the message ID — and skip anything you've already imported (store seen IDs, or check Airtable for an existing row with that ID first). Cross-source duplicates (a customer who posts a photo review and DMs you the same shot) are genuinely hard to catch automatically; rather than guess and silently drop a real asset, flag likely matches with a 'Possible duplicate' tag for a human to merge. Better a flagged dupe than a deleted original.

  6. Create the Airtable record with the asset attached

    Runs itself

    Call Airtable's API to create the record in the UGC Library table. To populate the attachment field, pass Airtable a publicly reachable URL for the media and it fetches and stores the file itself — so re-host the downloaded binary somewhere temporarily reachable (or pass the source's own hosted URL straight through if it's stable and public). Map every normalized field into its column, set Type from the file's MIME type, and set Submitted date to now. Leave Usage rights empty for one moment — the next step sets it deliberately, not by accident.

  7. Set the usage-rights status correctly per source — the legal spine

    Runs itself

    This is the step that keeps you out of trouble, so don't let it default silently. A photo or video submitted through your reviews app or a submission form whose terms grant usage permission can land as 'Granted' (or 'Granted — on-site only' if the terms cover your site but not paid ads — keep that distinction). Anything from an email reply, a DM, or a tagged post grants you nothing automatically and must land as 'Not requested.' Hardcode this mapping in the workflow: source determines the starting rights state, every time. The whole library is only safe to pull from if this field tells the truth.

  8. Request rights on the assets worth using — then gate ad use behind it

    Needs a human

    A person opens the 'New — needs triage' view, picks the assets actually worth running, and checks a 'Request rights' box on those rows. That checkbox is a trigger: n8n (or a Klaviyo flow) fires a short, specific permission ask to that customer — 'we love this, can we feature it in our ads and on our site? reply YES' — with a clear consent link. A yes flips the row to 'Granted'; no reply or a no leaves it where it is. The non-negotiable rule downstream: only rows marked 'Granted' (and 'Granted' covering ads, not just on-site) are eligible for paid creative. The 'Rights granted — ready for ads' view is the only thing the media buyer is allowed to pull from.

  9. Hand the library to the people who need it, and watch the new stuff

    Needs a human

    The content and ads team works entirely from the filtered views — 'Rights granted' for what's runnable, grouped-by-Product to find UGC for a specific PDP or launch. Optionally, post a Slack ping to a #ugc channel when a high-signal asset lands (a video, or a five-star photo review) so good content gets seen the day it arrives, not in a monthly scrape. Then spend ten minutes a week in the base: is rights-request reply rate decent, are sources mapping cleanly, is anything piling up untriaged? Tune the ask copy and the source mapping from what you see, not from a guess.

02The stack

What it’s built on

Airtable
The library itself. Attachment fields hold the actual photos and videos, single-select fields track source and the four rights states, and views give the content team filtered, ready-to-use access — 'Rights granted' for ads, grouped-by-product for launches — without anyone needing API access.Airtable's free plan runs the whole structure, but its attachment storage is limited (around 1GB) and video eats it fast — a busy UGC library will outgrow free on storage well before it outgrows it on records. If that happens, store the files in Google Drive or S3 and keep a link in Airtable instead of the binary; the workflow barely changes.
Klaviyo
Two jobs: it's the path most review apps already push photo/video reviews through (as a metric event with the media URL), and it sends the rights-request ask — a consent email or SMS that respects the customer's existing subscription status and quiet hours instead of you firing a raw message.Klaviyo's free tier covers the flows and webhook actions this needs; you're likely already running it. Any ESP that exposes review events and can send a triggered message works the same way — only the event and send APIs differ.
n8n
The glue. One workflow receives every source, downloads the media, runs the dedupe check, maps fields onto the common schema, sets the rights state by source, and creates the Airtable record — plus it fires the rights-request when a row is flagged for use.n8n is open-source and self-hostable for free; their cloud tier just saves you running it yourself. Zapier or Make can do the same wiring if you'd rather not host anything, though the media-download and dedupe steps are more comfortable in n8n.

03Questions

Before you build

Do I need explicit permission to use a customer's photo or video in an ad?

For paid ads and most marketing reuse, yes — and that's exactly why the rights status field exists. Content submitted through a review app or a form whose terms grant usage permission usually covers display on your own site, but running it as a Meta or TikTok ad is a higher bar that on-site terms often don't reach, and a photo someone DM'd or emailed you grants you nothing on its own. The build defaults DM and email assets to 'Not requested,' and only a customer's explicit yes flips a row to 'Granted' — so the only content your media buyer can pull is content you actually have the right to run.

My reviews app already has a UGC gallery — why pull it into Airtable too?

Because that gallery only knows about reviews submitted in that app, and only shows them on your site. It can't see the video a customer emailed, the clip in your DMs, or the photo from a tagged post — and it doesn't track whether you're cleared to run any of it as a paid ad. The Airtable library unifies every source into one place and adds the rights tracking the gallery doesn't, so the ad team has a single, legally-clean shelf to pull from instead of three disconnected ones.

How do I capture photos and videos people send in Instagram or TikTok DMs?

Honestly, there's no clean, official feed for DM media at most brands' scale — the platform APIs don't hand it over the way a review app does. The practical pattern is to route it: drop a one-tap submission form link into your DM and email-reply templates so when someone offers content, they send it through a structured channel n8n can read. The automation reliably captures the structured sources (reviews, forms); the form link is how you funnel the unstructured ones in without manual download.

Won't the same clip land twice if a customer reviews it and also DMs it?

Within a single source, no — the workflow dedupes on that source's stable ID (review ID, form submission ID), so retries and re-imports can't create doubles. Across sources, the same shot arriving as both a review and a DM is genuinely hard to detect automatically, so the build flags likely matches as 'Possible duplicate' for a person to merge rather than guessing and silently deleting one. A flagged dupe you can resolve in seconds beats a real asset thrown away.

Where do the actual files live, and won't Airtable run out of space?

By default the files live in Airtable's attachment fields, which is the simplest setup and fine for a photo-heavy library. Video is the catch — Airtable's free attachment storage is limited and clips fill it quickly. When you hit that ceiling, switch the workflow to store the media in Google Drive or S3 and keep the shareable link (plus a thumbnail) in Airtable instead of the raw file. Same library, same views; only where the bytes sit changes.

Can I build this myself, or should you build it?

Every field, source, and rights rule is spelled out above, so with some API comfort and an afternoon you can wire it up yourself. If you'd rather not own the multi-source normalizing, the dedupe edge cases, and the rights-request flow, we'll build it on your Airtable, Klaviyo, and n8n accounts, document it, and hand you the keys — you own the library outright, with no monthly retainer to us. It starts with a free 20-minute teardown of where your UGC is leaking today, not a contract, and you keep the plan either way.

Reviews & UGC

Reward customers with a discount code for reviews

Asking for a review is asking a customer for free work. A small reward for the people who actually do it lifts your response rate without bribing anyone for a five-star. Here's how to mint a unique, single-use discount code the moment a verified customer leaves a review, deliver it through the email you already send, and do it without the legal and abuse traps that come with paying for reviews.

  • Klaviyo
  • Shopify

Intermediate3-5 hrs

Reviews & UGC

Export product reviews to Google Sheets

Your reviews live inside Judge.me, Loox, Okendo, or Yotpo, where you can read them one at a time but can't easily pivot by product, filter to the angry ones, or hand marketing a list of quotable lines. This pipes every review — the ones you already have and every new one after — into a Google Sheet with a clean column per field, so you can sort, filter, pivot, and share them like any other data. Build it yourself with the steps below, or we build it, backfill your history, and hand you the keys so you own it with no monthly fee. Free teardown of your current review setup first.

  • Google Sheets
  • n8n

Intermediate2-4 hrs

Reviews & UGC

Post new 5-star reviews to Slack

Your worst reviews get found fast — a customer emails, a ticket opens, someone scrolls the dashboard. Your best ones just sit in Judge.me or Loox where nobody looks. This watches every review as it's submitted, catches the five-star ones, and posts them to a Slack channel with the product, the words, the customer, and the photo if there is one — so the team sees the wins as they happen, and the quotable ones get caught before they're buried. Build it yourself with the steps below, or we build it, wire the routing, and hand you the keys so you own it with no monthly fee. Free teardown of your current review setup first.

  • Slack
  • n8n

Intermediate1-3 hrs