Deep Plan: Baserow CRM Transformation — Super Database

Created: 2026-03-24 Owner: Dmitri Zasage, Solanasis LLC Status: SUPERSEDED by deep-plan-baserow-80-20-execution-2026-03-24.md — kept for broader reference Complexity: Multi-phase (touches schema, automation, integrations, UI, plugins) Estimated phases: 6 phases, ~2-4 sessions each

NOTE: Dmitri narrowed scope on 2026-03-24: free tier only, no n8n, no Apollo (deferred), no guild sharing (vision only). The focused 80/20 execution plan is at deep-plan-baserow-80-20-execution-2026-03-24.md. This broader document is kept for reference on deferred items.


Executive Summary

Transform Solanasis’s self-hosted Baserow from a basic 5-table contact database into a relational CRM super-database with:

  • Proper relational schema (People ↔ Organizations ↔ Interactions ↔ Deals ↔ Meeting Notes ↔ Tasks)
  • Automated Fireflies → Baserow meeting note sync (currently only saves to markdown files)
  • Apollo.io import pipeline ready for bulk prospect data
  • Forms for quick manual data entry
  • Views configured as daily operational dashboards
  • Community plugins where they add genuine value (not plugin sprawl)

The north star: Baserow becomes the single source of truth for all CRM data — contacts, interactions, pipeline, meeting notes, tasks — with everything properly linked relationally so you can click from a person → see their org → see all meetings → see all deals → see all tasks.


Current State Assessment

What Exists Today

ComponentStatusAssessment
Baserow self-hostedRunning at baserow.solanasis.comHealthy, Docker + Cloudflare tunnel
Core tables (5)Tag, Location, Organization, People, Meeting NotesMigrated from Coda — basic but functional
People table179 rows, 19 fields, link_rows to Tag/Location/OrganizationMissing: status, deal stage, last contacted
Meeting Notes37 rows, Person→People link_rowBroken UX — no proper date sorting, no auto-population from Fireflies
Pipeline tablesFoundation (200+), fCTO (50+), MSP (100+)Isolated — flat tables, not linked to People/Org
Fireflies syncHourly, saves markdown to solanasis-docs/Gap: Data goes to files, NOT to Baserow
TypeScript clientRobust, dual auth, batch ops, rate limitingReusable for all new automation
Python migration scripts3 pipeline-specific scripts + field mapperPattern established, can replicate
FormsNone configuredGap
Views (filtered/kanban/etc.)None configuredGap
Community pluginsNone installedOpportunity
Apollo integrationMentioned in playbooks, no implementationGap

What the Existing Playbooks Already Recommend

Your own playbooks converge on the same target schema. Here’s the synthesis:

PlaybookKey Recommendation
baserow-vs-coda-playbook.md5-table schema: People, Companies, Interactions, Opportunities, Tasks
baserow-airtable-ai-native-crm-playbook.mdKeep minimal, API-first, 0-1 plugins max, thin CLI wrapper
solanasis-custom-erp-crm-build-plan.mdLong-term: custom Frappe CRM. Short-term: Baserow as bridge
guild-cooperative-crm-sharing-playbook.mdFuture: shared CRM across guild members
email-to-baserow-crm-extraction-plan.mdPattern: extract → dedup → batch import via API

Conclusion: The playbooks already describe the destination. This plan provides the concrete implementation path.


Phase 1: Schema Redesign — Make It Relational

Priority: CRITICAL — everything else depends on this Effort: 1 session (~2-3 hours) Dependencies: None

1.1 New Tables to Create

Interactions (replaces the “one giant Notes field” anti-pattern)

FieldTypeNotes
Titletext (primary)Auto-generated: “{Type} with {Person} — {Date}“
Personlink_row → PeopleRequired
Organizationlink_row → OrganizationOptional, auto-populated from Person’s org
DatedateRequired
Typesingle_selectCall, Meeting, Email, LinkedIn, Referral, Voice Note, Other
Channelsingle_selectIn-Person, Zoom, Phone, Email, LinkedIn, WhatsApp
Summarylong_textKey takeaways (2-3 sentences)
Outcomesingle_selectPositive, Neutral, Negative, No Response
Next SteptextWhat needs to happen next
Follow-up DatedateWhen to follow up
Fireflies IDtextLinks to Fireflies transcript (for auto-synced meetings)
Transcript LinktextPath to markdown transcript file
Sourcesingle_selectManual, Fireflies, Email Sync, Apollo

