Catalyst
Platform Overview

Platform & Technology Overview

The services and tools that power the Innovate Healthcare Catalyst platform

Hosting & Serverless Functions
Hosts the static Catalyst site and runs all backend serverless functions. Auto-deploys from GitHub on every push — live within ~60 seconds. Scheduled functions handle daily backups and newsletter reminders; on-demand functions handle email, contact form processing, and API calls.
Static Hosting Serverless Functions Scheduled Jobs CI/CD
🐙
Source Control & Deployment Trigger
All application code — HTML, JavaScript, Netlify functions — lives in the inno-hlth/catalyst repository. Every git push to main triggers a Netlify deploy automatically.
Version Control Deploy Trigger
🗄
Database & Authentication
PostgreSQL database accessed via REST API. Stores all proposals, contacts, companies, invoices, catalog data, and settings. Handles user authentication (email/password). Row Level Security policies ensure authenticated-only access. The app talks directly to Supabase from the browser using the anon/public key; Netlify functions use the service role key to bypass RLS for backup and admin operations.
PostgreSQL REST API Auth Row Level Security Storage
Backup Storage
Stores all automated and manual backups. Each backup is a timestamped JSON file containing all Supabase table data. Archived proposal PDFs are also copied to S3. Backups are organized by date folder and are never overwritten — every run produces a new timestamped file. Access is via signed URLs generated server-side by Netlify functions.
JSON Backups PDF Archive Signed URLs
Transactional Email
Sends all transactional emails from the platform — proposal PDFs to clients, accepted proposals to accounting, invoice emails, backup notifications, newsletter reminders, and the Payments page access code. All sent from the innovatehealthcare.com verified domain via the Resend API in Netlify functions.
Proposal Emails Invoice Emails Access Codes Backup Alerts
🐵
Email Marketing & List Management
Manages subscriber lists for all three publications. When a contact submits the website form with a CRM interest (Media Kit, Custom Marketing, Press Release), they are automatically subscribed to the IH Master List with the correct publication interest groups, and to the appropriate brand list (CVB / RB / HE) with newsletter frequency interest groups. For Media Kit and Custom Marketing, the 7-step follow-up email automation is triggered.
IH Master List CVB Brand List RB Brand List HE Brand List Interest Groups Automations
🚀
Contact & Company Enrichment
Used to bulk-enrich contacts and companies with data from the Apollo database. Company enrichment fills website, phone, address, city, state, and industry. Contact enrichment fills title, phone, and LinkedIn URL. Enrichment runs via Netlify functions using the Apollo People Match and Organization Enrich APIs. API key managed in Admin → API Keys.
Company Enrichment Contact Enrichment People Match API
📝
Press Release Submission
External content management system used by Innovate Healthcare editorial staff. When a visitor selects "Publishing a Press Release" on the contact form, they are subscribed to Mailchimp and then redirected to the TriMed CMS press release submission form rather than staying in the Catalyst flow.
Press Releases Editorial
🌐
Public Website & Contact Form Source
The public-facing Innovate Healthcare website. The contact form on the site is an iframe embedding contact-form-embed.html from Catalyst. Form submissions POST directly to the Catalyst Netlify function — no separate form service needed. Success and error states display inside the iframe without reloading the parent page.
iframe Embed Contact Form Wix
GitHub (source) ──push──▶ Netlify (deploy + functions) │ ┌───────────────┼───────────────────────┐ ▼ ▼ ▼ Supabase Resend AWS S3 (data + auth) (transactional email) (backup storage) │ ┌─────────┴──────────┐ ▼ ▼ Mailchimp Apollo.io (list + automation) (enrichment) InnovateHealthcare.com ──iframe──▶ contact-form-embed.html │ Netlify Function (contact-form.js) / | \ Supabase Mailchimp Resend
Innovate Healthcare — Proposal Builder Flow

From new proposal creation through invoicing and payment

