HubSpot Migration Plan — Data Review & Approval

For: Holly Baumkratz, Catherine From: Vash Date: March 2026


What This Document Is

We're moving customer data from Calypso into HubSpot so the team has visibility into every account, renewal, and contact without needing to ask for SQL queries. This document lays out exactly what data goes into HubSpot, where it comes from, and what we need from you before we pull the trigger.

ChefTec.exe keeps running against Calypso as-is. Nothing changes for customers or for Mitch. This is about giving the sales and support team a real CRM.


What We're Working With Today

Metric Count
Active customers 525
Cloud customers 380 (72%)
On-premises customers 145 (28%)
Annual revenue (trailing 12mo) $1,603,140
Avg revenue per customer $3,396
Customers with email on file 525 (100%)
Customers with phone on file 495 (94%)
Customers with lead source 524 (99.8%)

Product Tier Breakdown

Product Customers %
Plus 298 57%
Ultra 150 29%
Enterprise Premier 37 7%
Enterprise Ultima 33 6%
Basic 5 1%
Enterprise 2 <1%

Cloud Servers

Server Customers
Delta 152
Marble 72
Holly 39
Empire 36
Lyons 29
Creede 26
Jamestown 24
Kiowa, Grover, Pitkin 1 each

Top Market Segments

Segment Customers
Restaurants 161
Country Clubs / Golf / Yacht Clubs 93
Supermarkets / Grocery / Co-ops 48
Catering 32
Hotels / Resorts / Spa 21
Manufacturer 20
Assisted Living / Senior Centers 15
Education / Universities 12
Deli / Bakery / Coffee Shop 12

The Five Core Tables

We're building a clean intermediate database that sits between Calypso and HubSpot. Instead of importing Calypso's messy data directly, we clean it first, then push the clean version to HubSpot. Here are the five tables and every field that will exist.

1. CUSTOMERS (one row per company)

This is the anchor. Every company gets one clean row with their canonical name, address, subscription status, and key attributes.

Field What It Is Where It Comes From Example
customer_id Unique company identifier Subscriptions.ID 84907
company_name Official company name CustDet.Company (deduped) "Manito Country Club"
address Street address AddressBook (first record) "123 Main St"
city City AddressBook "Springfield"
state State abbreviation AddressBook "IL"
zip ZIP code AddressBook "62704"
country Country AddressBook (default: US) "US"
region Geographic region Derived from state "Midwest"
industry_segment Market segment MailStartFollowup + LkMarketSegments "Restaurants"
customer_status Active / Churned / Expired Derived from Subscriptions "Active"
acquisition_date When they became a customer Subscriptions.OriginalAcquisition "2018-03-15"
renewal_date Next renewal date Subscriptions.SubscriptionRenews "2026-06-01"
subscription_type Subscription tier code Subscriptions.SubscriptionType 2
is_cloud Cloud or on-premises Subscriptions.CloudServices true
cloud_server Which server they're on Cont4X.CloudServer "Delta"
product_tier Product edition Derived from SerialNumbers "Ultra"
annual_revenue Revenue in last 12 months Payhist (summed) $3,200
lifetime_revenue All-time revenue Payhist (summed) $28,500
lead_source How they found us Cont4.OriginalSource "Ref-Customer"
lead_source_channel Channel group Derived from lead source "Referral"
size_tier Revenue-based segment Derived from annual revenue "Mid-market ($2K-$10K)"
pos_vendor POS system they use InterfaceDetail / Cont4 (normalized) "Aloha"
owns_pos Do they own their POS? Cont4."Own POS?" true
first_payment_date First payment ever Payhist (min date) "2015-07-22"
last_payment_date Most recent payment Payhist (max date) "2026-01-15"

What we need from you: Review this list. Is anything missing that you regularly look up in Calypso? Is there anything here you'd never use?


2. CONTACTS (one row per person)

Every person associated with a company. Primary contact ranked first.