Why: Your playbooks unanimously say “Use a dedicated Interactions table.” Right now meeting history is split between the Meeting Notes table (37 rows) and markdown files (70+ Fireflies transcripts). This table unifies everything.

Deals / Opportunities

FieldTypeNotes
Deal Nametext (primary)e.g., “Acme Corp — Security Assessment”
Organizationlink_row → OrganizationRequired
Primary Contactlink_row → PeopleRequired
Service Linesingle_selectSecurity Assessment, DR Verification, Data Migration, CRM Setup, Systems Integration, AI Implementation, fCIO, fCSIO, fCOO
Stagesingle_selectProspect, Discovery, Proposal, Negotiation, Won, Lost, On Hold
Estimated Valuenumber (currency)Dollar amount
Probabilitynumber (%)0-100
Expected ClosedateTarget close date
Sourcesingle_selectReferral, Cold Outreach, Inbound, Network, Conference, Apollo
Pipelinesingle_selectPrimary, Foundation, fCTO, MSP, VC
Blockerslong_textWhat’s preventing progress
Next ActiontextImmediate next step
Won/Lost ReasontextPost-close learning
Created DatedateWhen deal was created

Tasks

FieldTypeNotes
Tasktext (primary)What needs to be done
Personlink_row → PeopleOptional
Organizationlink_row → OrganizationOptional
Deallink_row → DealsOptional
Due DatedateWhen it’s due
Statussingle_selectTo Do, In Progress, Waiting, Done
Prioritysingle_selectUrgent, High, Normal, Low
Typesingle_selectFollow-up, Proposal, Research, Admin, Outreach
Noteslong_textAdditional context

Pipeline Stages (lookup table for Deals)

FieldTypeNotes
Stage Nametext (primary)e.g., “Discovery”
OrdernumberSort order (10, 20, 30…)
Default ProbabilitynumberAuto-fill when deal enters stage
ColortextHex color for kanban cards
Is TerminalbooleanWon/Lost/On Hold = terminal

1.2 Modifications to Existing Tables

People — Add Fields

New FieldTypeWhy
Statussingle_selectNew, Active, Warm, Cold, Client, Partner, Dormant, Do Not Contact
Lead Scorenumber0-100, calculated from interactions
Last ContacteddateAuto-update from latest Interaction
Next Touch DatedateWhen to reach out next
Deal Countcount (formula/lookup)How many active deals
Interaction Countcount (formula/lookup)Total interactions
Pipeline Sourcesingle_selectManual, Apollo, LinkedIn, Foundation Pipeline, fCTO Pipeline, MSP Pipeline, VC Pipeline
Apollo IDtextFor dedup when importing from Apollo

Organization — Add Fields

New FieldTypeWhy
Industrysingle_selectFinance, Healthcare, Nonprofit, Tech, Legal, Education, Government, Other
Size Bandsingle_select1-10, 11-50, 51-200, 201-1000, 1000+
Account Statussingle_selectProspect, Active Client, Former Client, Partner, Vendor
Annual RevenuenumberFor qualifying
CitytextFor geographic targeting
StatetextFor geographic targeting

Meeting Notes — Migrate to Interactions

The existing 37 Meeting Notes rows should be migrated into the new Interactions table, then the Meeting Notes table archived (not deleted — per your archive rules).

Migration mapping:

  • Person → Person (same link_row)
  • Date → Date
  • Notes → Summary
  • Follow-up Date → Follow-up Date
  • Type → “Meeting” (default)
  • Source → “Manual” (these were manually entered)

1.3 Implementation Script

Create solanasis-scripts/baserow/schema-upgrade-v2.py:

  1. Connect to self-hosted Baserow via JWT API
  2. Create new tables (Interactions, Deals, Tasks, Pipeline Stages)
  3. Add new fields to People and Organization
  4. Seed Pipeline Stages with default values
  5. Migrate Meeting Notes → Interactions
  6. Verify all link_row relationships work
  7. Generate upgrade report

