# Building the Command Center in Airtable **From Chapters 3.1 and 3.2 of *The 4-Hour Side Hustle*.** Five tables in one base. Every chain in Part II writes to this, and nothing works properly until it exists. Twenty minutes. Free plan. You need five CSVs from this bundle: `cc-contacts`, `cc-content`, `cc-orders`, `cc-tasks`, `cc-automation-log`. --- ## Before you start: resist designing it properly You will want to add fields for things you might need later. **Every one of those is a small tax you pay forever, in a form you'll never fill in.** Five tables, obvious fields, move on. You'll add what you actually need when you actually need it, and it'll take four minutes. --- ## Step 1 — Create the base and import five tables 1. Airtable → **Create** → **Start from scratch**. Name the base `Command Center`. 2. For each CSV: table tabs → **+** → **Import data** → **CSV file**, with **"Use first row as header"** on. 3. Rename each table: `Contacts`, `Content`, `Orders`, `Tasks`, `Automation Log`. 4. Delete Airtable's default `Table 1`. Every table arrives with one or two example rows. **Leave them until the field types are set** — they're how you check nothing imported as the wrong type — then delete them. --- ## Step 2 — Field types, table by table Airtable guesses from the data, and it guesses wrong on dates, numbers and anything that should be a select. Fix these before you connect Make to anything. ### `Contacts` | Field | Type | Notes | |---|---|---| | Name | Single line text | Primary | | Email | Email | | | Source | Single line text | The **specific video or page**, not "instagram" | | Tags | Multiple select | | | Date Added | Date | | | Status | Single select | Subscriber, Customer, Unsubscribed, Bounced | **On `Source`:** in ninety days you'll want to know which three clips produced buyers. "instagram" will not tell you. Keep it free text rather than a select — you can't predict the values and a select you keep editing is worse than text. ### `Content` | Field | Type | Notes | |---|---|---| | Title | Single line text | Primary | | Type | Single select | Clip, Article, Carousel, Newsletter, Long-form | | Platform(s) | Multiple select | LinkedIn, TikTok, Instagram, X, YouTube, Site | | Status | Single select | Idea, Recorded, Drafted, Needs Edit, Scheduled, Published | | Published Date | Date | | | Source Asset | Single line text | Which recording session it came from | | Clip Name | Single line text | Written by module 8 of the clip chain | | Scheduled Time | Date | Include time | | Virality Score | Number | 0 decimals — OpusClip's score | | Performance | Number | 0 decimals — **you fill this in later** | The last four exist because module 8 of the clip chain writes to them. Without those fields the chain has nowhere to log and you lose the only thing that compounds: knowing which recording sessions produced clips that worked. **`Performance` is deliberately manual.** Fill it in during the Sunday review from whatever number the platform gives you. In ninety days, sort by it. ### `Orders` | Field | Type | Notes | |---|---|---| | Customer | Email | Primary | | Product | Single line text | | | Amount | Currency | 2 decimals | | Date | Date | | | Status | Single select | Paid, Refunded, Failed, Disputed | | Fulfilment State | Single select | Pending, Delivered, Failed | | First Action Completed | Date | Added in Chapter 9.1 | **`Status` and `Fulfilment State` are separate on purpose.** A paid order that never delivered is the exact failure the high-severity alert exists to catch, and one combined field hides it. ### `Tasks` | Field | Type | Notes | |---|---|---| | Task | Single line text | Primary | | Machine | Single select | Offer, Content, Capture, Conversion, Delivery | | Priority | Single select | Now, Normal, Someday | | Status | Single select | To do, Doing, Done | ### `Automation Log` | Field | Type | Notes | |---|---|---| | Scenario Name | Single line text | Primary. The `[MACHINE]-[Trigger]-[Action]` name | | Timestamp | Date | **Include time** — without it the table is useless | | Status | Single select | Success, Error, Skipped | | Record Affected | Single line text | The contact, order, or content item | | Message | Long text | Error text, or a short note on what it did | **Colour the `Status` options:** Success green, Error red, Skipped grey. The whole Sunday-review instruction is "sort by Timestamp and look for red," and that only works if red is actually red. --- ## Step 3 — Five views that earn their place ### On `Automation Log` — `Errors` (Grid) **Filter:** `Status` is `Error`. **Sort:** `Timestamp` descending. Your ten-second Sunday check. When something's wrong you open one table instead of hunting through nineteen scenarios in three tools. ### On `Automation Log` — `Last 7 days` (Grid) **Filter:** `Timestamp` is within the past week. **Sort:** `Timestamp` descending. **Scan the successes too.** Silent failures never appear in an error log — a chain that stopped running produces no rows at all, and this view is where you notice the absence. ### On `Orders` — `Undelivered` (Grid) **Filter:** `Status` is `Paid` **AND** `Fulfilment State` is not `Delivered`. Should always be empty. When it isn't, someone paid and is sitting in the dark, and that's the one that interrupts you. ### On `Content` — `Needs Edit` (Grid) **Filter:** `Status` is `Needs Edit`. Where the article chain parks drafts containing `[NEEDS AUTHOR INPUT`. Nothing publishes from here until you've answered them. ### On `Contacts` — `New this week` (Grid) **Filter:** `Date Added` is within the past week. **Sort:** `Date Added` descending. One number for the Sunday review. **This is the view that replaces the new-subscriber alert** you were tempted to build. --- ## Step 4 — Then do the part that matters more than the tables **Connect Make.com to Airtable and run one trivial scenario end to end.** A new row in `Contacts` sends you a Telegram message. Two modules. It's a pointless automation and you'll delete it next week. Build it anyway. It proves the API key is right, the connection holds, and the Telegram bot from Chapter 1.2 actually receives things. Debugging that on a two-module scenario takes ten minutes. Debugging it inside a nine-module content chain at 11 p.m. takes an evening and your good mood. --- ## Step 5 — Share it as a template For the `/brain` and `/scorecard` pages: 1. Delete every example row first. **Check all five tables** — a stray `someone@example.com` in a shared template looks exactly as careless as it is. 2. Base menu (top left) → **Share** → **Share publicly** → enable **"Allow viewers to copy the base"**. 3. Copy that link. **That's the asset** — it goes in the resource library. --- ## Verify before you trust it - [ ] Five tables, `Table 1` deleted - [ ] `Automation Log` → `Timestamp` includes time, not just date - [ ] `Automation Log` → `Status` colours: Success green, Error red - [ ] `Orders` → `Status` and `Fulfilment State` are two separate fields - [ ] `Orders` → `Amount` is Currency, not text - [ ] `Content` has all four clip-chain fields: Clip Name, Scheduled Time, Virality Score, Performance - [ ] `Contacts` → `Source` is free text, and you know to write the specific video - [ ] Five views built - [ ] Two-module test scenario built, run, and the Telegram message arrived - [ ] Every example row deleted before sharing - [ ] Base shared with "allow viewers to copy" on - [ ] No fields added beyond this spec