Field What It Is Where It Comes From Example
contact_id Unique contact identifier Cont4.Cont4ID 45231
customer_id Company they belong to Cont4.ID 84907
contact_rank Primary (1) or secondary (2+) Derived from ROW_NUMBER 1
first_name First name Parsed from Cont4.Contact "John"
last_name Last name Parsed from Cont4.Contact "Smith"
email Email address CustDet.Email "john@manito.com"
phone Phone number CustDet.Phone "(217) 555-1234"
title_code Title abbreviation Cont4.Title "GM"
title_full Full title LkTitle lookup "General Manager"
is_decision_maker Decision-maker flag Derived from title code true
lead_source How this contact came in Cont4.OriginalSource "Ref-Customer"

What we need from you: Are there contacts you know are wrong or outdated? Do you maintain a separate contact list anywhere (spreadsheet, Outlook) that might be more current?


3. SUBSCRIPTIONS (one row per active subscription)

Each subscription becomes a "Deal" in HubSpot — this is the renewal pipeline.

Field What It Is Where It Comes From Example
subscription_id Unique subscription ID Subscriptions.SubscriptionID 12345
customer_id Company Subscriptions.ID 84907
deal_name Display name Derived "Manito Country Club — Renewal"
amount Annual revenue Payhist (12mo sum) $3,200
stage Pipeline stage Derived from dates "Active"
renewal_date When it renews Subscriptions.SubscriptionRenews "2026-06-01"
acquisition_date Original start date Subscriptions.OriginalAcquisition "2018-03-15"
is_primary Primary subscription? Subscriptions.PrimarySubscription true
is_cloud Cloud deployment Subscriptions.CloudServices true
do_not_renew Flagged for churn Subscriptions.DoNotRenew false
days_until_renewal Days to renewal Derived 82
subscription_type Type code Subscriptions.SubscriptionType 2

Deal stages in HubSpot: - Active — Renewal is 60+ days out, everything normal - Renewal Due — Within 60 days of renewal, needs attention - Churned — DoNotRenew flagged - Expired — Past renewal date

What we need from you: Does this pipeline match how you think about renewals? Are there stages missing (e.g., "Invoice Sent", "Payment Received")?


4. LICENSES (one row per serial number)

Licensing detail stays in the intermediate database. Only a summary (product tier) goes to HubSpot as a company-level property.

Field What It Is Where It Comes From Example
serial_number License key SerialNumbers.SerialNumber "875123456"
customer_id Company SerialNumbers.ID 84907
serial_type Main or Companion Derived (875=Main, 675=Companion) "Main License"
primary_rank Is this the primary serial? Derived (rank 1 = primary) 1
is_active Currently active Derived from activation dates true
product_tier Edition Derived from Has* flags "Ultra"
activation_date Last activated SerialNumbers.Activated "2024-11-20"
cheftec_version App version SerialNumbers.ChefTecVersion "5.1.2"
14 edition flags Has ChefTec/Plus/Ultra/etc. SerialNumbers.Has* true/false
3 interface flags EDI/QB/Vendor SerialNumbers.Interface* true/false
21 module flags All modules SerialNumbers.Module* true/false
9 export flags Export capabilities SerialNumbers.Export* true/false

What goes to HubSpot: Only product_tier (from the primary serial) is pushed to the Company record. The per-serial detail stays in the intermediate database for reference and reporting.

What we need from you: Do you ever need to look up specific module or interface flags for a customer? If so, we can push key ones (like InterfaceVendor) to HubSpot as well.


5. POS VENDORS (one row per customer with POS data)

Normalized POS vendor information. We clean up the misspellings and give you a canonical vendor name.

Field What It Is Where It Comes From Example
customer_id Company Various sources 84907
pos_vendor_raw Original messy value InterfaceDetail / Cont4 "Alhoa POS System"
pos_vendor Cleaned vendor name Normalized by our code "Aloha"
owns_pos Customer owns their POS Cont4."Own POS?" true
source Where we got the data InterfaceDetail or Cont4 "InterfaceDetail"

What goes to HubSpot: pos_vendor and owns_pos as Company properties.

What we need from you: Can you spot-check a few of these? If you know "Customer X uses Toast" we can verify our normalization is working.


