Intermediate · Lesson 14 of 22

Packs: Connecting External Apps

Pull live data from GitHub, Jira, and Salesforce into Coda tables. Trigger Slack messages from buttons and automations. Use 600+ service integrations without writing a single line of integration code.

⏱ ~24 min 🔌 Integrations ✅ Prerequisite: Lesson 13
01 — What Packs Add 02 — Installing a Pack 03 — Sync Tables 04 — Key Packs 05 — Packs in Automations 06 — Limitations 07 — Mockup Practice
01 — What Packs Add

Three new building blocks per service.

Packs are Coda's extension system. Each Pack connects your doc to an external service and adds one or more of three things. Once installed, Pack features behave exactly like native Coda features — they appear in the formula bar, button action editor, and automation rules, indistinguishable from built-ins.

🔄

Sync Tables

Pull a live snapshot of data from an external service into a Coda table. GitHub issues, Jira tickets, Salesforce accounts — each row is a real record from that service, auto-refreshing on a schedule.

🖱

Custom Actions

New action types appear in the button and automation editor — "Post to Slack", "Create Jira ticket", "Send Gmail". These let buttons and rules interact with external services, not just Coda data.

ƒ

Custom Formulas

New functions appear in formula autocomplete, namespaced to the Pack. Use Slack.GetUser() or Jira.GetIssue() anywhere you'd write a formula — in columns, canvas cells, conditions.

Packs are per-doc Installing a Pack adds it to one specific doc. Each doc maintains its own Pack list and authentication. A Pack installed in your project tracker isn't automatically available in your CRM doc — you install it where you need it.
02 — Installing a Pack

Three clicks from the gallery to your doc.

The Pack Gallery contains 600+ Packs built by Coda and the community. Find one, install it, authenticate once, and every feature it provides is immediately available anywhere in the doc.

Installing a Pack — step by step
1
Click "+" in the left sidebar. This opens the "Add building block" panel, which includes Tables, Views, Pages — and Packs at the bottom.
2
Choose "Explore Packs." Browse by category (Productivity, Engineering, CRM, Finance) or search by name. Each Pack card shows what it adds — sync tables, actions, or formulas.
3
Click "Install to doc." If authentication is required, you'll be prompted to connect your account via OAuth or paste an API key. Your credentials are stored securely per-doc — never shared with other users.
Authentication model: Most Packs use OAuth ("Connect with Google / Slack / Jira") or an API key. Your credentials are stored per-user, per-doc. If your colleague installs the same Pack, they must connect their own account separately — Coda never shares credentials between users.
03 — Sync Tables Deep Dive

External data as Coda rows.

A sync table pulls a snapshot of records from an external service and places them as rows in a Coda table. The data is read-only unless the Pack supports two-way sync — but you can reference, filter, and formula against it exactly like any other table.

Sync table settings — schedule and filters
Sync optionHow it worksBest for
Manual Syncs only when you click "Sync now" Periodic reporting, cost control
Daily Auto-syncs once every 24 hours Non-critical dashboards, summaries
Hourly Auto-syncs once per hour (Coda Pro+) Sprint tracking, pipeline views
Setup flow: Add table → choose Pack → authenticate → configure filters (e.g., one GitHub repo, one Jira project) → sync. The schema (columns) is determined by the Pack — you can't add arbitrary columns to a sync table, only the fields the Pack provides.
Two-way sync Packs Some Packs (Jira, Google Sheets) support editing synced data. When you modify a field in a Coda sync table row, the Pack immediately pushes the change back to the external service — no need to wait for the next sync cycle. One-way Packs make cells read-only.
04 — Key Packs

Slack, Gmail, Jira, Salesforce, GitHub.

💬 Slack Pack

Send messages to channels from button columns or automation rules. Compose the message as a formula string — concatenate row data to create dynamic, context-aware notifications. The message is sent as the authenticated Coda user.

Slack — post to channel with dynamic data
Slack.PostMessage(
  "#support",
  "New request: " & thisRow.[Title] &
  " · Priority: " & thisRow.[Priority]
)

📧 Gmail Pack

Send emails from button or automation actions. Reference column values in the recipient, subject, and body fields to create personalized outreach at scale — one Gmail.SendEmail formula drives 50 different emails from 50 different rows.

Gmail — send personalized email from a row
Gmail.SendEmail(
  thisRow.[Contact Email],
  "You're in — welcome to the program",
  "Hi " & thisRow.[Name] & ",\n\nCongrats on being accepted..."
)

📋 Jira Pack

Sync all Jira issues — or a filtered subset (one project, one sprint, one label) — into a Coda table. The Jira Pack supports two-way sync: change an issue's status in Coda and it updates in Jira. Teams use this to build sprint dashboards, roadmap views, and engineering health trackers without duplicating data.

☁️ Salesforce Pack

Pull Accounts, Contacts, and Opportunities from Salesforce into Coda sync tables. This gives your entire team a real-time pipeline view without everyone needing a Salesforce license — a significant cost saving for larger organizations.

📊 Google Sheets Pack

