---
title: "AI Company Briefs — n8n workflow: Airtable to Google Docs | Harshith Nayaka L"
description: "n8n workflow that turns an Airtable contact list into a daily ChatGPT brief per company, one Google Doc each, and a Slack digest that reports any failures."
canonical: "https://harshith-nayaka-l-portfolio.vercel.app/work/airtable-ai-company-briefs"
last-updated: "2026-10-04T17:07:29Z"
published: "2026-10-04T16:45:37Z"
author: "Harshith Nayaka L"
author-role: "AI Engineer - Full Stack"
author-title: "AI Engineer - Full Stack"
author-location: "Bengaluru, India"
author-availability: "Available for freelance work"
author-email: "harshith28124@gmail.com"
content-type: "text/markdown"
html-version: "https://harshith-nayaka-l-portfolio.vercel.app/work/airtable-ai-company-briefs"
---
# AI Company Briefs — 32-node n8n workflow

> Every morning, an AI brief on each company in an Airtable contact list, saved as its own Google Doc, with one Slack digest linking them all and naming any company it couldn't finish.

Case study by Harshith Nayaka L, AI Engineer - Full Stack, Bengaluru, India.
Canonical page: https://harshith-nayaka-l-portfolio.vercel.app/work/airtable-ai-company-briefs

- **Type:** n8n workflow automation
- **Flow:** Airtable → ChatGPT → Google Docs → Slack
- **Role:** Solo build
- **Status:** Live run on n8n 2.8.4

## The problem

A contact list tells you who to talk to, not what their company does. Someone still has to look each company up, write a summary and put it where the team will find it, and a job like that, done by hand every morning, quietly stops happening.

Automating it is easy to do badly. An AI call that times out, a Docs request that fails or a malformed answer can crash the whole run, or worse, produce a cheerful report with gaps nobody notices.

## What I built

A 32-node n8n workflow with two entry points. Seed Contacts creates the Contacts table in Airtable (Name, Email, Company Name) if it doesn't exist and adds sample contacts at real companies. The daily 7:00 AM run reads every contact with pagination, groups them by company, and asks ChatGPT for a structured brief on each: overview, products and services, market, business model, notable facts, a sales angle and the contacts.

Each brief becomes its own Google Doc through the Drive and Docs APIs, optionally shared with anyone who has the link or with one domain. The run ends with a single Slack digest: a link to every Doc, a confidence level, and any problem met along the way. Setup is one import and one CONFIG node, with no code changes.

The AI step is treated as untrusted input. Briefs are requested in JSON mode, then parsed (including answers wrapped in code fences), checked for truncation and refusals, and validated before anything is written to Google.

## Pipeline

- **Trigger:** Daily 7:00 AM (Or Seed Contacts, run by hand)
- **Read:** CONFIG check (Placeholders and ID formats) → Airtable contacts (Paginated, grouped by company)
- **Summarise:** ChatGPT brief (JSON mode, one per company) → Validate (Truncation, refusal, shape)
- **Write:** Google Doc (Created, written, optionally shared)
- **Report:** Slack digest (Doc links, confidence, issues)

## The judgment calls

**CONFIG checks itself before anything runs**

A placeholder left in place or an ID in the wrong format, such as an Airtable base ID that isn't 17 characters starting with app, stops the run at the CONFIG node with a message that names the fix, before a single API call is made.

**API errors come back as data, translated into fixes**

Every HTTP node returns the full response instead of throwing, so each failure can be explained: a token missing the schema.bases:write scope, the Google Drive API not enabled, a bot that needs to be invited to the channel. The person reading the error is told what to change, not just what broke.

**Partial failure is reported; total failure is loud**

One company's timeout, truncated answer or Docs error is listed in the Slack digest while every other company is still delivered. If every summary fails, the run throws instead of finishing as a success with nothing in it, so the error-alert workflow fires.

**Retries only where they are safe**

Reads retry three times on network errors. Writes and AI calls are never retried automatically, so a flaky connection can't create duplicate Docs or pay for the same summary twice. Airtable writes go in batches of ten spaced 250 ms apart, inside Airtable's limit of five requests a second, and the Slack digest stays inside its block and character limits.

## What it changed

**Live run:** On n8n 2.8.4 with real accounts: 10 contacts seeded, 7 companies summarised with gpt-5.4-mini, 7 Google Docs created, and the digest posted to Slack.

**Tested:** Validated inside a real n8n instance against strict mocks of Airtable, OpenAI, Drive, Docs and Slack: pagination, partial OpenAI failures (a 500, truncated output, fenced JSON, a dropped connection), Doc create and write failures, the Drive API disabled, the bot missing from the channel, an empty or missing table, placeholder config and the per-run company cap.

## Questions this answers

**How do you automate company research from an Airtable contact list with n8n?**

With an n8n workflow that reads the list, groups the contacts by company, asks ChatGPT for a structured brief on each company, and writes every brief to its own Google Doc. The version Harshith Nayaka L built runs daily at 7:00 AM, posts one Slack digest linking every Doc, and reports any company it couldn't finish instead of failing the whole run. In a live run on n8n 2.8.4 it summarised 7 companies into 7 Google Docs.

## Built with

n8n, Airtable API, OpenAI Chat Completions (JSON mode), Google Drive API, Google Docs API, Slack API (Block Kit), JavaScript (Code nodes)

## Links

- [View on GitHub](https://github.com/HarshithNayakaL/airtable-ai-company-briefs-n8n)
