Airtable Participants Skill
Purpose
Query retreat participant data from the Ceremonia Airtable base. This is the
authoritative source of truth for who receives emails and SMS messages.
Access is read-only by default — record modifications require Austin's
explicit instruction per change.
Required Setup
Ensure AIRTABLEAPIKEY is set in .env.
You will also need:
- - Base ID: [VERIFY — find in Airtable API docs at airtable.com/developers or ask Austin]
- Table name: [VERIFY — confirm the participant table name with Austin]
Store confirmed values in TOOLS.md and MEMORY.md once verified.
Expected Data Structure
Participant records are expected to have at minimum these fields:
| Field | Type | Description |
|---|
| name | Text | Full name |
| email |
Email | Primary email address |
| phone | Phone | E.164 format preferred (+1XXXXXXXXXX) |
| retreat_status | Select | e.g., active, alumni, prospective, unsubscribed |
| tags | Multi-select | e.g., february-2026, guide-circle, donor |
| last_contact | Date | Most recent outreach date |
| donation_status | Select | e.g., donor, non-donor |
[VERIFY actual field names with Austin on first use — update this section when confirmed]
Common Query Patterns
Get all active participants (for newsletter sends)
CODEBLOCK0
Get participants with phone numbers (for SMS campaigns)
CODEBLOCK1
Get participant count by status
CODEBLOCK2
Get participants by tag
CODEBLOCK3
Note: Airtable paginates at 100 records. Use the offset parameter from the response to fetch subsequent pages:
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?offset={OFFSET_TOKEN}" \
-H "Authorization: Bearer $AIRTABLE_API_KEY" | jq .
Always paginate fully before reporting totals or building recipient lists.
Behavior Rules
- - Read-only by default — never PATCH, POST, or DELETE Airtable records without Austin's explicit instruction per operation
- When building a recipient list for email or SMS: always filter out records where retreat_status is 'unsubscribed'
- Never include email addresses or phone numbers in Slack messages — summarize counts and segments only
- If a query returns 0 results unexpectedly: report the issue to Austin rather than sending to an empty list
- Paginate all list queries fully — do not report partial counts or build partial recipient lists
- If Airtable API returns an error: surface it to Austin immediately with the error code and message
Record Modification (Requires Austin Approval)
When Austin instructs a record change (e.g., marking someone unsubscribed, updating last_contact):
- 1. Confirm the specific change with Austin before executing
- Execute the PATCH request
- Log the change in memory/logs/crm-writes/YYYY-MM-DD.md with: record name/email, field changed, old value, new value, Austin's instruction timestamp
Example Invocations
- - "How many active participants do we have?"
- "Get the email list for the February retreat attendees"
- "Who attended the last three retreats?"
- "How many people have phone numbers in the system?"
- "Mark [name] as unsubscribed" (requires Austin approval)
- "Pull the full active participant list for the newsletter"
- "How many people joined since January?"
Airtable 参与者技能
目的
从 Ceremonia Airtable 数据库中查询静修参与者数据。这是确定谁接收电子邮件和短信的权威数据源。默认情况下为只读访问——每次修改记录都需要 Austin 的明确指示。
必要设置
确保在 .env 文件中设置了 AIRTABLEAPIKEY。
你还需要:
- - Base ID: [验证——在 Airtable API 文档 airtable.com/developers 中查找或询问 Austin]
- 表名: [验证——与 Austin 确认参与者表名]
验证后将确认值存储在 TOOLS.md 和 MEMORY.md 中。
预期数据结构
参与者记录至少应包含以下字段:
电子邮件 | 主要电子邮件地址 |
| phone | 电话 | 优先使用 E.164 格式 (+1XXXXXXXXXX) |
| retreat_status | 选择 | 例如:active、alumni、prospective、unsubscribed |
| tags | 多选 | 例如:february-2026、guide-circle、donor |
| last_contact | 日期 | 最近联系日期 |
| donation_status | 选择 | 例如:donor、non-donor |
[首次使用时与 Austin 验证实际字段名称——确认后更新此部分]
常见查询模式
获取所有活跃参与者(用于新闻通讯发送)
bash
curl -s https://api.airtable.com/v0/{BASE
ID}/{TABLENAME}?filterByFormula={retreat_status}=active&fields[]=name&fields[]=email \
-H Authorization: Bearer $AIRTABLE
APIKEY | jq .records[].fields
获取有电话号码的参与者(用于短信活动)
bash
curl -s https://api.airtable.com/v0/{BASE
ID}/{TABLENAME}?filterByFormula=AND({retreat_status}=active,{phone}!=)&fields[]=name&fields[]=phone \
-H Authorization: Bearer $AIRTABLE
APIKEY | jq .records[].fields
按状态统计参与者数量
bash
curl -s https://api.airtable.com/v0/{BASE
ID}/{TABLENAME}?fields[]=retreat_status \
-H Authorization: Bearer $AIRTABLE
APIKEY | jq [.records[].fields.retreat
status] | groupby(.) | map({status: .[0], count: length})
按标签获取参与者
bash
curl -s https://api.airtable.com/v0/{BASE
ID}/{TABLENAME}?filterByFormula=FIND(february-2026,ARRAYJOIN({tags})) \
-H Authorization: Bearer $AIRTABLE
APIKEY | jq .records[].fields
注意:Airtable 每页限制 100 条记录。使用响应中的 offset 参数获取后续页面:
bash
curl -s https://api.airtable.com/v0/{BASEID}/{TABLENAME}?offset={OFFSET_TOKEN} \
-H Authorization: Bearer $AIRTABLEAPIKEY | jq .
在报告总数或构建收件人列表之前,务必完成全部分页。
行为规则
- - 默认只读——未经 Austin 每次操作的明确指示,不得对 Airtable 记录执行 PATCH、POST 或 DELETE 操作
- 构建电子邮件或短信收件人列表时:始终过滤掉 retreat_status 为 unsubscribed 的记录
- 切勿在 Slack 消息中包含电子邮件地址或电话号码——仅汇总数量和分段信息
- 如果查询意外返回 0 条结果:向 Austin 报告问题,而非发送到空列表
- 对所有列表查询进行完整分页——不要报告部分数量或构建部分收件人列表
- 如果 Airtable API 返回错误:立即向 Austin 反馈,附带错误代码和消息
记录修改(需 Austin 批准)
当 Austin 指示修改记录时(例如:将某人标记为已退订、更新 last_contact):
- 1. 在执行前与 Austin 确认具体修改内容
- 执行 PATCH 请求
- 在 memory/logs/crm-writes/YYYY-MM-DD.md 中记录修改内容,包括:记录名称/电子邮件、修改字段、旧值、新值、Austin 指示时间戳
调用示例
- - 我们有多少活跃参与者?
- 获取二月静修参与者的电子邮件列表
- 谁参加了最近三次静修?
- 系统中有多少人拥有电话号码?
- 将 [姓名] 标记为已退订(需 Austin 批准)
- 拉取完整的活跃参与者列表用于新闻通讯
- 自一月份以来有多少人加入?