For: Holly Baumkratz, Catherine From: Vash Date: March 2026
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.
| 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 | Customers | % |
|---|---|---|
| Plus | 298 | 57% |
| Ultra | 150 | 29% |
| Enterprise Premier | 37 | 7% |
| Enterprise Ultima | 33 | 6% |
| Basic | 5 | 1% |
| Enterprise | 2 | <1% |
| Server | Customers |
|---|---|
| Delta | 152 |
| Marble | 72 |
| Holly | 39 |
| Empire | 36 |
| Lyons | 29 |
| Creede | 26 |
| Jamestown | 24 |
| Kiowa, Grover, Pitkin | 1 each |
| 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 |
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.
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?
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?
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")?
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.
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.
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 |
| 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 |
| 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 |
| 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 |
| 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" |
| 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 |
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.