Privacy Policy
Last updated: 2026-10-13
Operator: MadCool LLC · doing business as Mad Cool HiFi
This policy explains what madcoolhifi.com collects, why, and what you can do about it. It covers the main site (madcoolhifi.com), the auth bridge (auth.madcoolhifi.com), the text messages you can sign up for through the site's chat widget, and the HighLevel Marketplace integration that connects a dealer's HighLevel sub-account to Mad Cool HiFi.
What we collect
Account data — when you sign in with a magic link we store your email address and a Supabase-issued user id. If you become a member we also store the Stripe customer id and subscription status.
Session data — a signed, HttpOnly cookie holding an HS256 JWT with your user id and a single membership flag. It expires after seven days.
Form submissions — the audit, Snapshot, Signal Path, waitlist and onboarding forms store what they ask for, such as your name, email address, business name, website and an optional phone number. We use it to produce and email what you requested and to follow up about it. Audit requests may also be added as a contact in our own HighLevel account. Phone numbers entered on these forms are never used for text messages (see "Text messages (SMS) and the chat widget" below).
Usage data — Vercel Analytics records aggregate page-view counts without cookies. Google Analytics 4 records page views and two site events: generate_lead when you submit the audit, Snapshot, Signal Path or waitlist form, and begin_checkout when you start a checkout. Those events carry only the form or plan name, never what you typed. Google Analytics runs in Google's Consent Mode with every category denied by default: until you accept analytics in the consent banner it sets no cookies and sends Google only cookieless pings, and its advertising features (ad storage, ad user data, ad personalization) stay off even if you accept. PostHog loads only after you accept analytics and records page views and page exits. It does not autocapture clicks or form input, and it sets no cookies.
Bot protection — the audit, Snapshot and Signal Path forms, and the sign-in form on auth.madcoolhifi.com when it is enabled, use Cloudflare Turnstile to tell people from bots. Turnstile runs a check in your browser that sends Cloudflare your IP address and signals about your device and browser. We receive only a pass-or-fail token, which our server confirms with Cloudflare along with your IP address. This is a security measure, so it runs without asking for consent. Cloudflare describes what it collects in its Turnstile privacy addendum.
Abuse limits — to stop form and API abuse we keep short-lived counters of recent requests per IP address and, on some forms, per email address. The counters live in Upstash (hosted Redis) and expire on their own.
Location — the dealer locator's "use my location" button asks your browser for your position. It is used in your browser to sort dealers by distance and is never sent to our servers. Moving the map to your area does load map tiles for that area from Mapbox.
Error data — the Vercel runtime logs unhandled exceptions and BetterStack ingests application logs, both with request query params scrubbed for secrets. Used to debug, never to identify visitors.
Text messages (SMS) and the chat widget
The chat bubble in the bottom-right corner of most pages is a LeadConnector widget (LeadConnector is HighLevel's messaging service) connected to our own HighLevel account. It is the only place on madcoolhifi.com where you can sign up to receive text messages from us. It is hidden on /snapshot, /signal-path, /onboard and inside the client portal.
What we collect — the name, mobile number and message you enter in the widget, plus an email address if you give one. Your message arrives in our HighLevel inbox, and we or an automated reply may answer it by text. Texts come from +1 307-429-3845.
Consent — before you submit, the widget shows an unchecked consent box with consent language. By checking it and submitting, you authorize MadCool LLC to text (and call) the number you entered, including promotional messages, possibly sent by automated means.
- Message frequency varies.
- Message and data rates may apply.
- Reply STOP to opt out at any time. Reply HELP for help, or email hello@madcoolhifi.com.
- Consent to receive texts is not a condition of any purchase.
No sharing of mobile information — we do not sell, rent or share your mobile number or your SMS opt-in consent with third parties or affiliates for their marketing or promotional purposes. Text-messaging originator opt-in data and consent are excluded from every other kind of sharing in this policy. They are handled only by us and by the service providers that run the messaging for us, such as HighLevel/LeadConnector and the phone carriers that deliver the texts.
Phone numbers from other forms — the optional phone fields on /snapshot, /signal-path and /onboard are not an SMS sign-up. We do not send text messages, marketing or otherwise, to numbers collected there. Only an opt-in through the chat widget lets us text you.
What the widget loads — the widget loads whether or not you accept optional cookies. When it loads, your browser contacts LeadConnector's servers, which receive your IP address and browser details, and the widget may store its own identifiers in cookies or local storage on your device. It may also request a font from Google Fonts. LeadConnector's terms and privacy policy, linked from the widget, also apply to what you submit through it; see the HighLevel privacy policy.
HighLevel sub-account data (Marketplace integration)
When a dealer installs the Mad Cool HiFi app from the HighLevel Marketplace and authorizes the connection, we receive an OAuth access token and refresh token scoped to that single sub-account. We store the token pair in our own Supabase project, encrypted at rest by the provider and isolated by row-level security so only our service-role key can read it. The refresh token rotates on every refresh; we persist the new value before responding to the API call so a lost rotation cannot leave the install in an unrecoverable state.
Scopes we request and what they let us do:
contacts.readonly,contacts.write— read contact records to drive monthly reporting and lifecycle dashboards; write managed-service tags (e.g.mch:foundation:lead) to segment outreach.conversations.readonly,conversations/message.write— audit response times and send templated review-request and follow-up messages on the dealer's behalf.opportunities.readonly,opportunities.write— pipeline metrics and stage transitions when our team works leads.calendars.readonly,calendars/events.readonly— surface upcoming appointments and booked/no-show metrics.workflows.readonly— verify the deployed snapshot's workflows are installed and active.locations.readonly,users.readonly— identify the connected sub-account and map our team's actions to specific HL user IDs for an audit trail.
We do not request agency-level scopes (no oauth.*, snapshots.*, companies.*), billing or payment scopes, social-planner write scopes, or the SaaS-mode location-provisioning scopes. We do not export contact lists from one connected sub-account to any other party.
Webhook data — we subscribe to lifecycle webhooks (contact, opportunity, appointment, and inbound-message events) and store the raw event payloads in ghl_webhook_events for 90 days for debugging and idempotent processing. Each event is signature-verified against HighLevel's published Ed25519 public key before it is accepted; unsigned or invalid-signature events are rejected.
Per-sub-account isolation — every connected sub-account holds its own token pair and its own webhook event history. We never cross-reference data between sub-accounts and never share one dealer's HighLevel data with another dealer.
Revoking access — uninstall the Mad Cool HiFi app from the HighLevel sub-account install screen at any time. Uninstalling invalidates the access and refresh tokens within minutes; we stop reading and writing immediately. To request deletion of the retained webhook events for an uninstalled sub-account, email hello@madcoolhifi.com.
What we don't collect
We do not sell data, share it with advertising networks, or build marketing profiles. We do not track you across sites you don't own. We do not read the contents of files you upload outside of what's strictly required to serve them back to you.
Who we share it with
Data is processed by the vendors that run the stack: Supabase (database + auth), Vercel (hosting + analytics), Stripe (payments), Fastmail (transactional email), Google (Google Analytics 4, cookies only with your consent), PostHog (product analytics, opt-in only), Cloudflare (Turnstile bot checks), HighLevel/LeadConnector (the chat widget, text messages, and our own lead records), Mapbox (dealer maps, which send Mapbox your IP address and map usage data when they load), Upstash (rate-limit counters), BetterStack (uptime monitoring + log aggregation). Each handles data under its own terms, and we never grant them more access than the service needs.
Google explains how it uses data from sites that run Google Analytics in How Google uses information from sites or apps that use our services and its privacy policy.
For the HighLevel Marketplace integration, the dealer who installed the app is the data controller for that sub-account's HighLevel data; Mad Cool HiFi acts as a processor under the dealer's instructions and only on the connected sub-account. We do not transfer HighLevel sub-account data to any third party other than the infrastructure vendors above.
Your rights
You can request an export or deletion of your account data at any time by emailing hello@madcoolhifi.com. We respond within 30 days. To stop text messages, reply STOP to any text from us. EU/UK residents have the rights described in GDPR Article 15-22; California residents have the rights described in CCPA §1798.100-1798.150.
Retention
Account rows live as long as the account exists. HighLevel OAuth token pairs are deleted when the dealer uninstalls the integration. HighLevel webhook event logs are kept 90 days from receipt. Aggregate analytics are kept indefinitely but are not tied to your identity after deletion. Chat-widget contacts, including your SMS consent or opt-out, stay in our HighLevel account until you ask us to delete them.
Changes
Material changes to this policy will be announced by email to active members at least 14 days before they take effect.