New Proposal
Client Info
Name · Company · Contact · Presenter · Audience
Select Brand & Rate Card Items
CVB · RB · HE  |  Checkbox · Qty · Monthly · Multi-instance
Investment Summary Auto-calculates
Billing option · Custom line items · Pricing validity
Save → Supabase
proposals table · status: Draft
Next Action?
Preview / Print
Browser Print-to-PDF
Branded proposal layout
client-ready formatting
Local PDF — no email sent
Send Proposal
Resend — PDF email to client
Branded PDF attached
from: innovatehealthcare.com
Archive PDF URL → Supabase
pdf_sent_url saved · status: Sent
Proposal Outcome?
Accepted
Send to Accounting
Resend email → accounting@
Full proposal detail + PDF
Archive Accepted PDF → Supabase
pdf_accepted_url · status: Accepted
Projects Board
Deliverables per rate card section
Owner · Status · Date range
Orders → Create Invoice
Invoice record → Supabase
Resend PDF → client
Payments
Mark paid · Check/ref #
Commission report
✓ Closed — Won
Declined
Update Status → Declined
Stored in Supabase
proposals table
✗ Closed — Lost
Edit & Re-save
Update Rate Card / Client Info
Repriced or revised proposal
status remains Draft
Save → Supabase
proposals table updated
↩ Back to Draft — ready to send
Supabase read/write
Resend email
Supabase archive (PDF URL)
Downstream tracking (Projects · Orders · Payments)
Declined / closed lost
Local only — no server action

* Invoices created in Orders page are stored in the invoices Supabase table and emailed to accounting via Resend  |  Payment records feed the commission PDF report on the Payments page

Innovate Healthcare — Contact Form Submission Flow

InnovateHealthcare.com Information Request Form

Form Submitted
What is the visitor's Interest?
Media Kit /
Advertising Info
Supabase Upsert
Match company · merge tags
Mailchimp Brand List
Daily/Weekly/Monthly News
+ Announcements + Conferences tags
Mailchimp IH Master List
Media Kit Date + Interest Groups
+ Sub: tag + Conference tag
+ CVB/RB/HE Media Kit tag
⚡ Mailchimp Automation
IH Master List 7-Step Media Kit Follow Up Email Automation
🔔 "Thank you for your interest.
Someone from our team will
be in touch shortly."
→ Redirect to InnovateHealthcare.com
Custom Marketing
/ Webinars
Supabase Upsert
Match company · merge tags
Mailchimp Brand List
Daily/Weekly/Monthly News
+ Announcements + Conferences tags
Mailchimp IH Master List
Media Kit Date + Interest Groups
+ Sub: tag + Conference tag
+ CVB/RB/HE Media Kit tag
⚡ Mailchimp Automation
IH Master List 7-Step Media Kit Follow Up Email Automation
🔔 "Thank you for your interest.
Someone from our team will
be in touch shortly."
→ Redirect to InnovateHealthcare.com
Billing or
Accounting Issue
🔔 "Thank you for your inquiry.
Someone from our team will
be in touch shortly."
→ Redirect to InnovateHealthcare.com
Editorial
Correction / Inquiry
🔔 "Thank you. Someone from our team
may be in touch for further details."
→ Redirect to InnovateHealthcare.com
Submit a
News Tip
🔔 "Thank you. Someone from our team
may be in touch for further details."
→ Redirect to InnovateHealthcare.com
Publishing a
Press Release
Mailchimp Brand List
Daily/Weekly/Monthly News
+ Announcements + Conferences tags
Mailchimp IH Master List
Interest Groups + Sub: tag
+ Conference tag
(no automation tag)
🔔 "Taking you to our press
release submission form…"
→ Redirect to TriMed CMS
Other
🔔 "Thank you for your interest.
Someone from our team will
be in touch shortly."
→ Redirect to InnovateHealthcare.com
Full CRM — Supabase + Mailchimp (brand + master) + sales@
Mailchimp only — brand + master, no Supabase
Operational — dedicated inbox only
Redirects to TriMed CMS after Mailchimp
Toast on all successful submissions

* Conferences of Interest hidden until publication selected: Cardiovascular Business → Cardiology  |  Radiology Business → Radiology  |  HealthExec → Healthcare