Two-way sync between a Coda table and a Google Sheet. Changes made in Coda push to the Sheet; Sheet changes pull into Coda on next sync. Ideal for teams transitioning from Sheets or sharing data with stakeholders who prefer spreadsheets.

🐙 GitHub Pack

Sync pull requests, issues, and commits into Coda tables. Filter by repo, label, or assignee. Use button columns to open issues directly in GitHub from the Coda row.

05 — Packs in Automations

Pack actions as the "Then" step.

Pack actions work inside automation rules exactly the same way they work in button columns. This is where Packs become most powerful — automations run server-side in the background, no human click required, and Pack actions extend what they can do beyond Coda's own data.

Automation — Slack notification on new support request
When:  Row added to Support Requests
If:    (no condition — fire for every submission)
Then:  Slack.PostMessage(
         "#support",
         "New request: " & [Title] &
         " · Priority: " & [Priority]
       )
Automation — send Gmail when deal is marked Won
When:  Row changed in Deals (watch: Status column)
If:    [Status] = "Won"
Then:  Gmail.SendEmail(
         [Contact Email],
         "You're in!",
         "Dear " & [Name] & ",\n\nWe're thrilled to confirm..."
       )
Automations use the installer's credentials When an automation fires a Pack action, it uses the credentials of the person who configured the automation — not whoever triggered the event. If that person's Slack token expires, the automation will fail. Check the run history log if Pack-based automations stop working.
06 — Sync Table Limitations

Snapshots, not live feeds.

Sync tables are powerful but not magic. Understanding their constraints prevents incorrect assumptions about data freshness and schema flexibility.

What sync tables can't do

  • Real-time streaming (minimum sync is hourly)
  • Arbitrary new columns — schema is fixed by the Pack
  • Write back to the external service (unless Pack supports two-way)
  • Custom fields not exposed by the Pack's API

What sync tables can do

  • Filter at sync time (e.g., one repo, one project)
  • Reference synced rows from other Coda tables via Relation columns
  • Run formulas and group/filter views on synced data
  • Two-way push if the Pack supports it (Jira, Google Sheets)
For truly real-time data, use webhooks If a Pack supports webhook-based triggers, the external service posts to Coda when data changes — instead of Coda polling on a schedule. This is near-real-time without the overhead of frequent polling. Configure it in the automation trigger options when you select "Webhook."
07 — Mockup

GitHub sync table + Jira two-way + Slack action.

Engineering Tracker — GitHub PRs (sync table)
🐙 Open Pull Requests — ai-content-generator
Last synced: 8 minutes ago · Sync now
Title Sync Author Sync Status Sync Created Sync Notify Button
Add video generation via Runway james-mwangi Open Mar 14
Fix image validation in download script priya-mehta Open Mar 15
Compress images before git commit amara-osei Merged Mar 12
Notify button: Slack.PostMessage("#engineering", "PR needs review: " & thisRow.[Title] & " — by " & thisRow.[Author])
Jira Issues — two-way sync table (editable Status)
Issue Sync Summary Sync Status Two-way Assignee Sync
ENG-412 Fix login redirect bug In Progress Priya Mehta
ENG-413 Add dark mode to settings page To Do James Mwangi
ENG-411 Upgrade Node.js to v20 Done Amara Osei
Editing "Status" in Coda pushes the change back to Jira immediately — no manual sync required. Two-way Packs show the "Two-way" label on editable columns.
Practice

Test your knowledge.

Packs: Connecting External Apps

5 Questions
Question 1 of 5
Which of these is NOT one of the three things a Pack can add to a Coda doc?
✓ Packs add sync tables, custom actions, and custom formulas — all scoped to the doc they're installed in. Packs do not create shared databases accessible across multiple docs; each doc's Pack installation is completely independent.
Question 2 of 5
What is the minimum automated sync frequency for a Coda sync table?
✓ The minimum automated sync interval is hourly, available on Coda Pro and above. For near-real-time data, use a webhook trigger if the external service supports it — the service posts to Coda when data changes rather than Coda polling.
Question 3 of 5
User A installs the Slack Pack and connects their Slack account. User B opens the same doc. What must User B do to use the Slack Pack?
✓ Pack authentication is per-user per-doc. Credentials are never shared between users. User B must authenticate with their own Slack account. This ensures each user's Pack actions are sent as themselves, not as User A.
Question 4 of 5
You have a Jira sync table in Coda. A developer updates an issue status in Jira directly. When will the change appear in Coda?
✓ Sync tables are snapshots taken at sync time — not live feeds. The Jira change appears in Coda at the next sync cycle (hourly if scheduled) or when you manually trigger "Sync now." For near-real-time, use Jira's webhook to post changes to Coda's webhook trigger.
Question 5 of 5
Which of these Packs supports two-way sync — meaning edits made in Coda can update the external service?
✓ The Jira Pack (and Google Sheets Pack) support two-way sync. Editing a Jira issue's status or fields in Coda pushes the change back to Jira immediately. The Slack Pack is action-only — you can send messages but can't "sync" Slack data back from Coda edits.
← Prev Automation Rules Lesson 13