Reuse existing patterns from: foundation-pipeline/migrate_to_baserow.py and baserow/src/migrate/schema.ts

1.4 Validation Checklist

  • All link_row fields resolve correctly (click Person in Interaction → opens correct People row)
  • Pipeline Stages seeded with: Prospect (10%), Discovery (20%), Proposal (40%), Negotiation (60%), Won (100%), Lost (0%), On Hold (0%)
  • Meeting Notes data migrated to Interactions (37 rows)
  • People table has new Status, Lead Score, Last Contacted fields
  • Organization table has Industry, Size Band, Account Status fields
  • No duplicate tables or orphan fields

Phase 2: Views & Forms — Daily Operating Dashboard

Priority: HIGH — makes the database usable day-to-day Effort: 1 session (~1-2 hours) Dependencies: Phase 1 complete

2.1 Views to Create

Views are configured via the Baserow UI (not API). These are the recommended views for each table:

People Table Views

View NameTypeFilter/SortPurpose
All ContactsGrid (default)Sort: Name A→ZMaster list
Hot LeadsGridStatus = Active OR Warm, Sort: Lead Score DESCDaily outreach targets
Needs Follow-UpGridNext Touch Date ≤ today + 7 daysWeekly review
ClientsGridStatus = ClientCurrent client list
Partners & ReferrersGridStatus = PartnerReferral network
DormantGridLast Contacted > 30 days ago, Status ≠ Do Not ContactRe-engagement targets
Recent AdditionsGridSort: Created DESC, Limit 50What’s new

Deals Table Views

View NameTypeFilter/SortPurpose
Pipeline KanbanKanban (PREMIUM)Group by: StagePrimary daily view — drag deals between stages
Pipeline by StageGridGroup by: Stage, Sort: Expected CloseFree alternative — grouped grid mimics kanban
All DealsGridSort: Expected Close ASCFull list
This MonthGridExpected Close = current monthClosing focus
Stale DealsGridUpdated > 14 days ago, Stage ≠ Won/LostDeals that need attention
WonGridStage = WonSuccess tracking
LostGridStage = LostLearning/patterns

Interactions Table Views

View NameTypeFilter/SortPurpose
RecentGridSort: Date DESCQuick review of all activity
This WeekGridDate = last 7 daysWeekly summary
Follow-ups DueGridFollow-up Date ≤ today + 3 daysAction items
By PersonGridGroup by: PersonSee all touchpoints per contact
Meetings OnlyGridType = MeetingFilter to meetings
Fireflies SyncedGridSource = FirefliesAuto-synced entries

Tasks Table Views

View NameTypeFilter/SortPurpose
TodayGridDue Date = today, Status ≠ DoneDaily task list
This WeekGridDue Date ≤ end of weekWeekly planning
OverdueGridDue Date < today, Status ≠ DoneRed flag view
KanbanKanban (PREMIUM)Group by: StatusVisual task board
By StatusGridGroup by: StatusFree alternative — grouped grid
By PriorityGridSort: Priority (Urgent first), then Due DateTriage view

Organization Table Views

View NameTypeFilter/SortPurpose
All OrganizationsGridSort: Name A→ZMaster list
Active ClientsGridAccount Status = Active ClientClient roster
ProspectsGridAccount Status = ProspectSales targets
By IndustryGridGroup by: IndustryVertical analysis

2.2 Forms to Create

Baserow forms create new rows. These 4 forms cover 90% of manual data entry needs:

Form 1: Quick Contact Capture

Target table: People Visible fields:

  • Name (required)
  • Email
  • Phone Number
  • Title
  • Organization (link_row — dropdown of existing orgs)
  • LinkedIn
  • Source (default: “Manual”)
  • Status (default: “New”)
  • Notes

Use case: After a networking event, conference, or random intro — quickly add someone without navigating the full table.

Form 2: Log an Interaction

