Intern
What you actually do
Run the $1 test and the unknown-email test. Screenshot both. Unmatched has an owner. You do not get to 'clean it later'.
Library / Wire / Stripe is how Won becomes a fact
Payments that ping Slack while GHL still shows a lead are how you run two books. The invoice or Checkout session must update the same contact, move the opportunity to Won, set customer status, and start onboarding — not a celebration GIF in a channel. This is the object wire, including the $1 test.
Payments that ping Slack while GHL still shows a lead are how you run two books. The invoice or Checkout session must update the same contact, move the opportunity to Won, set customer status, and start onboarding — not a celebration GIF in a channel. This is the object wire, including the $1 test.
Email on the Stripe customer must match the GHL contact. If checkout used a different email than the booking, you will create a second person who paid and a first person still in proposal. Put the GHL email on Checkout when you can, or write a matching rule you can audit.
Won requires a payment object, not a manual stage click. If a user can drag to Won without Stripe, Won is a feeling and cash will not match the board.
Product ids map to offers. One 'coaching' product that covers three packages will make revenue reports lie. Name prices as the sale map names them.
Onboarding is a journey that starts on paid, not when someone remembers to send a Notion. Access, kickoff event, intake — those are objects on the same contact.
Do not use Slack as the payment ledger. A channel notification can exist, but it is not write-in. If GHL would be wrong when Slack is down, you are not wired.
Intern
Run the $1 test and the unknown-email test. Screenshot both. Unmatched has an owner. You do not get to 'clean it later'.
Operator
Won is a payment. Protect the map of price ids. Ban personal payment links. Reconcile weekly or you will not notice refunds and duplicates.
CEO
If Stripe and GHL disagree, you do not have a forecast. You have a channel notification. Match is the number. Until it exists, more products are more leak.
Stripe customer/email, Checkout session or invoice, product/price id, GHL contact, opportunity, status:customer, payment fields (amount, date, stripe_id), onboarding workflow, Conversations.
Checkout completed or invoice paid → GHL contact match on email; opportunity Won
Product/price id → offer tag or custom field offer; never inferred from the charge description alone
Paid → status:customer; source and offer tags stay; lead tags do not remain as status
Paid → onboarding workflow enrolls; failed payment is a different edge (see dunning)
Write: match Stripe customer email to GHL contact. If missing, create contact and flag unmatched_payment for a human. Prefill checkout with the CRM email when the link is sent from GHL.
Why: Mismatched emails are the number-one paid-but-not-Won ticket.
Done when: The rule is one paragraph. Unmatched payments have an owner.
Table: Stripe price id → offer name → GHL tag/field → pipeline (if more than one offer motion).
Why: Without this, every payment looks the same and onboarding sends the wrong access.
Done when: A $1 test on the live price writes the correct offer on the contact.
Paid → Won. Amount and stripe_id on the contact or opportunity. Owner remains the closer. Do not create a second 'Finance' pipeline unless you have a real second job.
Why: Open deals that already paid destroy forecast and make sales chase people who already bought.
Done when: Test payment closes the deal. Board count of open paid is zero.
Workflow: access instructions, kickoff booking or date, intake if required. Stop lead nurture. Conversations stays the thread.
Why: Day 0–7 predicts completion more than the curriculum. A welcome PDF in Slack is not day 0.
Done when: Test payer gets onboarding message and is not still in the lead spine.
Stripe successful charges (minus the unmatched queue) vs GHL Wons this week. Investigate every miss. Do not 'catch up at month end'.
Why: Month-end catch-up is how you discover the leak after the refund window.
Done when: A weekly match or a named exception list with owners.
Send yourself a checkout link from the CRM contact. Pay $1 on a real price id. Confirm: same contact, Won, amount, stripe_id, offer field, lead nurture stopped, onboarding started. If a second contact appeared, stop. Identity is the ticket. Do not build a fancy receipt email until that is true.
A new package, a new Stripe product, or a finance tool until paid ↔ Won matches this week. More SKUs with unmatched payments multiply two books.
Sales marks Won on the call. Stripe pings Slack. Onboarding is a Google Doc. A second email at checkout creates a ghost customer. Lead workflow keeps mailing a payer. Refunds never reopen or tag. That is cash with no operating system.
One $1 payment from a known GHL email. One contact. Won. Onboarding. Nurture stopped. Then a payment from an unknown email: unmatched flag, human owner, no silent second database. Monday: Stripe vs GHL count.
Verbal yes is a stage. Paid is Won. Mixing them makes cash and pipeline disagree, which is how CEOs stop believing the board.
Same objects: payment event, identity, offer map, Won, onboarding. The processor is not the system. Write-in is.
Those skip the CRM email prefills and the offer map. Ban them or they will always create unmatched payments.
This week
This week: identity rule, one price mapped, $1 test, onboarding from paid, Slack is not the ledger. Unmatched queue named.
A full calendar and an empty pipeline is two databases.
Read ↗A high score in a CSV is not a qualified opportunity.
Read ↗If the thank-you does not change the contact, the page was a brochure.
Read ↗A lead sitting in Ads Manager is already someone else's booking.
Read ↗Working notes
The minimum CRM, pipeline, and nurture spec before you add more pages. Request the file. It arrives by email — not a public dump, not a drip of slogans.
Email and WhatsApp stay open. A call is for installing the system — not for a tour of tools.