Mailchimp Interest Group IDs
CVB Brand List
Daily & Breaking News — 12f0d0eceb
Weekly News Summary — 8c67b1cab3
Monthly News Highlights — d6214dca85
Announcements — b6d7d31829
RB Brand List
Daily & Breaking News — 6b0680d4aa
Weekly News Summary — 2a015f2199
Monthly News Highlights — 1ac689f32e
Announcements — ddc9654fce
HE Brand List
Daily & Breaking News — 8702a7ae5c
Weekly News Summary — 183d23dfa5
Monthly News Highlights — adc980e7e4
Announcements — bf2c20a135
IH Master List (bed098518d)
Cardiovascular Business — 9bfe88bf20
HealthExec — 201ff4eabf
Radiology Business — 21c5769702
Innovate Healthcare — Prospecting, Tags & Subscription Flow

How companies & contacts get in, how tagging works, and how tags become Mailchimp subscriptions

New Company / Contact
Entered via Prospecting or a Tradeshow page?
Prospecting
Company shows in the list if Status = a pipeline status
Prospecting / Proposal / Renewal, etc. — which statuses count is set in Admin → Company Statuses
+ Add Company, or promote a contact straight from a Proposal
"Add to Contacts" on any proposal-only contact row
Tradeshow Page
Company shows if registered for that show, OR already carries that show's tag
+ Add Exhibitor / Import Exhibitors — or any company tagged e.g. "HRS" auto-appears on the HRS page
Same shared companies + contacts database as Prospecting
One record set behind every page — no duplication between shows
+ Select Contacts modal
Identical modal & functions on Prospecting and every Tradeshow page — search, add a new contact inline, or link an existing one
Tagging a Company
Click the + tag pill next to the company name
Same control on Prospecting and every Tradeshow page
Type a tag (autocomplete suggests existing tags) → Enter
Tag saves onto the company record only
companies.tags in Supabase — contacts are NOT touched at this point. Removing a tag (× on the chip) is instant and just as isolated.
Turning Tags Into Subscriptions
What triggers "Apply Tag Subscriptions"?
↑ Sync to MailChimp
(per company)
Row button on Prospecting or any Tradeshow page
Runs all 3 steps below immediately, for that one company
Admin → Subscription
Update (bulk, manual)
📬 Apply Subscriptions · 📧 Sync to Mailchimp · 🏥 Sync All to Innovate
Same 3 steps, run manually for every company at once
Every Saturday Night
(automatic)
weekly-mailchimp-sync.js scheduled function
Runs all 3 steps for the whole database, then emails a summary to admin@innovatehealthcare.com
Apply Tag Subscriptions
For each company: reads its tags + the CVB / RB / HE mapping configured in Admin → Company Tags. Sets matching pubCVB / pubRB / pubHE = true on every contact under that company. Additive only — never removes an existing subscription.
Where the tag → publication mapping is set
Admin → Settings → Audience → Company Tags: every tag has three checkboxes — CVB / RB / HE. Checking one means "a company with this tag subscribes its contacts to that brand." A tag with no boxes checked is just a label — it has no subscription effect.
Pushing Subscribed Contacts to Mailchimp
Push Subscriptions to Mailchimp
Contacts with pubCVB / pubRB / pubHE = true → subscribed to that brand's Mailchimp audience with Daily News, Weekly News, Monthly News & Announcements interest-group tags
Push All Contacts to Innovate Healthcare List
Every contact with an email → IH Master list. Sets CVB_CAT / RB_CAT / HE_CAT merge fields to today's date + Sub: CVB / RB / HE tags, based on their subscription flags
Both steps never re-subscribe a contact who previously unsubscribed
✓ Contact receiving the right newsletters
Supabase read/write (company/contact records)
Mailchimp brand audience push
Mailchimp IH Master list push
Automated / scheduled step
Manual step required — nothing happens automatically here
Admin bulk action

* Tagging a company and subscribing its contacts are two separate steps by design — adding a tag never pushes anyone to Mailchimp on its own. Something must run "Apply Tag Subscriptions" first (a per-company sync, an Admin bulk action, or the Saturday-night job).