Target table: Interactions Visible fields:

  • Person (link_row — dropdown, required)
  • Date (default: today)
  • Type (required: Call, Meeting, Email, LinkedIn, etc.)
  • Channel
  • Summary (required)
  • Outcome
  • Next Step
  • Follow-up Date

Use case: After any call, meeting, or meaningful exchange — log it in 60 seconds. This is the most important form for CRM discipline.

Form 3: Create a Deal

Target table: Deals Visible fields:

  • Deal Name (required)
  • Organization (link_row)
  • Primary Contact (link_row)
  • Service Line
  • Stage (default: “Discovery”)
  • Estimated Value
  • Expected Close
  • Source
  • Pipeline
  • Next Action

Use case: When a conversation turns into a real opportunity.

Form 4: Quick Task

Target table: Tasks Visible fields:

  • Task (required)
  • Due Date (required)
  • Priority (default: “Normal”)
  • Person (link_row)
  • Deal (link_row)
  • Type
  • Notes

Use case: Capture a follow-up or action item quickly.

2.3 Form URLs & Bookmarks

After creating forms, bookmark them in your browser toolbar for 1-click access:

  • baserow.solanasis.com/form/[contact-form-slug] → “Add Contact”
  • baserow.solanasis.com/form/[interaction-form-slug] → “Log Interaction”
  • baserow.solanasis.com/form/[deal-form-slug] → “New Deal”
  • baserow.solanasis.com/form/[task-form-slug] → “Quick Task”

Phase 3: Fireflies → Baserow Automation

Priority: HIGH — currently the biggest data gap Effort: 1-2 sessions Dependencies: Phase 1 (Interactions table must exist)

3.1 Current State

Fireflies AI → (hourly Claude Code sync) → Markdown files in solanasis-docs/
                                            ↓
                                     NOT connected to Baserow

3.2 Target State

Fireflies AI → (hourly Claude Code sync) → Markdown files in solanasis-docs/
                                            ↓
                                     ALSO creates/updates Interactions row in Baserow
                                            ↓
                                     Auto-links to People row (name matching)

3.3 Implementation: Extend the Existing Sync

The Fireflies sync already runs hourly via scheduled-tasks/scripts/run-fireflies-sync.py → invokes Claude Code with the prompt from 01-fireflies-sync-prompt.md.

Option A (Recommended): Add Baserow step to the sync prompt

Update 01-fireflies-sync-prompt.md to include a Step 6:

### Step 6: Push to Baserow Interactions Table

For each NEW meeting/voice note that was saved to markdown:
1. Call Baserow API to search People table for matching contact name
   - Match: first non-Dmitri participant name against People.Name
   - If no match found, create a new People row with the participant's name and email
2. Create a new Interactions row:
   - Person: link to matched/created People row
   - Date: meeting date
   - Type: "Meeting" or "Voice Note"
   - Channel: "Zoom" (or inferred from meeting platform)
   - Summary: AI summary from Fireflies (first 500 chars)
   - Source: "Fireflies"
   - Fireflies ID: the transcript ID
   - Transcript Link: relative path to the markdown transcript file
3. Update People row:
   - Last Contacted: meeting date (if more recent than current value)

Option B (Alternative): Separate Python script

Create solanasis-scripts/baserow/fireflies-to-baserow.py that:

  1. Scans solanasis-docs/meeting-notes/meeting-transcripts/ for files with YAML frontmatter
  2. Reads fireflies_id from frontmatter
  3. Checks Baserow Interactions table for existing Fireflies ID to avoid duplicates
  4. Creates new Interactions rows for unsynced meetings
  5. Matches participants to People rows by name/email
  6. Runs as a cron job or appended to the existing sync

Recommendation: Option A is simpler (one sync process instead of two), but Option B is more robust (separate concerns, easier to debug). Start with Option A, refactor to Option B if the sync prompt becomes too complex.

3.4 Name Matching Strategy

The trickiest part is linking Fireflies participants to People rows:

  1. Exact name match — search People.Name for the participant name
  2. Email match — if Fireflies provides participant email, match against People.Email
  3. Fuzzy match — handle “Jonathan Dekle” vs “Jon Dekle” (use first + last name)
  4. No match — create a new People row with Status = “New”, Source = “Fireflies”

