Snappy Database -- Full Table Schemas
Field-by-field schemas for every Xano table backing the Snappy system. Companion to SKILL.md. Use this when you need to see column types, defaults, or non-obvious field semantics.
Table of Contents
- Workspace 1: Snappy MAIN (xnwv-v1z6-dvnr)
- Knowledge graph
- Sales pipeline
- Website + acquisition
- Calendar
- FreshBooks mirror
- YouTube
- Ads
- Slack + WhatsApp
- Auth / users
- Workspace 2: Orbiter ENRICHMENT (xh2o-yths-38lt)
- Person canonical
- Person multi-value tables
- Company canonical
- Pipeline operational
- Field convention reference
Workspace 1: Snappy MAIN (xnwv-v1z6-dvnr)
Owner Xano instance: https://xnwv-v1z6-dvnr.n7c.xano.io
Knowledge graph
contacts (canonical -- see snappy-knowledge/schemas.md)
| Field | Type | Notes |
|---|---|---|
id | int | PK, auto |
name | string | Required |
email | string | Required, unique recommended |
phone | string | E.164 format +14155551234 |
company | string | Denormalized name (until companies table ships) |
company_id | int | FK to companies (ASPIRATIONAL) |
role | string | Job title |
tags | array<string> | Controlled vocab -- see xano-conventions.md |
sub_tags | array<string> | mentor, investor, collaborator, strategic |
linkedin_url | string | Full URL |
notes | string (long) | Freeform; latest interaction summary lives here until contacts_interactions ships |
birthday | date | Personal pipeline trigger |
preferred_channel | string | One of slack, email, whatsapp, imessage, telegram, linkedin, call, zoom, in_person |
last_contact | date | Updated by every touchpoint |
referral_source | string | How we met / who introduced |
created_at | datetime | UTC |
updated_at | datetime | UTC |
deleted_at | datetime nullable | Soft delete |
Endpoints: POST/PATCH/GET /api:PB9UH7b9/contacts* -- see snappy-knowledge/endpoints.md.
contacts_referrals [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | PK |
from_id | int | FK to contacts (referrer) |
to_id | int | FK to contacts (referred) |
context | string | Why / how |
created_at | datetime | -- |
Backing endpoint: POST /api:PB9UH7b9/contacts/referrals.
contacts_touchpoints [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | PK |
contact_id | int | FK to contacts |
type | string | slack_message, email, whatsapp, call, etc. |
notes | string | Freeform |
created_at | datetime | -- |
Lightweight interaction stand-in. Backing endpoint: POST /api:PB9UH7b9/contacts/{id}/touchpoints.
contacts_interactions (ASPIRATIONAL -- endpoint not built)
Full schema in snappy-knowledge/schemas.md#interaction-schema. Until built, store summaries in contacts.notes.
| Field | Type | Notes |
|---|---|---|
id | int | PK |
contact_id | int | FK |
date | datetime | When |
channel | string | Channel vocabulary |
direction | string | inbound / outbound |
topic | string | Subject line |
summary | string | Key takeaways |
sentiment | string | positive, warm, neutral, cold, negative |
action_items | array<string> | Follow-ups |
logged_by | string | manual / auto |
transcript_id | string | Krisp meeting ID |
krisp_search_url | string | Deep link back to Krisp |
companies (ASPIRATIONAL -- table not built)
Full schema in snappy-knowledge/schemas.md#company-schema.
Sales pipeline
leads
| Field | Type | Notes |
|---|---|---|
id | int | PK |
name | string | Required |
email | string | Required |
source | string | website_form, skool_dm, linkedin_message, email_reply, referral |
score | number | Lead score 0-5 (see snappy-sales lead scoring) |
stage | string | lead, qualified, call_booked, call_completed, negotiation, closed_won, closed_lost |
notes | string | Freeform |
contact_id | int nullable | FK to contacts once promoted |
created_at | datetime | -- |
updated_at | datetime | -- |
Endpoints used: POST /api:PB9UH7b9/leads, PATCH /api:PB9UH7b9/leads/{id}, GET /api:PB9UH7b9/leads, GET /api:PB9UH7b9/leads?stage=..., GET /api:PB9UH7b9/leads/pipeline.
applications [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | PK |
lead_id | int nullable | FK to leads |
application_data | object (json) | Full form payload |
status | string | submitted, reviewing, accepted, rejected |
submitted_at | datetime | -- |
Endpoint: POST /api:PB9UH7b9/applications.
Website + acquisition
contact_submissions
| Field | Type | Notes |
|---|---|---|
id | int | PK |
name | string | -- |
email | string | -- |
message | string | Body of contact form |
utm_source | string | UTM tracking |
utm_medium | string | UTM tracking |
utm_campaign | string | UTM tracking |
page | string | Where they submitted |
created_at | datetime | -- |
Endpoints: POST /api:PB9UH7b9/contact/submit, GET /api:PB9UH7b9/contact/submissions.
Calendar
calendar_events [INFERRED -- VERIFY: Google Calendar mirror]
| Field | Type | Notes |
|---|---|---|
id | int | PK |
google_event_id | string | Source-of-truth ID |
summary | string | Event title |
start_time | datetime | UTC |
end_time | datetime | UTC |
attendees | array<string> | Email addresses |
description | string | Body |
status | string | confirmed, tentative, cancelled |
created_at | datetime | -- |
Endpoints: GET /api:PB9UH7b9/calendar/events?days=N, POST /api:PB9UH7b9/calendar/create, POST /api:PB9UH7b9/calendar/event/update, GET /api:PB9UH7b9/calendar/availability.
FreshBooks mirror
Authoritative reference: snappy-freshbooks/api-reference.md.
freshbooks_clients
| Field | Type | Notes |
|---|---|---|
id | string | FreshBooks client ID (string from FB) |
name | string | -- |
email | string | -- |
phone | string | -- |
organization | string | -- |
vis_state | int | 0=active, 1=archived, 2=deleted |
created_at | datetime | -- |
Endpoints: GET /api:ACdo1OLG/freshbooks/clients, POST /api:ACdo1OLG/freshbooks_get_or_create_client.
freshbooks_invoices
| Field | Type | Notes |
|---|---|---|
id | string | FreshBooks invoice ID |
invoice_number | string | Visible to client |
client | string | Client name (or client_id FK) |
amount | number | Dollars (NOT cents) |
status | string | draft, sent, viewed, paid, partial, overdue, disputed, void |
issue_date | date | -- |
due_date | date | -- |
payment_date | date nullable | Set on paid |
payment_method | string | wire, cc, ach, etc. |
description | string | Line item summary |
recurring_id | string nullable | FK to freshbooks_recurring if from a profile |
Endpoints: GET /api:PB9UH7b9/freshbooks/invoices, POST /api:PB9UH7b9/freshbooks/invoice/create, POST /api:ACdo1OLG/freshbooks/send-invoice, POST /api:PB9UH7b9/freshbooks/invoice/mark-paid.
freshbooks_time_entries [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | string | -- |
client | string | -- |
hours | number | Decimal allowed |
description | string | -- |
date | date | -- |
billed | bool | True if attached to an invoice |
invoice_id | string nullable | FK to freshbooks_invoices |
Endpoints: POST /api:PB9UH7b9/freshbooks/time-entry/create, GET /api:PB9UH7b9/freshbooks/time-entries.
freshbooks_expenses [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | string | -- |
vendor | string | -- |
amount | number | Dollars |
category | string | One of software_saas, contractors, ads, tools_infra, professional, travel, office, misc |
date | date | -- |
notes | string | -- |
currency | string | ISO 4217 (USD, CAD) |
Endpoints: POST /api:PB9UH7b9/freshbooks/expense/create, GET /api:PB9UH7b9/freshbooks/expenses.
freshbooks_recurring [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | string | -- |
client | string | -- |
amount | number | Dollars |
description | string | -- |
frequency | string | weekly, monthly, quarterly, yearly |
start_date | date | -- |
auto_send | bool | Auto-deliver each cycle |
active | bool | False = stopped |
Endpoints: POST /api:PB9UH7b9/freshbooks/recurring/create, POST /api:PB9UH7b9/freshbooks/recurring/stop.
email_threads [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
gmail_thread_id | string | Gmail thread ID |
subject | string | -- |
from | string | -- |
to | string | Comma-separated recipients |
snippet | string | First N chars |
label | string | Inbox / triage label |
processed | bool | Smart inbox handled it |
received_at | datetime | -- |
Endpoints: POST /api:OehldiTW/email/smart-inbox, POST /api:OehldiTW/email/triage.
email_drafts [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
to | string | -- |
subject | string | -- |
body | string (html) | -- |
status | string | draft, sent, discarded |
created_at | datetime | -- |
Endpoint: POST /api:OehldiTW/email/draft.
email_send_queue [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
type | string | e.g. email_send |
payload | object (json) | Full email body |
status | string | queued, processing, sent, failed |
attempts | int | Retry counter |
created_at | datetime | -- |
sent_at | datetime nullable | -- |
Endpoint: POST /api:8wuQ86By/queue/add.
emails_sent [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
to_email | string | -- |
subject | string | -- |
body | string | -- |
dry_run | bool | True = preview only |
sent_at | datetime | -- |
Endpoints: POST /api:PB9UH7b9/emails/send, GET /api:PB9UH7b9/emails/list.
linkedin_posts [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
text | string | Post body |
post_type | string | text, image, carousel, video, article |
media_url | string nullable | Image / video URL |
slides | array<object> nullable | Carousel slide data |
linkedin_post_id | string | LinkedIn-side ID for tracking |
posted_at | datetime | -- |
Endpoints: POST /api:PB9UH7b9/linkedin/post, linkedin/post-image, linkedin/post-carousel, linkedin/post-video, linkedin/post-article.
YouTube
youtube_videos [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
youtube_video_id | string | YouTube ID |
title | string | -- |
description | string | -- |
video_url | string | Source URL used for upload |
status | string | pending, uploaded, failed |
uploaded_at | datetime | -- |
Endpoint: POST /api:hZB4Dj0c/youtube-video-uploader.
youtube_video_stats [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
youtube_video_id | string | FK to youtube_videos |
views | int | -- |
watch_time | number | Hours |
ctr | number | Percent |
avd | number | Percent of video length |
subs_gained | int | Net delta |
snapshot_at | datetime | -- |
Endpoint: GET /api:PB9UH7b9/youtube/video-stats?video_id=....
youtube_comments [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
youtube_video_id | string | FK |
comment_id | string | YouTube comment ID |
author | string | Display name |
text | string | Comment body |
processed | bool | True if responder handled |
created_at | datetime | -- |
Endpoints: GET /api:hZB4Dj0c/youtube-comment-reader, POST /api:hZB4Dj0c/youtube-comment-responder.
Ads
ads_metrics [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
period | string | last_7_days, last_30_days, last_90_days |
spend | number | Dollars |
impressions | int | -- |
clicks | int | -- |
ctr | number | Percent |
cpl | number | Cost per lead |
cp_call | number | Cost per booked call |
roas | number | Return on ad spend |
snapshot_at | datetime | -- |
Endpoint: GET /api:PB9UH7b9/ads/metrics?period=....
ads_conversion [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
source | string | Ad campaign / placement |
lead_id | int nullable | FK to leads |
value | number | Estimated value of conversion |
attribution | string | first_touch, last_touch, multi_touch |
created_at | datetime | -- |
Endpoint: POST /api:PB9UH7b9/ads/conversion.
Slack + WhatsApp
slack_messages [INFERRED -- VERIFY: log of bot-sent messages]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
channel_id | string | Slack channel C-id |
text | string | Message body |
message_ts | string | Slack timestamp |
sent_at | datetime | -- |
Endpoints: POST /api:hZB4Dj0c/slack/bot-message, POST /api:hZB4Dj0c/slack-notify-robert, POST /api:XOwEm4wm/slack/notification, POST /api:XOwEm4wm/slack/messages, POST /api:XOwEm4wm/slack/thread-reply.
slack_channels [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
channel_id | string | Slack C-id |
name | string | Without # |
purpose | string | Channel purpose |
created_at | datetime | -- |
Endpoint: POST /api:XOwEm4wm/slack/channels.
Pre-cached IDs (in snappy-infra/SKILL.md -- never look up at runtime):
#all-snappy=C09DD2D0S07#social=C09DD2D0T7H#bugs-and-issues=C09KKEYAH1V#snappy_channel=C0A1981GEMN#proj-total-crm=C0AHMKPTY1M- Robert's Slack ID =
U09DD2CLSH5
whatsapp_messages [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
to | string | Phone number +1... |
message | string | Body |
media_url | string nullable | If sent as media |
status | string | sent, failed |
sent_at | datetime | -- |
Endpoints: POST /api:hZB4Dj0c/whatsapp-send-message, whatsapp-send-media, whatsapp-notify-robert.
Content pipeline
content_atoms
NOTE: This table lives onrb-content-engine.fly.dev(Neon Postgres), NOT the Xano MAIN workspace. Access viaPOST /sqlwith{"query": "..."}.
| Field | Type | Notes |
|---|---|---|
id | int | PK, auto |
type | string | convergence, tool-mention, sharp-line, market-signal, analogy, number |
meeting_id | string nullable | Krisp meeting ID (null for convergence nuggets spanning multiple) |
source_meetings | array<string> | All meeting IDs this nugget derives from |
speaker | string nullable | Who said it -- for tagging/credit |
verbatim_text | string | Raw quote or observation from transcript |
draft | string | Robert-voice draft (2-5 sentences) |
topic | string nullable | Primary topic (required for convergence) |
tags | array<string> | Content tags for retrieval |
frequency | int nullable | Conversation count (convergence nuggets) |
content_hash | string | SHA256 of verbatim_text -- dedup key |
times_used | int | Default 0. Incremented when used in a post/carousel |
status | string | draft, approved, posted, rejected |
mined_at | datetime | When extracted |
created_at | datetime | UTC |
updated_at | datetime | UTC |
deleted_at | datetime nullable | Soft delete |
Owner: snappy-mine (W). Readers: snappy-content (R), snappy-linkedin (R), snappy-image (R), snappy-ops (R), snappy-analytics (R).
Dedup: content_hash prevents duplicate nuggets from re-mining same transcript. Re-mining is encouraged (models improve), but identical extractions are skipped.
Query via POST https://rb-content-engine.fly.dev/sql with {"query": "SELECT * FROM content_atoms WHERE status = 'draft'"}.
Auth / users
users [INFERRED -- VERIFY]
| Field | Type | Notes |
|---|---|---|
id | int | -- |
email | string | -- |
name | string | -- |
api_key | string | Bearer token |
created_at | datetime | -- |
Endpoints: api:e6emygx3/login, api:e6emygx3/me.
Workspace 2: Orbiter ENRICHMENT (xh2o-yths-38lt)
Owner Xano instance: https://xh2o-yths-38lt.n7c.xano.io
Authoritative reference: snappy-pipeline/data-flow-map.md. Read-only from Snappy -- Mark Lewis owns writes via the Orbiter enrichment processes.
Person canonical
master_person (table 139)
| Field | Type | Notes |
|---|---|---|
id | int | PK |
name | string | Full name |
sex | string | From EL gender |
avatar | string | Avatar URL pointer |
visibility | bool | False = stuck in pipeline |
created_at | datetime | -- |
person_enrich_data (table 500)
JSON blob storage from each enrichment source. Documented in snappy-pipeline/data-flow-map.md.
| Field | Type | Notes |
|---|---|---|
id | int | PK |
master_person_id | int | FK to master_person |
people_data_labs | object (json) | PDL response (data_source_id 91) |
enrich_layer_data | object (json) | EL response (data_source_id 94) |
fundable | object (json) | Fundable / BigQuery (data_source_id 89) |
scrapecreator_person | object | Legacy ScrapeCreator |
linkedin_profile | object | Direct LinkedIn |
contactout_data | object | ContactOut emails |
scrapin_data | object | Scrapin LinkedIn data |
email_signature | object | Passive email parsing |
raw_linkedin | string | Raw LinkedIn HTML archive |
raw_linkedin_email | string | LinkedIn email archive |
clado_data | object | Clado source |
created_at | datetime | -- |
enrich_history_person
| Field | Type | Notes |
|---|---|---|
id | int | PK |
master_person_id | int | FK |
data_source_id | int | See source enum below |
source_name | string | Human readable (llm_biography, base_person_enrich, etc.) |
enrich_success | bool | -- |
processing | bool | True = stuck if old |
created_at | datetime | -- |
Source ID enum:
91= People Data Labs94= Enrich Layer89= Fundable / BigQuery86= LLM Biography79= Base Person Enrich95= Social Insights96= ScrapeCreators YouTube8= Crunchbase7= Twitter11= LinkedIn92= ScrapeCreators LinkedIn
Person multi-value tables
| Table | ID | Fields | Source(s) |
|---|---|---|---|
master_email | 155 | master_person_id, address, source | PDL, Fundable, ContactOut |
master_phone | 151 | master_person_id, number, source | PDL, Fundable |
master_link | 166 | master_person_id, url, type | PDL profiles, Fundable bio_links |
master_avatar | 227 | master_person_id, url, is_placeholder, main | EL profile_pic_url, Fundable profile_image |
skills_join | 325 | master_person_id, skill_id (or name), data_source_id | PDL, EL |
education_experience | 230 | master_person_id, school_name, degree, major, start_date, end_date, master_company_id, data_source_id | PDL, EL |
work_experience | 147 | master_person_id, title, company_name, start_date, end_date, is_primary, master_company_id, data_source_id | PDL, EL, Fundable |
certification | 283 | master_person_id, name, data_source_id | PDL, EL |
volunteering | 577 | master_person_id, organization, role, data_source_id | EL only |
honor | 573 | master_person_id, title, data_source_id | EL only |
project | 575 | master_person_id, title, data_source_id | EL only |
publication | 574 | master_person_id, name, data_source_id | EL only |
interest_join | 327 | master_person_id, interest_name, data_source_id | PDL, EL |
language_join | 326 | master_person_id, language_name, data_source_id | PDL, EL |
linkedin_follower | 495 | master_person_id, follower_count | EL only |
about_person | 365 | master_person_id, about | Fundable |
Company canonical
| Table | ID | Fields |
|---|---|---|
master_company | (varies) | id, name, domain, linkedin_url, ... |
company_funding_round | 201 | master_company_id, round, amount, date |
company_investor | 265 | master_company_id, master_person_id (investor), round |
company_financial | 287 | master_company_id, total_raised, valuation |
Pipeline operational
| Table | ID | Fields | Notes |
|---|---|---|---|
queue_enrich_person | (varies) | id, master_person_id, processing, created_at | Job queue -- graduated thresholds: >500 MEDIUM, >1000 HIGH |
queue_enrich_company | (varies) | id, master_company_id, processing, created_at | >5000 MEDIUM, >10000 HIGH |
crash_log | (varies) | id, function_name, error_message, master_person_id, created_at | Currently empty -- awaiting Mark's re-run with crash capture |
QA endpoints (read-only): api:Bd_dCiOz/qa/* -- full registry in snappy-pipeline/endpoints.md.
Field Convention Reference
See xano-conventions.md for the full vocabulary tables (tags, sentiments, channels, statuses, categories) and naming rules. This file is the schema; that file is the controlled vocabularies.