Auto-moderate new Airtable submissions before they go live
Every time someone submits a record to your Airtable intake table, run profanity, spam, and image checks, stamp the verdict on the row, and ping Slack on anything risky.
Build me a content moderation gate for user-submitted records in Airtable so nothing toxic, spammy, or NSFW makes it to a public surface without a human reviewing it first.
Trigger: poll Airtable for a new record on the submissions table. Use Airtable's first-class new_record poll trigger. The base, table, and the names of the text field and the optional image URL field should all be configurable.
For each new record, run these deterministic checks in JigsawStack:
1. Pass the main text field through Check Profanity. Keep the censored version of the text from the response.
2. Pass the same main text through Check Spam and keep the spam score.
3. If the record has a non-empty image URL field, run Check Image for NSFW Content on that URL. If there is no image, skip this step.
Combine the three results into a single moderation_status using configurable thresholds:
- "clean" if every check passes its threshold.
- "flagged" if any one check trips its threshold but nothing is severe.
- "blocked" if NSFW is detected on the image, or if the spam confidence is very high (e.g. spam score above a hard cutoff).
Also build a flagged_reasons list as comma-separated labels like "profanity", "spam", "nsfw_image" based on which checks tripped.
Then call Airtable Update Record on the same row to write three columns: moderation_status, flagged_reasons, and censored_text (the censored output from Check Profanity). Do not modify the original text field.
If moderation_status is flagged or blocked, also call the Slack Bot Send a Message action to post in a configurable moderation channel (default #moderation). The Slack message should include: a link back to the Airtable record, the original text, each of the three scores (profanity, spam, NSFW), the reason labels, and the final status, formatted so a human moderator can decide quickly. If the status is clean, do not post to Slack.
Integrations to use: airtable for the trigger and Update Record, jigsawstack for the three moderation checks, slackbot for posting to the moderation channel. Make the field names, the Slack channel, and the three thresholds (flag-text, block-spam, NSFW-on) all editable inputs so the same workflow can run for strict and casual communities.
Additional information
What does this prompt do?
- Watches your Airtable submissions table and processes every new row the moment it lands.
- Scans the main text for profanity and spam, and any attached image for nudity, gore, or NSFW content.
- Stamps each row with a moderation status of clean, flagged, or blocked, a list of reasons, and a safe censored version of the text.
- Pings your moderation channel in Slack with the row link, original text, scores, and reason labels so a human can review anything risky.
What do I need to use this?
- An Airtable base with a submissions table that has a main text field and, optionally, an image URL field.
- A JigsawStack account and API key for the profanity, spam, and image safety checks.
- A Slack workspace with a moderation channel where flagged items can be reviewed by a human.
How can I customize it?
- Choose which Airtable field holds the text to check and which optional field holds the image URL.
- Tune the score thresholds for clean, flagged, and blocked so the gate matches your tolerance for risk.
- Swap the destination Slack channel, or DM a specific on-call moderator instead of posting in a channel.
Frequently asked questions
What kinds of content does this catch?
Does it block anything automatically, or do humans still review?
What if my submissions do not include an image?
Does the original text in Airtable ever get changed?
Can I tune what counts as flagged versus blocked?
Stop risky user content from slipping onto your public pages.
Connect Airtable, JigsawStack, and Slack once, and Geni screens every new submission before a human ever sees it.