Known Data Quality Issues

We've found these problems in Calypso. The cleaning layer fixes them before anything reaches HubSpot, but you should know about them.

Issue What's Wrong How We Fix It Your Help Needed
Duplicate company rows 9,239 customer IDs have multiple rows in CustDet We take the first row per ID (ROW_NUMBER dedup) None — automated
Garbage company names 18 active accounts have blank names, "///", IP addresses, or numeric entries as company names We filter these out of reports Can you identify these accounts? They're paying customers with no name on file
Shared customer IDs Some IDs map to multiple businesses (e.g., one ID for both "Dixie Tavern" and "Profit Strategies") We flag these for manual review Need you to tell us which is the real customer
POS misspellings "Alhoa", "Alohoa", "aloha POS" all mean "Aloha" Automated normalization with 65+ pattern rules Spot-check a sample
Missing phone numbers 30 active customers have no phone Import as-is, team fills in HubSpot Update as you learn them
No support ticket history Support tickets exist (101K rows) but not mapped yet Phase 2 — comes later None now

Roadmap & Timeline

Week 1: Data Validation (YOU ARE HERE)

Task Who What
Review this document Holly, Catherine Confirm fields, flag anything missing or wrong
Spot-check 20 accounts Holly, Catherine We give you a list of 20 companies — verify names, tiers, and contacts match what you see in Calypso
Resolve shared IDs Holly, Catherine We provide the list of ambiguous IDs — you tell us which company name is correct
Identify the 18 unnamed accounts Holly, Catherine We provide customer IDs — you look them up in Calypso and give us the real names

Week 2: HubSpot Setup & First Import

Task Who What
Create HubSpot custom properties Vash Set up all the fields listed above in HubSpot
Build intermediate database Vash Stand up the clean database with all 5 tables
Import companies (525) Vash Load all active companies into HubSpot
Import contacts Vash Link contacts to their companies
Import deals (renewal pipeline) Vash Every active subscription becomes a deal with a stage

Week 3: Validation & Team Onboarding

Task Who What
Validate 50 accounts in HubSpot Holly, Catherine Open HubSpot, search for companies you know, verify everything looks right
Walk-through session Vash + Holly + Catherine Live demo: how to find a customer, see their renewal, check their product
Flag corrections Holly, Catherine Anything wrong goes into the corrections list — we fix it in the cleaning layer

Week 4: Go Live

Task Who What
Team starts using HubSpot daily Holly, Catherine Look up customers in HubSpot instead of asking for queries
Begin email tracking Holly, Catherine Send customer emails from HubSpot so they're logged
Set up renewal views Vash Filtered views: "Renewing this month", "Renewing next 60 days", "At risk"

Month 2-3: Automation

Task Who What
Automated sync (Calypso → HubSpot) Vash New customers and status changes flow automatically
Renewal workflow Vash Automatic reminders at 90/60/30 days before renewal
Usage signals Vash "Last active date" and "usage tier" pushed to HubSpot from app telemetry
Support history Vash Ticket counts and last ticket date added to company records

What We Need From You Now

  1. Read through the five tables above. Flag anything missing, wrong, or confusing.
  2. Tell us about your current workflow. What do you look up most often in Calypso? What takes the most clicks? What information do you wish you had at a glance?
  3. Block 30 minutes for a spot-check session. We'll pull 20 sample accounts and walk through them together — you tell us if the data matches reality.
  4. Pipeline stages — does Active / Renewal Due / Churned / Expired work, or do you need additional stages?

Best Way to Work Together

Option A (recommended): Shared review session We schedule a 45-minute call. I screen-share the sample data. You tell me in real-time what's right and what's off. We document corrections on the spot. One session gets us 80% of the way there.

Option B: Async review I send you a spreadsheet with 50 sample accounts (name, product, renewal date, contact, email). You mark up corrections in a column and send it back. Takes longer but works if schedules don't align.

Either way, once you've signed off on the data, we can have HubSpot live within a week.


Questions? Reply to this doc or grab me on Slack.