<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Ship Log]]></title><description><![CDATA[Building with AI at work and on the side. What shipped, what broke, what I learned]]></description><link>https://kylorjohnson.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!sf1P!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fkylorjohnson.substack.com%2Fimg%2Fsubstack.png</url><title>Ship Log</title><link>https://kylorjohnson.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 11 Apr 2026 21:58:27 GMT</lastBuildDate><atom:link href="https://kylorjohnson.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Kylor Johnson]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[kylorjohnson@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[kylorjohnson@substack.com]]></itunes:email><itunes:name><![CDATA[Kylor Johnson]]></itunes:name></itunes:owner><itunes:author><![CDATA[Kylor Johnson]]></itunes:author><googleplay:owner><![CDATA[kylorjohnson@substack.com]]></googleplay:owner><googleplay:email><![CDATA[kylorjohnson@substack.com]]></googleplay:email><googleplay:author><![CDATA[Kylor Johnson]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Don’t Optimize the Model Before You Know What Output You Need]]></title><description><![CDATA[Dates: March 31 &#8211; April 3, 2026 Projects: SuperCat Health Scoring / Pipeline to Paycheck]]></description><link>https://kylorjohnson.substack.com/p/dont-optimize-the-model-before-you</link><guid isPermaLink="false">https://kylorjohnson.substack.com/p/dont-optimize-the-model-before-you</guid><dc:creator><![CDATA[Kylor Johnson]]></dc:creator><pubDate>Sat, 04 Apr 2026 13:44:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bP4r!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedab94ff-c7d2-4de0-9eb7-aca24eb84f12_400x80.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I made the same mistake twice this week. Different projects, different tools, completely different problems &#8212; same exact error.</p><p>I was optimizing before I knew what I was trying to produce.</p><p>The health score and the product were both &#8220;working.&#8221; Both generating output. Both doing the thing they were supposed to do on paper. And both were quietly failing in a way that only became obvious when I stopped and asked a question I should&#8217;ve asked at the start: <em>what does a good output actually look like here?</em></p><div><hr></div><h2>The Health Score Problem</h2><p>I built v1 of our client health scoring model to handle real complexity. Our clients span multiple product tiers &#8212; a client on the iPad app operates completely differently from one on the full platform. So I built separate logic by tier, different weights by client type, edge case handling for the ones that didn&#8217;t fit. The model got sophisticated. It also became impossible to reason about.</p><p>It wasn&#8217;t broken in a loud way. It was running, scoring clients, classifying them into quadrants. But when a score looked off, I couldn&#8217;t tell you why. Too many moving pieces, too many places the logic could have gone sideways. I spent real time trying to patch it. It didn&#8217;t work &#8212; because I&#8217;d never defined what a trustworthy output looked like before I built the thing.</p><p>Scrapped it. Opened a fresh Cursor session with zero reference to v1. The only constraint: if I can&#8217;t explain the scoring logic out loud in two minutes, it&#8217;s too complex.</p><p>V2 came out simpler. Two scores per client &#8212; Client Health and Growth Potential &#8212; combining into a four-quadrant classification. And one thing v1 never had: every output row tells you how much to trust it. Complete, Partial, or Blocked. V1 produced a spreadsheet full of numbers with no way to know which ones were solid and which ones were guesses. V2 tells you.</p><p>Before implementing, I opened a second Cursor window with a different model and had it critique the framework the first session built. Not &#8220;find bugs&#8221; &#8212; critique the <em>design</em>. Does the logic hold for a new client with three months of history? What happens to a client with strong product usage but no support interactions? The two agents went back and forth until the decisions weren&#8217;t things I&#8217;d assumed &#8212; they were things that had survived pressure.</p><p>Implementation on a clean spec surfaced data problems, not design problems. We found one source was missing half the activity for iPad-heavy clients &#8212; engagement looked low, but they were fine. Found another query silently dropping clients with zero activity instead of scoring them as zeros. Zero and missing are different business states. Neither would&#8217;ve surfaced in v1 because v1 was too complex to know what to look for.</p><p>63 clients scored. 54 complete, 9 partial. Baseline is live.</p><div><hr></div><h2>The Product Had the Same Problem</h2><p>Pipeline to Paycheck has paying subscribers now. Real people, real money. That milestone has made the late-night cold outreach &#8212; back to my AE roots &#8212; paired with the actual product work feel pretty dope. But it almost didn&#8217;t happen.</p><p>For weeks I&#8217;d been running conversion tests. Better copy. Cleaner paywall. Stronger CTA. Flat results.</p><p>Then someone told me they wouldn&#8217;t spend a single dollar on something that looked like a one-shot vibe coded prompt.</p><p>I know what vibe coding is &#8212; I&#8217;d used the term myself. What I hadn&#8217;t connected was that my own product looked exactly like one. Without significant UI/UX work on top of the AI-generated foundation, a vibe coded app looks precisely like what it is. That wasn&#8217;t a conversion problem. That was a credibility problem. Completely different lever.</p><p>I couldn&#8217;t see it myself. I&#8217;d built the thing, looked at every screen dozens of times. So I built a workaround.</p><p>I opened the Claude Extension and prompted it as a principal product designer at a $10B SaaS company &#8212; 15 years shipping enterprise software, Salesforce Lightning, QuickBooks Online, HubSpot&#8217;s CRM redesign. Never heard of vibe coding. Only knows what separates a $5K landing page from a $100K enterprise product. Full audit framework: visual hierarchy, enterprise credibility signals, functional UI gaps. Rate the product 1&#8211;10 on &#8220;does this look like enterprise software&#8221; &#8212; not &#8220;is this good for a side project.&#8221;</p><p>6.2 out of 10. Fifteen specific callouts.</p><p>The summary: <em>&#8220;This product is currently in the uncanny valley between &#8216;impressive side project&#8217; and &#8216;production SaaS.&#8217; The issues are almost entirely execution-level.&#8221;</em></p><p>No founder name anywhere &#8212; anonymous products don&#8217;t get paid. Every dollar amount displayed in the same color as every button, so nothing meant anything visually. Four different button styles across six tabs. A massive dead zone on the landing page. A paywall that blurred the take-home number before users had seen enough to want it.</p><p>None of that would have come from a conversion A/B test. I was optimizing the wrong layer entirely.</p><p>The workflow from there: take the audit output, paste it into Claude, have Claude write the Claude Code prompts to ship each fix. Re-run the audit with the same prompt and persona. See what moved. Repeat.</p><p>6.2 &#8594; 7.8 after credibility fixes &#8212; my name in the footer, real testimonials from Reddit, a full demo scenario visible before the paywall.</p><p>7.8 &#8594; 8.1 after design fixes.</p><p>8.1 &#8594; 8.8 after a complete color system redesign: teal for actions, green for money, purple for Pro upgrades, no exceptions.</p><p>Final re-audit: <em>&#8220;Color semantics now match QuickBooks-level clarity.&#8221;</em></p><p>I&#8217;m a sales guy... I know pipeline stages, comp plans, and what makes a VP of Sales pay attention. I do not know what makes a UI look enterprise-grade versus amateur. The Claude Extension prompted with the right persona does. That&#8217;s the unlock: you don&#8217;t need to know what you don&#8217;t know if you can hire the knowledge through a prompt.</p><div><hr></div><p><strong>Define the output. Stress-test the framework. Then build.</strong></p><div><hr></div><p><em>Ship Log &#8212; what I&#8217;m building, what broke, and what I learned. New post every week.</em></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[I Built Three Things This Week. One of Them Has Zero Users]]></title><description><![CDATA[A production sales tool. An executive presentation pipeline. And a side project I still haven't shown to a single person.]]></description><link>https://kylorjohnson.substack.com/p/i-built-three-things-this-week-one</link><guid isPermaLink="false">https://kylorjohnson.substack.com/p/i-built-three-things-this-week-one</guid><dc:creator><![CDATA[Kylor Johnson]]></dc:creator><pubDate>Sat, 07 Mar 2026 01:39:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bP4r!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedab94ff-c7d2-4de0-9eb7-aca24eb84f12_400x80.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Dates:</strong> February 27 &#8211; March 6, 2026<br><strong>Projects:</strong> Prospect Questionnaire, EBR Pipeline, Pipeline to Paycheck<br><strong>Side project:</strong> <a href="https://www.pipelinetopaycheck.com/">pipelinetopaycheck.com</a><br><strong>Side project users:</strong> 0</p><div><hr></div><h2>Three Builds, One Week</h2><p>This was one of those weeks where everything moved at once. By Friday I&#8217;d shipped a production sales tool, overhauled an executive presentation pipeline with direct CEO feedback, and upgraded a side project from vibe-coded prototype to real product on a real domain.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://kylorjohnson.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Ship Log! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Two of those are in the hands of real humans right now. One of them has zero users.</p><p>All three taught me something different about the same problem: the gap between building something and getting it in front of the people who need it.</p><div><hr></div><h2>Build #1: An Internal Scoping Questionnaire</h2><p>The ask was simple: take a prospect data-collection questionnaire and make it live so the sales team could send prospects a link.</p><p>The vision was zero friction. No login. No email gate. No &#8220;create an account to continue.&#8221; The company name gets passed as a URL parameter, so the prospect lands directly on question one. Auto-save so they can close the tab and come back a week later. Submissions pipe into Google Sheets. Per-prospect Google Drive folders for file sharing. An admin page so the sales team can generate unique links without asking me.</p><p>The architecture was clean on paper: Netlify for static hosting, Google Apps Script as the serverless webhook. Free on both sides. Total infrastructure cost: $0/month.</p><p>The HTML was done in an hour. Then reality hit.</p><p>Files got swapped during the Netlify upload &#8212; both URLs served the admin page instead of the questionnaire. Google Sheets headers pasted as one long string in a single cell. Fetch POST requests to Google Apps Script got silently blocked by CORS. Switching to hidden iframe form submissions fixed the save, but loading saved drafts via GET was also CORS-blocked. JSONP via script tags should have worked but Google&#8217;s redirect chain broke the callback. The per-prospect Drive folder feature required navigating iframe sandbox restrictions, authorization scopes, and the realization that HtmlService responses can&#8217;t call <code>window.parent</code> across origins.</p><p>Nine versions of the Apps Script. An entire afternoon of debugging.</p><p>But the system works. Sales generates a link, prospects fill out the questionnaire at their own pace, submissions land in Google Sheets, and folders get created for file sharing. Real prospects are using it right now. The gap between &#8220;it works in the editor&#8221; and &#8220;it works in production&#8221; was brutal &#8212; but nobody on the sales team cares about my CORS war stories. They care that the link works. And it does.</p><div><hr></div><h2>Build #2: My Executive Biz Review Growth Metrics Were Meaningless</h2><p>The second build was an EBR pipeline, a system that generates polished executive business review presentations from raw CSV data. Not one-off decks that take eight hours to assemble. A repeatable pipeline that works for any client account.</p><p>We&#8217;d been experimenting with four different presentation templates, each built by a different prompt in Cursor, each tested against the same multi-entity account, a furniture brand running four divisions on one platform. A Discovery-Led version for new relationships. An Intelligence-Led version heavy on rep data. A Benchmark-Forward version with heatmaps and comparative analytics. A Hybrid that told a narrative.</p><p>Each one got something genuinely right. The Discovery version knew how to build rapport. The Intelligence version understood the data. The Benchmark version had the strongest analytical components. The Hybrid had the best story arc. Four templates weren&#8217;t four options, they were four experiments that each solved one part of the problem. Consolidation wasn&#8217;t about picking a winner. It was about extracting the best organ from each body.</p><p>We produced two elite versions: an &#8220;Executive Review&#8221; for relationship-first conversations with senior leadership, and an &#8220;Intelligence Deep-Dive&#8221; for operational audiences who want data density.</p><p>Then we showed them to the CEO. His feedback wasn&#8217;t cosmetic. It was structural.</p><p>First thing he flagged: a &#8220;+93% month-over-month growth&#8221; stat on one of the slides. In the furniture industry, the entire year revolves around trade show cycles. High Point Market in spring and fall, Atlanta Market in January, Las Vegas Market in summer. Presenting month-over-month growth to a furniture executive coming back from market is like telling a retailer their December sales are &#8220;surging.&#8221; The number is technically real. The framing broadcasts that you don&#8217;t understand the world they live in.</p><p>He wanted trailing twelve-month context framed against the furniture market calendar. He wanted the breadth metric, a single number that meant nothing to anyone outside our team, decomposed into six activity ladder levels so you could see what reps actually <em>do</em> inside the platform, not just a score. He wanted cohort analysis showing the gap between top and bottom performers with specific suggestions for closing it. Table of contents on everything. Deprecated product references killed everywhere.</p><p>Every piece of feedback came down to one principle: <strong>the data has to live inside the customer&#8217;s mental model, not yours.</strong></p><p>The pipeline architecture leveled up too. One mega-prompt trying to read eight CSV files and generate a 17-slide deck was asking for subtle hallucinations in the numbers. The answer: three prompts in sequence. A Brief Generator that processes raw CSVs into validated intermediate documents, then two separate EBR prompts that consume those briefs. The briefs are the validation checkpoint &#8212; a human reviews them before anything downstream inherits the numbers. That checkpoint is where you catch the lie before it gets presented to the room.</p><p>The system isn&#8217;t done. The next step is a behavioral fingerprint query, figuring out what top-performing reps actually do inside the platform so the Activity Ladder mapping is built from real data instead of assumptions. But the architecture is set, the templates are consolidated, and the CEO&#8217;s feedback is making every output sharper. That feedback loop is the whole game.</p><div><hr></div><h2>Build #3: The Side Project With Zero Users</h2><p>And then there&#8217;s Pipeline to Paycheck.</p><p>Here&#8217;s what exists: a SaaS tool that tells sales reps what their pipeline deals are actually worth after federal tax, state tax, FICA, 401k, and insurance deductions. Production-grade tax engine validated against real paystubs. Goal tracking with image uploads &#8212; attach a photo of the actual Zillow listing you&#8217;re saving for. Monthly forecast charts. A YNAB-inspired &#8220;every dollar has a job&#8221; allocation system. Three persona flows. A live Stripe button at $29.</p><p>It started on a <code>pipeline-to-paycheck.vercel.app</code> URL with full vibe-coded energy. Functional, fast, clearly built in a weekend. Which is fine when you&#8217;re prototyping. It&#8217;s a problem when you&#8217;re asking someone to trust your tool with their compensation data.</p><p>Peer feedback cracked it open. Friends and colleagues weren&#8217;t reacting to the features, they were reacting to the <em>feel</em>. The app worked, but it didn&#8217;t feel like something worth paying for. So I used the Claude browser extension and Cursor to rebuild the experience from the outside in. Bought <a href="https://www.pipelinetopaycheck.com/">pipelinetopaycheck.com</a>. Overhauled the landing page. Tightened the UI. Made the whole thing feel like a product someone built on purpose, not something someone stayed up too late making.</p><p>Same tax engine underneath. Same calculations. Completely different first impression.</p><p>Here&#8217;s what still doesn&#8217;t exist: a single user who isn&#8217;t me.</p><div><hr></div><h2>The Pattern I Can&#8217;t Ignore</h2><p>The prospect questionnaire has real users on day one because a team was waiting for it. The EBR pipeline gets sharper every cycle because the CEO is in the room breaking my assumptions. Both builds have feedback loops with real humans pushing on the output.</p><p>Pipeline to Paycheck has me. Staring at my own dashboard. Convincing myself the headers need to be sentence case before I can show anyone.</p><p>The contrast is hard to ignore. The work builds taught me what happens when real people push on your work: it gets better fast, in ways you wouldn&#8217;t have predicted. The side project is teaching me what happens when that loop doesn&#8217;t exist: you optimize for your own taste and call it progress.</p><div><hr></div><h2>The 2,000-Person Trap</h2><p>So how do I get Pipeline to Paycheck in front of real users?</p><p>Sitting in my contacts: 2,000 PE and VC professionals from previous roles. Warm-ish. Reachable in about fifteen minutes. The gravitational pull was enormous &#8212; one blast, 2,000 inboxes, done. I could call that a &#8220;launch.&#8221;</p><p>The product I built? A tool for BDRs and AEs. The tagline on the landing page is literally &#8220;Because your manager sure as hell won&#8217;t do this math for you.&#8221;</p><p>Two thousand investors. A product for individual sales reps.</p><p>I was about to measure whether my old contacts were polite enough to subscribe to a Substack and call it product validation.</p><p>The instinct makes sense on the surface. You have contacts. Contacts equal distribution. Distribution equals traction. But the logic breaks at step one: the contacts have to actually want the thing. A PE associate isn&#8217;t wondering what a $50K deal puts in their bank account after taxes. They might subscribe out of curiosity or professional politeness, but that tells me nothing about whether sales reps &#8212; the people who&#8217;d actually use this daily &#8212; would pay $29 for it.</p><div><hr></div><h2>Two Tracks, Run in Parallel</h2><p>Once I mapped it honestly, the fix was obvious. I was trying to serve two completely different audiences through one channel because it felt efficient. It wasn&#8217;t.</p><p><strong>Track 1: Ship Log (Substack) &#8594; Operator/founder audience.</strong> Building-in-public content about shipping products with AI, architecture decisions, the unglamorous reality of building on the side while doing real work during the day. These people care about the <em>building</em> story &#8212; the EBR system, the questionnaire, the side project, all of it. If the Substack resonates, it becomes a genuine operator following that doubles as a fundraising network later.</p><p><strong>Track 2: Pipeline to Paycheck &#8594; Direct to reps.</strong> Completely separate channel, completely separate tactics, completely separate success metrics. No email blasts. No hoping investors forward it to portfolio companies. Direct-to-practitioner distribution through LinkedIn creator seeding &#8212; finding mid-tier creators (5,000-30,000 followers) whose audiences are full of the AEs and BDRs who&#8217;d actually use this tool.</p><p>The two tracks reinforce each other &#8212; Ship Log features Pipeline to Paycheck as a project, creating a natural bridge &#8212; but neither depends on the other.</p><div><hr></div><h2>The Honest Part</h2><p>I have a day job. A real one. This week alone I deployed a production sales tool from scratch and helped architect an EBR system that the CEO is personally shaping. The work is substantive and I&#8217;m invested in it. The side project doesn&#8217;t get nights-and-weekends energy if the day work suffers.</p><p>But that&#8217;s also the excuse that lets you keep building instead of distributing. &#8220;I&#8217;ll do outreach when things slow down at work&#8221; is the solo founder&#8217;s version of &#8220;I&#8217;ll start the diet on Monday.&#8221; Things don&#8217;t slow down. You either carve out the time or you have a really nice app with a really nice domain that nobody visits.</p><p>The building phase is over. The product works. The domain is bought. The Stripe button is live. I went from vibe-coded prototype to something I&#8217;d actually show a stranger. Every additional hour spent polishing is an hour not spent finding out whether anyone cares.</p><p>The 2,000 contacts aren&#8217;t going anywhere &#8212; and they become dramatically more valuable later, when I can email &#8220;50 active users, 5 paying customers, here&#8217;s what I&#8217;ve learned&#8221; instead of &#8220;subscribe to my new thing.&#8221;</p><p>This week, I send the first DMs. I find the first creators. I put the URL in front of people who actually calculate commissions for a living and see what happens.</p><p>Two of this week&#8217;s builds already have feedback loops. The third one is about to get one.</p><div><hr></div><p><em>Three builds. One week. Two in production with real users. One with zero. That&#8217;s the one that matters most right now &#8212; because it&#8217;s the one that still needs to prove it should exist.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://kylorjohnson.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Ship Log! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[I Use a Code Editor to Run GTM. Here’s How.]]></title><description><![CDATA[Ship Log #1:]]></description><link>https://kylorjohnson.substack.com/p/i-use-a-code-editor-to-run-gtm-heres</link><guid isPermaLink="false">https://kylorjohnson.substack.com/p/i-use-a-code-editor-to-run-gtm-heres</guid><dc:creator><![CDATA[Kylor Johnson]]></dc:creator><pubDate>Sat, 28 Feb 2026 04:30:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dm6v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every GTM team has the same problem: data lives in a dozen places and nobody has a unified view. You either spend days stitching it together manually, pay a consultant, or just wing it.</p><p>I built a system that hits 9 different tools in a single pass &#8212; CRM, billing, product usage, call recordings, support tickets &#8212; and gives me a finished deliverable in about 30 seconds. QBR packages, onboarding assessments, meeting prep, support analysis, weekly pipeline reports.</p><p>The tool at the center of it? A code editor.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://kylorjohnson.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Ship Log! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Cursor is a code editor. That&#8217;s what it&#8217;s built for. Developers use it to write and review code with AI baked in.</p><p>I&#8217;m not a developer. I&#8217;m a salesperson at heart.</p><p>And Cursor has become the single most important tool in my stack; not because I&#8217;m writing code, but because it&#8217;s the only place where all my systems can talk to each other at the same time.</p><h2>The Setup</h2><p>Cursor sits in the middle, connected to everything through MCP (Model Context Protocol): BigQuery for quantitative data, HubSpot for CRM, Mixpanel for product behavioral signals, Fathom for call recordings, Help Scout for support patterns, Jira for project tracking, Notion for docs and wiki, our Admin Console for order and revenue data, and GitHub for codebase context. The whole thing runs in the cloud through Windmill so it&#8217;s not just living on my laptop.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dm6v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dm6v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dm6v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dm6v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dm6v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dm6v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119538,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://kylorjohnson.substack.com/i/189429331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!dm6v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dm6v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dm6v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dm6v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ed64989-a675-4397-9874-2604b99f9b52_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That&#8217;s 9 systems, one connection layer, running in the cloud. Every GTM team has some version of this problem &#8212; data lives in a dozen places and nobody has a unified view. The normal answer is dashboards, or a BI tool, or hiring a RevOps person to spend a week stitching it together manually. Or paying a consultant.</p><p><strong>I just ask Cursor.</strong></p><h2>What This Actually Looks Like Day to Day</h2><blockquote><p><em>&#8220;Build me a QBR package for XYZ account.&#8221;</em></p></blockquote><p>One prompt. It pulls org data, queries BigQuery for product usage, grabs revenue from the Admin Console, runs benchmarks. Output is a three-part executive package &#8212; sales effectiveness, instance health, rep performance &#8212; plus a composite health score. It flagged that 80% of the account&#8217;s customers were inactive, representing an $8.2M expansion opportunity. Data pull to finished deliverable. One session. Not days of spreadsheet assembly.</p><div><hr></div><blockquote><p><em>&#8220;Run a stage-gated assessment on these 6 onboarding clients.&#8221;</em></p></blockquote><p>It queries four systems simultaneously &#8212; production database for products and orders, BigQuery for iPad activity, Fathom for recent call recordings, Help Scout for support tickets. Comes back with per-client readiness scores. One client scored 91% ready. Another scored 27% &#8212; 99 days of no contact, 346 days of stale data. Effectively abandoned and nobody knew.</p><p>But the best part: it caught a contradiction. One client showed &#8220;inactive&#8221; in the database but had 5 Fathom calls and 10 support tickets in the last two weeks. Clearly active &#8212; the database was just wrong. That cross-system validation is something no single dashboard gives you.</p><div><hr></div><blockquote><p><em>&#8220;Prep me for my meeting with Clarence &#8212; they have two entities.&#8221;</em></p></blockquote><p>It pulled billing from Stripe, rep-level usage from Mixpanel, support history from Help Scout, order data from the Admin Console. Found that one rep accounted for 70% of all orders across 3 devices. Found that the second entity was processing $13.59M in order revenue but had no Sales Portal subscription &#8212; a $395/mo upsell just sitting there. I walked into that meeting with a user-concentration risk to discuss and a concrete expansion play with dollar amounts attached.</p><div><hr></div><blockquote><p><em>&#8220;Analyze our L1 support tickets from the last 180 days.&#8221;</em></p></blockquote><p>349 tickets categorized and broken down. User management was 35% of volume. Password resets alone were 37 tickets &#8212; 11 of those were voicemails from people who literally couldn&#8217;t log in. It calculated that self-service password reset plus a few targeted help articles could eliminate 83 tickets, a 24% reduction. That became the business case for building self-service features. Not a hunch. A number.</p><div><hr></div><blockquote><p><em>&#8220;Generate my Sales Week-Ahead report.&#8221;</em></p></blockquote><p>HubSpot for pipeline, Fathom for the last 30 days of calls. Output: $X total pipeline, stalled deals flagged, and for each upcoming discovery call a full SPICED framework prep with must-ask questions. From the call transcripts it pulled voice-of-customer themes&#8230; &#8220;manual data entry&#8221; mentioned 12 times, &#8220;spreadsheets&#8221; mentioned 11 times, competitor mentions ranked. Even gave me a coaching note. That runs in about 30 seconds.</p><h2>Why This Matters</h2><p>None of these are things you couldn&#8217;t do before. You could absolutely build a QBR package, or analyze support tickets, or prep for a meeting. It just took days. Or you&#8217;d pay someone to do it.</p><p>The shift isn&#8217;t capability. It&#8217;s speed and cross-system visibility. Every one of those examples hit 3-4 different data sources in a single pass. The insights that actually mattered &#8212; the abandoned client, the database contradiction, the upsell opportunity, the user concentration risk &#8212; all came from combining data across systems. They don&#8217;t exist in any one tool.</p><p>A dashboard shows you what you asked it to show you. This shows you what you didn&#8217;t think to ask.</p><h2>The Thing Nobody Tells You Though</h2><p>It&#8217;s not magic. Getting all these systems connected took real work. And I&#8217;ve learned the hard way that the session that built something is the worst place to debug it &#8212; the model carries your assumptions with it. So I build in one session, then hand it to a fresh one to pressure-test. Fresh context catches what inherited context can&#8217;t.</p><p>But once the pipes are connected? The question stops being &#8220;can we get this data?&#8221; and starts being &#8220;what do we want to know?&#8221; That&#8217;s a fundamentally different way to run GTM.</p><p><strong>Three weeks of consultant work. Thirty minutes.</strong></p><div><hr></div><p><em>This is Ship Log &#8212; what I&#8217;m building, what broke, and what I learned. New post every week.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://kylorjohnson.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Ship Log! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>