Build rules that run automatically — no clicks required. Row added, row changed, form submitted, time-based schedule, or incoming webhook: Coda automations keep your doc working while you're not watching.
Lesson 12 covered buttons — actions triggered by a human click. Automations are the next level: they trigger themselves in response to events. A row was added. A column value changed. A form was submitted. The clock hit 9am on Monday. No one needs to be in the doc.
A human clicks → action fires. Great for on-demand tasks where the user decides when to trigger something. If no one clicks, nothing happens.
An event occurs → action fires automatically. Run server-side even when the doc is closed. Guarantees execution: a row added at 2am triggers the automation at 2am.
Find automations in the left sidebar (lightning bolt icon) or from a table's overflow menu → Automate. You can also combine both: a button creates a row, and an automation fires when that row is created.
Every automation rule has four parts in sequence. Two are required; two are optional.
Choose the trigger type when setting up a new rule. The trigger determines what event causes the "When" to fire.
| Trigger | Fires when… | Best for |
|---|---|---|
| Row added | A new row is inserted in the target table (manually, via button, or API) | Welcome notifications, auto-assign, log new signups |
| Row changed | Any field in a row changes — or configure specific columns to watch | Stamp timestamps on status change, trigger approval flows |
| Form submitted | Someone submits a form view linked to this table | Confirmation emails, auto-routing, notify owner |
| Time-based | A schedule: daily at 9am, every Monday, 1st of the month, etc. | Weekly digest, daily standup row, monthly archive |
| Webhook | A POST request hits the automation's auto-generated URL | External integrations: Stripe, GitHub, Zapier → Coda |
The If step is an optional formula filter that must return true or false. The automation proceeds to the action only if the formula returns true. In the If step you can reference the triggering row's values directly with [Column Name] — no thisRow prefix needed.
// Only fire when Status was changed to "Done" [Status] = "Done" // Only fire for high-priority rows assigned to me And([Priority] = "High", [Assignee] = User()) // Only fire for overdue rows [Due Date] < Today() // Multiple conditions with Or() Or([Priority] = "Critical", [Escalated] = true)
The "Then" and "And Then" steps support all the same actions as buttons — plus Pack-powered integration actions for external services.
When: Row changed on Tasks (watch: Status column only) If: [Status] = "Done" Then: ModifyRow(thisRow, [Completed Date], Now())
When: Row added to Tasks If: (no condition — fire for every new task) Then: Slack.PostMessage( "#team", "New task: " & [Name] & " → assigned to " & [Assignee] )
When: Time-based — every Monday at 9:00 AM (doc timezone) If: (no condition) Then: AddRow( [Weekly Log], [Name], "Week of " & Today(), [Open], Tasks.Filter([Done] = false).Count(), [Done This Week], Tasks .Filter([Completed] >= DateAdd(Today(), -7, "days")) .Count() )
Completed Date — triggering itself again in an infinite loop.
The "Row changed" trigger fires on direct data edits — a user typing a value, a button running ModifyRow, or an API call. It does not fire when a formula column recalculates and produces a different output. If you need to react to a derived value crossing a threshold, use a time-based trigger with an If condition instead.
If Automation A modifies a row that triggers Automation B, and B modifies a row that triggers A again — you have an infinite loop. Coda has loop detection, but design carefully: always scope "Row changed" triggers to specific columns, and avoid chaining automations that modify the same columns they watch.
The doc's timezone is set in Doc Settings. "Every Monday at 9am" fires at 9am in the doc's timezone, which may differ from where you or your team members are located. Check the doc timezone before setting up time-based rules for global teams.
Every automation rule has a Test button that runs the action once on a sample row (without requiring the trigger condition to be met). Always test before enabling a new automation — especially one that sends notifications or creates rows, where a silent bug could cause dozens of duplicate records.