LogoBasecamp
Developer Knowledge Base · v2.0

Scripting patterns, automation flows, schema architectures, and extension hacks — built by developers who ship Airtable for a living.

basecamp.dev/explore
AllScriptingAutomationsIntegrationsSchema
ScriptingAdvanced

Batch dedup with selectRecordsAsync — the right way

const records = await table.
selectRecordsAsync({
fields: ['Status']
});
NameStatusLink
Automations

Chaining webhook triggers without hitting rate limits

5 min· Intermediate
Schema

Linked record patterns for client-facing bases

6 min· Beginner
scroll to explore
// explore

Browse the knowledge base

9 articles · interact with filters to unlock the Reader app

ScriptingAdvanced

selectRecordsAsync vs selectRecords: When 50ms becomes 5 seconds

The async method is non-blocking but burns automation runs. Here's the decision matrix for high-volume bases.

9 min247
Read in App
#scripting#performance#async
AutomationsIntermediate

Building a real-time CRM status board with Automation triggers

Three automation chains, one linked-record view, zero Zapier. A complete architecture walkthrough.

12 min183
Read in App
#automations#CRM#triggers
IntegrationsIntermediate

Airtable REST API rate limits: a practical survival guide

Five requests per second sounds fine until your Make scenario hits 400 records at 2 a.m.

7 min329
Read in App
#API#rate-limits#Make
Schema DesignAdvanced

Polymorphic linked records: the schema pattern agencies won't share

One junction table, multiple parent types, infinite flexibility for repeatable client deliverables.

11 min412
Read in App
#schema#linked-records#agency
ScriptingBeginner

Writing your first Scripting Extension in 15 minutes

From blank Monaco editor to a working batch-update script. No prior JavaScript expertise required.

15 min891
Read in App
#scripting#beginner#Monaco
AutomationsBeginner

Sending Slack alerts from Automation scripts without CORS pain

Automation scripts bypass CORS entirely. Here's the exact fetch() pattern for Slack webhook delivery.

5 min156
Read in App
#automations#Slack#fetch
IntegrationsAdvanced

Google Drive sync via Airtable API: a field-tested integration

Attachment fields, Drive file IDs, and a background script that keeps both in sync without polling.

14 min204
Read in App
#integrations#Google Drive#API
Schema DesignBeginner

Designing for client handoff: self-documenting base architecture

Field descriptions, view groupings, and color-coding conventions that make handoff a non-event.

8 min567
Read in App
#schema#documentation#client
ScriptingIntermediate

LLM-generated scripts: what Airtable context you must provide

GPT-4 writes decent scripts when you paste your schema. Here's the exact prompt template we use.

10 min738
Read in App
#scripting#LLM#AI
// curated

Curated collections

Handpicked sequences for different stages of your Airtable journey

// most_forked

Most Forked Bases

The templates the community keeps cloning — battle-tested, production-ready, documented.

Client Project Tracker v3
Beginner1247
Agency Retainer Base
Intermediate891
SaaS Metrics Dashboard
Advanced738
24 articles
// weekend_builds

Weekend Builds

Bite-sized projects completable in an afternoon. Ship something real before Sunday ends.

Automated invoice reminder
Beginner456
Slack standup bot via automations
Intermediate312
18 articles
// advanced_series

Advanced Scripting Series

8-part deep dive into production-grade Airtable scripting — async patterns, error handling, batch ops.

Part 1: Async/Await patterns
Advanced621
Part 2: Error boundaries
Advanced489
Part 3: Batch mutations
Advanced534
8 articles
// integrations_cookbook

Integrations Cookbook

Copy-paste recipes for Make, Zapier, n8n, and direct API calls. No fluff, just working configs.

Make → Airtable: field mapping guide
Intermediate403
n8n webhook to automation trigger
Intermediate287
31 articles
// featured_deep_dive
ScriptingAdvanced9 min read

selectRecordsAsync vs selectRecords: When 50ms becomes 5 seconds

The async method is non-blocking but burns automation runs. After profiling 40+ production bases, here's the decision matrix that saves you from 3 a.m. debugging sessions.

⬡ 247 forks· Updated Feb 24, 2026· by Marcus Webb
dedup-contacts.js
1// Batch dedup: find & merge duplicate records
2const table = base.getTable('Contacts');
3const records = await table.selectRecordsAsync({
4 fields: ['Email', 'Name', 'Status']
5});
6
7// Group by email
8const byEmail = new Map();
9for (const rec of records.records) {
10 const email = rec.getCellValueAsString('Email');
11 if (!byEmail.has(email)) {
12 byEmail.set(email, []);
13 }
14 byEmail.get(email).push(rec);
15}
16
17// Identify duplicates
18const toDelete = [];
19for (const [email, dupes] of byEmail) {
20 if (dupes.length > 1) {
21 // Keep first, delete rest
22 toDelete.push(...dupes.slice(1).map(r => r.id));
23 }
24}
25
26// Batch delete (50 at a time)
27while (toDelete.length > 0) {
28 await table.deleteRecordsAsync(toDelete.splice(0, 50));
29}
30output.text(`Removed ${toDelete.length} duplicates.`);
Schema DesignAdvanced

Polymorphic linked records: the schema pattern agencies won't share

One junction table, multiple parent types, infinite flexibility for repeatable client deliverables.

11 min · ⬡ 412Read in App →
ScriptingIntermediate

LLM-generated scripts: the exact Airtable context you must provide

GPT-4 writes decent scripts when you paste your schema. Here's the exact prompt template.

10 min · ⬡ 738Read in App →
IntegrationsIntermediate

Airtable REST API rate limits: a practical survival guide

Five requests per second sounds fine until your Make scenario hits 400 records at 2 a.m.

7 min · ⬡ 329Read in App →
Download Reader

Read everything. Anywhere.

The Basecamp Reader gives you offline access, code syntax highlighting, forked base downloads, and push notifications when a series you follow publishes a new part.

No account required. Download link sent instantly. Unsubscribe anytime.

12,400+
Active readers
340+
Articles indexed
4.8★
App Store rating