Implementation: Use Baserow’s search API parameter on the People table, or pull all People rows into a local lookup map (179 rows is small enough to cache).

3.5 Backfill Existing Transcripts

After the sync is working for new meetings, run a one-time backfill:

  1. Read all 70+ existing transcript files from meeting-transcripts/ and voice-notes/
  2. Parse YAML frontmatter for date, participants, fireflies_id
  3. Create Interactions rows for each, linking to People where possible
  4. This gives you instant history in the Interactions table

Script: solanasis-scripts/baserow/backfill-fireflies-interactions.py


Phase 4: Pipeline Consolidation & Apollo Import

Priority: MEDIUM — needed before “super database” status Effort: 2 sessions Dependencies: Phase 1 (schema), Phase 2 (views)

4.1 The Problem

Right now you have isolated pipeline tables:

  • Foundation Prospects (200+ rows) — flat table, no link to People/Org
  • fCTO Partners (50+ rows) — flat table, no link to People/Org
  • MSP Prospects (100+ rows) — flat table, no link to People/Org

And you want to add Apollo data on top of this.

4.2 Strategy: Unified Pipeline via Deals Table

Rather than keeping separate pipeline tables forever, migrate the qualified/active prospects from each pipeline into the unified schema:

  1. People table ← contact info from each pipeline
  2. Organization table ← company info from each pipeline
  3. Deals table ← opportunities, with Pipeline field = “Foundation” / “fCTO” / “MSP” / “VC”

Keep the raw pipeline tables as read-only reference (archive, don’t delete). The scored/enriched data is valuable for reference but shouldn’t be the operational layer.

4.3 Pipeline → Unified Schema Migration

For each pipeline (Foundation, fCTO, MSP):

  1. Extract qualified prospects (Tier A + B only — don’t dump C/D into the CRM)
  2. Dedup against existing People/Org (email-based, then name-based fuzzy)
  3. Create People rows for new contacts
  4. Create Organization rows for new companies
  5. Create Deals rows with Pipeline field set appropriately
  6. Link everything — People → Organization, Deal → People + Organization

Script pattern: Follow the existing migrate_to_baserow.py pattern but target the unified tables instead of creating new flat tables.

4.4 Apollo.io Import Pipeline

Apollo exports are CSV files with standardized columns. Build a reusable import pipeline:

Script: solanasis-scripts/baserow/import-apollo.py

apollo_export.csv → Parse → Dedup against People/Org → Create rows → Link → Report

Apollo CSV → Baserow Field Mapping:

Apollo ColumnBaserow TableBaserow Field
First Name + Last NamePeopleName
EmailPeopleEmail
PhonePeoplePhone Number
TitlePeopleTitle
LinkedIn UrlPeopleLinkedIn
CompanyOrganizationName
WebsiteOrganizationWebsite
IndustryOrganizationIndustry
# EmployeesOrganizationSize Band (mapped to bands)
CityOrganizationCity
StateOrganizationState
Person SourcePeoplePipeline Source = “Apollo”

Dedup strategy:

  1. Email match (primary — most reliable)
  2. LinkedIn URL match (secondary — catches email variations)
  3. Name + Company match (tertiary — fuzzy, flag for manual review)

Import modes:

  • --plan — dry run showing what would be created/skipped
  • --run — execute import
  • --update — update existing rows with new Apollo data (for re-enrichment)

4.5 Apollo Sync Considerations

  • Apollo exports can be large (1000+ rows). Use batch API (200 rows/batch).
  • Apollo data refreshes. Plan for periodic re-import with --update mode.
  • Store Apollo ID on People rows for reliable dedup across imports.
  • Filter before import — don’t dump every Apollo contact into Baserow. Use scoring or segment filters in Apollo first.

Phase 5: Community Plugins & Premium Features

Priority: MEDIUM — enhances UX but not blocking Effort: 1 session Dependencies: Phase 1-2 (schema and views must exist first)

5.1 Baserow Plugin Ecosystem Reality Check

Your baserow-airtable-ai-native-crm-playbook.md already nailed it:

“Do NOT assume community plugins will turn self-hosted Baserow into Premium for free.” “Use 0-1 plugins max at first.”

This is still the right call. The plugin ecosystem is small and experimental. Here’s the current landscape:

5.2 Community Plugins — Evaluated

Plugin / FeatureWhat It DoesAvailable?Worth It?Notes
Grid views (built-in free)Filtered/sorted/grouped tablesFREECore of everythingGrouped grids are the free-tier workhorse
Form views (built-in free)Data entry formsFREEEssentialAll 4 CRM forms work on free tier
Gallery views (built-in free)Card-style record displayFREENice-to-haveUse for People cards with avatar
Kanban views (built-in)Drag-and-drop boardsPREMIUMHigh valueDeal pipeline, task board — #1 reason to go Premium
Calendar views (built-in)Date-based visualizationPREMIUMHigh valueInteractions/tasks by date
Dashboard views (built-in)Charts and analyticsPREMIUMMedium valuePipeline reports, conversion metrics
AI field type (built-in)GPT/Claude generates content per rowPREMIUMMedium valueAuto-summarize interactions, score leads. Alternative: external Python script calling AI API + writing back via Baserow API (free, aligns with “keep AI logic external” principle from playbooks)
Row comments (built-in)Discussion threads on recordsPREMIUMMedium valueCRM-style collaboration on deals/contacts
Row coloring (built-in)Color-code rows by field valuesPREMIUMNice-to-haveVisual priority/status indication
BaseCharts (community plugin)Chart widgets in viewsCommunityMAYBEOnly if you need in-Baserow charts without Premium. Check compatibility before installing.
BaseScript (community plugin)In-browser JavaScript scriptingCommunityNOProof-of-concept quality. Use external Python scripts instead.
Baserow geo plugin (community)Map/geography viewsCommunityNOOnly useful if territory mapping becomes critical. Premature.

5.3 Self-Hosted Premium Features — Cost/Benefit Summary

Premium pricing for self-hosted: 12/user/month (monthly)

The full Premium feature assessment is in the Budget Decision section above. In summary:

  • Kanban + Calendar + Dashboard views are the highest-value Premium features for CRM use
  • AI field + Row comments are the next tier of value
  • Row coloring, password-protected views are nice-to-haves

Recommendation: If you’re serious about making Baserow feel like a CRM (not just a database), Premium is worth the $120/year for a single user. The kanban pipeline view alone transforms the deal-tracking experience. If you want to stay free, grouped grid views are a functional alternative — just less visual.

5.4 External Dashboarding (Alternative to Premium)

If you don’t want to pay for Premium dashboards:

ToolHow It ConnectsCostBest For
Metabase (self-hosted)Direct PostgreSQL connection to Baserow’s DBFreeSQL-powered dashboards, embed in other tools
Grafana (self-hosted)PostgreSQL datasourceFreeReal-time monitoring, alerting
n8n + Google Sheetsn8n reads Baserow API → writes to Sheets → Sheets chartsFreeQuick and dirty
Baserow API + PythonMatplotlib/Plotly charts generated by scriptsFreeAutomated report generation

Recommendation: Skip external dashboarding for now. The built-in views (kanban, calendar, filtered grids) cover 80% of dashboard needs. Add Metabase later if you need SQL-powered analytics.


Phase 6: Automation & n8n Workflows

Priority: LOWER — automate after schema is stable (per your own playbook advice) Effort: 1-2 sessions Dependencies: Phases 1-4

6.1 Automation Philosophy

Your playbooks say it best:

“Do NOT automate heavily until the schema is clean. A sloppy model gets automated into a bigger mess.”

Phase 6 comes LAST intentionally. Stabilize the schema, use it manually for a week or two, then automate the friction points.

n8n has native Baserow nodes (Create Row, Update Row, Get Row, List Rows, Delete Row) and Fireflies nodes. These are the high-value automations:

Workflow 1: Fireflies → Baserow (Enhanced Sync)

