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.

Deterministic Code
AirtableJigsawStackSlack BotOperationsCustomer SupportFeedback TriageNotifications & Alerts

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?
Profanity in text, spammy or promotional copy, and unsafe images such as nudity, gore, or other NSFW content. Each check is scored separately so you can see exactly why a record was flagged.
Does it block anything automatically, or do humans still review?
It only writes a status and a reason to the row. Nothing is deleted. Anything flagged or blocked also lands in your Slack moderation channel so a human can make the final call before it ever reaches a public surface.
What if my submissions do not include an image?
The image check is skipped for rows with no image URL. Text-only submissions still go through profanity and spam scoring as normal.
Does the original text in Airtable ever get changed?
No. The original field is left alone. A separate censored text column gets the version with profanity masked, so you can choose to show that one on public surfaces if you prefer.
Can I tune what counts as flagged versus blocked?
Yes. The thresholds for clean, flagged, and blocked are knobs you set when you build the workflow, so a strict community and a casual one can run the same gate with different sensitivities.

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.