Trigger: Cron (hourly)
→ Fireflies: Get recent transcripts
→ Baserow: Search People table for participant match
→ IF match: Link Interaction to existing Person
→ IF no match: Create new Person, then link
→ Baserow: Create Interaction row
→ Baserow: Update Person.Last Contacted

Note: This could replace the current Claude Code-based Fireflies sync for the Baserow-writing portion, while keeping the markdown file sync as-is.

Workflow 2: Deal Stage Change → Task Creation

Trigger: Baserow webhook (row updated in Deals)
→ IF Stage changed to "Proposal"
→ Create Task: "Draft proposal for {Deal Name}" due in 3 days
→ IF Stage changed to "Won"
→ Create Task: "Send onboarding email to {Contact}" due tomorrow
→ Create Task: "Generate invoice for {Deal Name}" due in 2 days

Workflow 3: Follow-up Reminder Digest

Trigger: Cron (daily at 8 AM MT)
→ Baserow: List Interactions where Follow-up Date = today
→ Baserow: List Tasks where Due Date = today
→ Baserow: List People where Next Touch Date = today
→ Format into digest
→ (Optional: email or Slack notification)

Workflow 4: Apollo CSV Auto-Import

Trigger: File dropped in watched folder (or manual trigger)
→ Parse CSV
→ For each row: dedup against People/Org
→ Create/update rows in Baserow
→ Generate import report

6.3 Baserow Webhooks

Self-hosted Baserow supports webhooks (even on free tier):

  • Trigger on row created, updated, deleted
  • Sends JSON payload to any URL
  • Can trigger n8n workflows

Set up webhooks on:

  • Deals table → trigger on stage changes
  • People table → trigger on new contact creation
  • Interactions table → trigger on new interaction (for auto-updating People.Last Contacted)

Assumption Register

#AssumptionValidation MethodStatus
A1Self-hosted Baserow supports form views on free tierBaserow docs confirm forms are freeVALIDATED — forms are available on all tiers
A2Baserow kanban/calendar views require Premium licenseBaserow pricing pageVALIDATED — kanban, calendar, dashboard are Premium ($10-12/user/month). Grid/Form/Gallery are free. Plan includes free-tier alternatives (grouped grids).
A3Fireflies MCP provides participant email (not just name)Check Fireflies MCP response schemaNEEDS VALIDATION — currently unknown if email is included
A4Baserow row count won’t hit practical limitsSelf-hosted has no enforced row limitsVALIDATED — self-hosted is limited only by server resources
A5The current 179 People rows can absorb pipeline + Apollo data without performance issuesPerformance depends on field count and link_rowsLOW RISK — even 10K rows is fine for Baserow
A6BaseCharts community plugin works on current Baserow versionNeed to check version compatibility on GitHubNEEDS VALIDATION — check GitHub repo before installing
A7n8n has native Baserow nodesn8n integrations directoryVALIDATED — Baserow node exists in n8n
A8Meeting Notes → Interactions migration preserves Person link_rowsNeed to verify link_row IDs survive table-to-table migrationNEEDS VALIDATION — test with 1 row first. Mitigation: Do NOT copy link_row IDs directly. Instead, read the Person name from each Meeting Notes row, look up the corresponding People row ID in the Interactions table’s link_row format, and create the link fresh. This avoids ID mismatch issues.

Quality Checklist

  • KIS (Keep It Simple): Schema adds only what the playbooks already recommend — no over-engineering
  • DRY: Reuses existing migration script patterns, TypeScript client, field mapper
  • Catch-Early: Each phase has its own validation checklist
  • Error Handling: Import scripts already handle rate limits, batch failures, dedup
  • Security: No credentials in code — all from .env, no new secrets needed
  • Test Strategy: Dry-run mode on all import scripts (—plan flag)
  • Rollback: Archive old tables (don’t delete), migration scripts are idempotent

Phase 1: Schema Redesign ──────────┐
                                    ├── Phase 2: Views & Forms
                                    ├── Phase 3: Fireflies Sync
                                    ├── Phase 4: Pipeline + Apollo
                                    │
                                    └── Phase 5: Plugins (can start after Phase 2)
                                              │
                                              └── Phase 6: Automation (after Phases 1-4 stable)

Recommended execution order:

  1. Phase 1 — Schema (do first, everything depends on it)
  2. Budget Decision — Decide on Baserow Premium before Phase 2 (see below)
  3. Phase 2 — Views & Forms (immediately after schema, makes CRM usable)
  4. Soak Period — Use the CRM manually for 3-5 days to surface schema issues
  5. Phase 3 — Fireflies sync (high-value automation, fills the biggest data gap)
  6. Phase 4 — Pipeline + Apollo (consolidate all prospect data)
  7. Phase 5 — Plugins (enhance after base is solid)
  8. Phase 6 — Automation (last — automate proven workflows, not assumptions)

Budget Decision: Free vs. Premium Self-Hosted License

This decision must be made before Phase 2. Several high-value features are Premium-only:

What’s Free on Self-Hosted Baserow

FeatureAvailable Free?
Grid views (with filters, sorting, grouping)YES
Form viewsYES
Gallery viewsYES
Link rows (relational fields)YES
Lookup / Formula fieldsYES
REST API (unlimited)YES
WebhooksYES
Unlimited rowsYES (server resources are the limit)
Unlimited tablesYES

What Requires Premium ($10-12/user/month self-hosted)

FeatureCRM Impact
Kanban viewDrag-and-drop deal pipeline, visual task board
Calendar viewSee interactions/tasks by date
Dashboard viewIn-Baserow analytics and charts
Row coloringColor-code by status, stage, priority
Row commentsAdd notes/discussion to any record
AI field typeAuto-generate summaries, lead descriptions
Password-protected viewsShare specific views with contractors

Recommendation: Two Paths

Path A (Recommended): Purchase Premium — ~$120/year

  • $10/user/month billed yearly (1 user = Dmitri)
  • Unlocks kanban boards, calendar views, dashboards, AI fields, row comments
  • Makes Phase 2 views dramatically more useful
  • This is the “super database” path — kanban pipeline is the #1 feature that makes a CRM feel like a CRM

Path B: Stay Free — $0

  • Use grid views with filters and grouping as the primary interface
  • Grid grouped by “Stage” field is a functional (if less visual) alternative to kanban
  • Calendar views replaced by filtered grids sorted by date
  • Dashboards built externally (Metabase or Python scripts) if needed
  • The CRM still works — it just looks more like a database and less like a CRM product

Pro tip: Baserow offers a 30-day free trial of Premium on self-hosted instances. You could test drive kanban/calendar/dashboards during Phase 2 before committing.


Open Questions for Dmitri

  1. Cloud → Self-hosted migration status: Has the data been migrated from Baserow Cloud (ID: 387807) to self-hosted (ID: 54)? The continuation prompt at operations/continuation-prompt-baserow-migration.md is ready but may not have been executed. This determines whether we start with the existing 179 People rows or a fresh instance.

  2. Pipeline table disposition: Should we keep the flat pipeline tables (Foundation, fCTO, MSP) as read-only archives after migrating qualified prospects to the unified schema? Or delete them?

  3. n8n availability: Is n8n installed/available on your infrastructure? If not, should we plan for it, or stick with Python scripts + Claude Code sync?

  4. Premium license: Would you consider Baserow Premium ($5/user/month self-hosted) for dashboard views and row comments? Or keep it free and use external tools?

  5. Apollo workflow: When you say “dumping in our whole pipelines from Apollo” — is this a one-time bulk import, or do you want an ongoing sync that re-imports periodically?

  6. Guild CRM sharing timeline: Is the cooperative CRM sharing concept (from the guild playbook) something that should influence this schema design now? (e.g., multi-tenant fields, access control)


Suggested Next Step

Start Phase 1 immediately. The schema redesign is the foundation everything else builds on. It can be done in a single session:

  1. Run the schema upgrade script to create Interactions, Deals, Tasks, Pipeline Stages tables
  2. Add new fields to People and Organization
  3. Migrate Meeting Notes → Interactions
  4. Verify all relationships work

Then move to Phase 2 (views & forms) in the same session if time allows — this makes the database immediately usable for daily operations.

Say the word and I’ll start building Phase 1.