<script data-pm-proxy="intercept"></script><?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[Drea Says Product Things]]></title><description><![CDATA[Occasional rants about product things. Let's demystify things together!]]></description><link>https://dreasays.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png</url><title>Drea Says Product Things</title><link>https://dreasays.substack.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 02 Sep 2026 17:57:52 GMT</lastBuildDate><atom:link href="/__u/dreasays.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[andrea saez]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[dreasays@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[dreasays@substack.com]]></itunes:email><itunes:name><![CDATA[andrea saez]]></itunes:name></itunes:owner><itunes:author><![CDATA[andrea saez]]></itunes:author><googleplay:owner><![CDATA[dreasays@substack.com]]></googleplay:owner><googleplay:email><![CDATA[dreasays@substack.com]]></googleplay:email><googleplay:author><![CDATA[andrea saez]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How to structure an AI GTM team in 2027]]></title><description><![CDATA[Your old marketing team structure is trash.]]></description><link>https://dreasays.substack.com/p/how-to-structure-an-ai-gtm-team-in</link><guid isPermaLink="false">https://dreasays.substack.com/p/how-to-structure-an-ai-gtm-team-in</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Thu, 20 Aug 2026 08:27:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!k7vv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve built GTM teams from scratch more than once, and the same shape keeps showing up. The org chart everyone inherited needs to be flipped upside down because of what AI can do now.</p><p>GTM Organisation is impactful to the cost and way a business is run. There&#8217;s no room to get it wrong. GTM teams are leaning harder into the strategic layer of the org and pulling back on execution headcount. </p><p>The data backs it up. <a href="https://www.gartner.com/en/newsroom/press-releases/2026-05-11-gartner-2026-cmo-spend-survey-finds-cmos-allocate-15-point-3-percent-of-marketing-budgets-to-ai-but-only-30-percent-are-ready-to-scale-ai-capabilities">Gartner's 2026 CMO Spend Survey</a> found CMOs now put 15.3% of marketing budget toward AI, but only 30% report their organisation is mature enough to scale it, and 70% admit their internal processes aren't ready.</p><p>Ewan McIntyre, VP Analyst at Gartner Marketing, named the gap directly: </p><blockquote><p>"The risk is that CMOs invest in AI tools faster than they build the data foundations, processes, governance and talent required to scale them." </p></blockquote><p>Budget is funding both tools and headcount, what it hasn't answered is which layer of the team gets that investment. <a href="https://www.marketscale.com/industries/marketing-tech/gartners-2026-cmo-research-agenda-puts-agentic-ai-and-brand-value-at-the-center-of-marketing-leadership">Gartner's 2026 CMO research agenda</a> clearly explains the agentic AI challenge facing marketing leaders "is not a technology decision, it is an org-design decision."</p><h2>TL;DR</h2><ul><li><p>AI has compressed execution work and made strategic work more valuable.</p></li><li><p>The 2027 GTM team is an inverted pyramid: market research, positioning, message, and UVP form the most important and most senior base.</p></li><li><p>Demand gen&#8217;s job hasn&#8217;t changed, create interest, but AEO now sits inside that job.</p></li><li><p>PMM operational drives value consistently and coherently.</p></li><li><p>Copywriting junior headcount is falling while senior and AI-native roles grow 18-24% year over year.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dreasays.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">Drea Says Product Things is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p><h2>Which marketing roles did AI disrupt?</h2><p>Picture the traditional B2B marketing org chart as a pyramid. A narrow tip of strategists and product marketers set positioning, and a wide base of writers, designers, and campaign executors underneath produced the actual output.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lEQK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lEQK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:227925,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/211439159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!lEQK!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce9498b-d2d3-4251-8017-0ec96b5f7ad7_1920x1080.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 aria-hidden="true" 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><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>It made sense when output was the bottleneck. </p><p>For a while, the craze was more, more more! </p><p>More blog posts, more ad variants, more nurture emails meant more pipeline, so organisations hired for volume, and the base of the pyramid grew accordingly. </p><p>Product marketing leadership itself was often missing from that org chart entirely (which, conveniently, is the exact job I&#8217;ve built a career on, so make of that what you will). &#129335;&#127995;&#8205;&#9792;&#65039;</p><h3>Many B2Bs failed to see the importance and impact a real market strategist brings to the table, right up until the moment AI made output cheap and positioning the only thing left worth fighting over.</h3><p>AI has already disrupted execution roles like copywriting, SEO, paid media, and lead generation, while leaving strategic roles like positioning, brand management, and market research largely untouched. </p><p><a href="https://www.ama.org/marketing-news/2026-career-report/">The American Marketing Association&#8217;s 2026 State of Marketing Careers Report</a>,  surveyed 1,412 marketing professionals and mapped roles against Stanford&#8217;s Human Agency Scale, a five-level framework from <a href="https://futureofwork.saltlab.stanford.edu/">Stanford&#8217;s SALT Lab</a> that measures how much human involvement a task still needs to hit real quality, rather than how much of it AI can technically attempt. </p><ul><li><p><strong>H1</strong>: No human involvement. The task is fully automated.</p></li><li><p><strong>H2</strong>: Minimal human participation. AI does nearly all of it.</p></li><li><p><strong>H3</strong>: An equal partnership between human and AI.</p></li><li><p><strong>H4</strong>: Substantial human control, with AI assisting.</p></li><li><p><strong>H5</strong>: Human involvement essential. AI can&#8217;t carry the task&#8217;s quality alone.</p></li></ul><p>Copywriting, SEO, paid media, performance analytics, lead generation, and market research all land in the most-disrupted band (H1-H2). AI can do most of it now, just not always well; ask anyone who&#8217;s had to wade through AI slop. </p><p>Marketing strategy, brand management, creativity, critical thinking, and leadership land in the least-disrupted band (H4-H5).</p><p><strong>This leads to the new AI GTM organisation:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!k7vv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!k7vv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:315154,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/211439159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!k7vv!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e516ab8-af3d-4b62-9419-9ea3696748af_1920x1080.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 aria-hidden="true" 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><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></p><ul><li><p><strong>PMM Leadership</strong> (the base): market research, position, message, UVP</p></li><li><p><strong>Demand Gen</strong>: the ability to interest a buyer</p></li><li><p><strong>PMM Operational</strong>: the ability to convert that interest</p></li><li><p><strong>Copywriter</strong> (the tip): gaps and consistency</p><p></p></li></ul><h2>The rise of product marketing leadership</h2><p>Market research, positioning, taxonomy, messaging, and UVP sit at the foundation because they&#8217;re the layer an AI model can&#8217;t originate on its own. This is quite literally the context layer your AI GTM setup needs to work.</p><p>LLMs are good at summarisation. They&#8217;re good at pattern-matching against everything already written about your category. </p><h3>What LLMs can&#8217;t do is empathise, read nuance in a room, develop taste, and learn from past experiences. That&#8217;s exactly the expertise senior PMM leadership brings. </h3><p>If you get positioning wrong and AI mass-produces the mistake at the speed of... well, AI, you end up with the foundational aspects of product marketing that will only help you fail faster.</p><p>Your 2027 headcount plan has to put more senior weight into this layer than it did in 2025, or you&#8217;re setting yourself up for failure.</p><h2>Demand gen&#8217;s job hasn&#8217;t changed</h2><p>Demand gen still exists to create interest. But what has changed is the role of AI in all of this. LLMs now sit between the campaign and a growing share of the audience, answering category questions before anyone lands on a page. That&#8217;s exactly what AEO/GEO exists to solve.</p><p><a href="https://www.digitalapplied.com/blog/ai-marketing-statistics-2026-adoption-data-points">HubSpot&#8217;s 2026 AI Trends survey</a> found adoption highest in North America (91%) and still climbing globally, with practitioners recovering an average of 6.1 hours a week once AI takes the repetitive work off their plate. </p><h3>While impressive, none of it works without the layer underneath it. Every campaign, ad variant, and nurture email demand gen produces has to trace back to the positioning and messaging the foundation already locked in.</h3><h2>PMM operational drives value</h2><p>This layer creates value-based content to push the product and enable internal and external audiences with sales enablement, objection handling, battle cards, and impactful, value-based, behavioural-driven messaging.</p><p>This layer benefits from AI the same way demand gen does, but still needs a human owner. While PMMs still suffer from the unfortunate PR that they&#8217;re there to make decks prettier, critical thinking is required to decide which objections are actually costing deals each month.</p><h2>Copywriting shrinks on purpose</h2><p>The copywriter&#8217;s job has moved from producing at volume to catching gaps and focusing on consistency. AI drafts fast and gets most of it technically right, but again, someone has to catch what&#8217;s off-brand, off-story, or just plain ass sloppy.</p><p><a href="https://www.digitalapplied.com/blog/ai-marketing-statistics-2026-adoption-data-points">Gartner&#8217;s CMO Spend Survey</a> data shows this compression happening in real time:</p><ul><li><p>Junior copywriting headcount: 23% of agencies cut in 2025, 31% planning further cuts in 2026</p></li><li><p>Senior content strategist roles: up 18% year over year</p></li><li><p>Marketing data analyst roles: up 21% year over year</p></li><li><p>AI-native marketing engineer roles, a job title that barely existed two years ago: up 24% year over year</p></li></ul><h2>What this means for your 2027 hiring plan</h2><p>If you&#8217;re building or rebuilding a GTM team for 2027, the pyramid gives you a test to run against every open role: does this hire add capacity to the foundation (research, positioning, message, UVP), or does it add capacity to execution? </p><p>This doesn&#8217;t mean cutting your way to a smaller team and replacing it with AI everything, for the love of all that is good, that is <strong>not</strong> what I mean. Move the investment instead. Hire more seniors capable of doing positioning and research instead of production at scale, hire for judgment, and let AI take on the targeted, manual work underneath that judgment.</p><p>If you&#8217;d like a good read, check out <a href="https://www.heinzmarketing.com/blog/ai-enhanced-marketing-org-chart/">Heinz Marketing&#8217;s</a> breakdown on how they achieved this at an enterprise scale.</p><p>And now, your usual bot-written bot bait.</p><h2>Frequently asked questions</h2><h3>What is an AI GTM team?</h3><p>An AI GTM team is a go-to-market organization structured around what AI can and can&#8217;t originate, not around output volume. The foundation (market research, positioning, messaging) stays human-led and gets more senior investment, while execution layers like copywriting shrink to a gap-filling and consistency-checking function, with AI handling first-draft production.</p><h3>How is AI changing marketing team structure in 2026 and 2027?</h3><p>AI is compressing execution roles and growing strategic and technical ones. Gartner&#8217;s CMO Spend Survey found 23% of agencies cut junior copywriting headcount in 2025 with 31% planning further cuts in 2026, while senior content strategist roles grew 18% year over year and AI-native marketing engineer roles grew 24%. The shift moves headcount from volume production toward research, positioning, and workflow oversight.</p><h3>Will AI replace copywriters?</h3><p>AI is replacing the volume-production part of copywriting, not the role itself. The American Marketing Association&#8217;s 2026 State of Marketing Careers Report places copywriting in the most AI-disrupted skill band, while creativity, critical thinking, and brand judgment sit in the least-disrupted band. The surviving copywriter role focuses on catching gaps and enforcing consistency across AI-generated output rather than producing first drafts.</p><h3>What should marketing leaders prioritize when restructuring for AI in 2027?</h3><p>Marketing leaders should prioritize the layer of the team AI can&#8217;t originate on its own: market research, positioning, message, and unique value proposition. Gartner frames this directly as an org-design decision rather than a tooling decision, meaning the priority is redesigning where senior judgment sits in the org chart before deciding which AI tools to buy.</p><h3>Why does positioning matter more, not less, in an AI-driven GTM team?</h3><p>Positioning matters more because AI scales whatever story it&#8217;s given, including a wrong one. Getting positioning right before applying AI to execution prevents errors from compounding across every downstream campaign and asset. Positioning now has to hold up in two contexts at once: a person reading it directly, and an AI system summarizing or citing it on the person&#8217;s behalf, which raises the bar for how precisely it&#8217;s written.</p><p>Building this out for your own team, or auditing whether your current structure still matches the funnel AI already broke? Get in touch and I&#8217;ll walk you through how I&#8217;d approach it.</p><div><hr></div><h2>Sources</h2><ul><li><p><a href="https://www.gartner.com/en/newsroom/press-releases/2026-05-11-gartner-2026-cmo-spend-survey-finds-cmos-allocate-15-point-3-percent-of-marketing-budgets-to-ai-but-only-30-percent-are-ready-to-scale-ai-capabilities">Gartner 2026 CMO Spend Survey</a></p></li><li><p><a href="https://www.marketscale.com/industries/marketing-tech/gartners-2026-cmo-research-agenda-puts-agentic-ai-and-brand-value-at-the-center-of-marketing-leadership">Gartner&#8217;s 2026 CMO research agenda (agentic AI as org-design decision)</a></p></li><li><p><a href="https://www.ama.org/marketing-news/2026-career-report/">AMA 2026 State of Marketing Careers Report</a></p></li><li><p><a href="https://www.digitalapplied.com/blog/ai-marketing-statistics-2026-adoption-data-points">HubSpot 2026 AI Trends survey data</a></p></li><li><p><a href="https://www.heinzmarketing.com/blog/ai-enhanced-marketing-org-chart/">Heinz Marketing: AI Agents in Your Marketing Org</a></p></li></ul><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dreasays.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dreasays.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Why all AI content sounds exactly the same (and how to fix it)]]></title><description><![CDATA[AI Slop has taken over. Learn why and how to make your prompts fight back.]]></description><link>https://dreasays.substack.com/p/why-all-ai-content-sounds-exactly</link><guid isPermaLink="false">https://dreasays.substack.com/p/why-all-ai-content-sounds-exactly</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 16 Aug 2026 10:02:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z1Jz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ever notice that AI copy has a smell? </p><p>It&#8217;s the distinct smell of confident bullsh*t.</p><p>All AI copy contains the same rhythm, structure, landing, and shitty dismount no matter who prompted it (I was once a gymnast, stay with me here.) AI slop is everywhere, and the reason is more than just lack of copywriting skills. </p><h2>TL;DR</h2><p>As <a href="/__u/dreasays.substack.com/p/putting-claudes-watermarking-to-the">previously explained</a>, LLMs don&#8217;t pick words freely. They sample from a probability distribution over what to say next, the first during pre-training, and the second during alignment training, which measurably narrows how many different ways the model is willing to answer the same question. </p><p>Nothing learns or explores at the moment you hit send, as every reply is one draw from an already fixed distribution. The one lever you actually hold is the prompt, because it reshapes which slice of that distribution gets sampled. If you provide enough specificity during prompt, the &#8216;sameness&#8217; behind the AI sloppy output gets diluted.</p><h2>How models sample words</h2><p>At each step of generating a response, LLMs produce a probability score for every possible word that follows based on everything written so far. That scoring happens through layers of attention (the transformer architecture), which weigh which earlier words matter most for predicting the next one, against a huge table of learned word representations (embeddings) built during training. Generation then draws one word from that scored list, more likely to land on high-probability words, with a setting called temperature controlling how much randomness enters the draw.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Z1Jz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 424w, /__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 848w, /__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Z1Jz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png" width="1456" height="867" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:867,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:266466,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/210899871?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 424w, /__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 848w, /__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Z1Jz!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61bd988-b175-4573-ab7e-f2b093f4df9e_3560x2120.png 1456w" sizes="100vw" fetchpriority="high"></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 aria-hidden="true" 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><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>Repeat that one word at a time until the response ends, and you've described the entire process. There&#8217;s no separate creativity step and no separate correctness step. There&#8217;s one distribution per word, and one sample from it.</p><h2>Training narrows that distribution before you type anything</h2><p>During pre-training, a model learns from a huge slice of existing text which continuations are most common, and &#8220;common&#8221; means <em>average</em>. It&#8217;s cross-pollinating patterns it has already seen, so the most probable next word is the most conventional one.</p><p>The second narrowing is sharper, and it happens in the stage that makes a model helpful and safe to ship, aka Reinforcement Learning from Human Feedback (RLHF). </p><p>A <a href="https://arxiv.org/abs/2310.06452">2024 study</a> from Kirk tested this, comparing supervised fine-tuning against full RLHF training across multiple models and tasks. RLHF generalized better to new situations, but it substantially reduced output diversity, a well-documented effect the field calls mode collapse. </p><p>In simple terms, the model converges toward a smaller set of safe, high-reward answers instead of exploring the many valid ones. </p><p>By the time produces a single word for you, the distribution behind your reply has already been compressed twice; once toward the statistically average continuation, and once toward whatever answer scores best with human raters.</p><h2>Nothing is learning while you type</h2><p>Understanding this informs what you should expect from a refined prompt. The model&#8217;s weights are frozen at inference. This means there&#8217;s no learning, no exploration, and no memory forming while it writes your response. Every reply is one sample from a distribution that was already fixed before your conversation started.</p><p>Scary, right?</p><p>That&#8217;s good news and bad news at once. (Sit tight!)</p><p><strong>The bad news</strong>: you can&#8217;t train the sameness out of a single session. </p><p><strong>The good news</strong>: the distribution is conditional on what you feed it, which means the input is the one part of this whole system still under your control.</p><p><strong>What you control</strong>: which distribution it samples from.</p><p>The prompt doesn&#8217;t change the model. It changes which part of the model&#8217;s existing distribution gets sampled. </p><p>If you ask an obvious question the most probable answer is the obvious one, because that&#8217;s the region of the distribution your prompt pointed at. Ask a sharper question, and the most probable answer moves with it.</p><p>A few prompts that reliably move it:</p><ul><li><p>What&#8217;s the contrarian take?</p></li><li><p>What would you say if the obvious angle were off the table?</p></li><li><p>Write this as if conventional wisdom is wrong.</p></li><li><p>What would make our audience stop and push back?</p></li><li><p>What would our competitor never say?</p></li></ul><p>These will change which slice of a fixed distribution you&#8217;re asking it to draw from, and that&#8217;s the whole difference between <em>generic</em> and <em>specific </em>outputs.</p><h2>How to fix the &#8220;sameness&#8221; problem</h2><p>Prompting alone gets you partway there because it reshapes the distribution for a single message at a time. If you want the model consistently producing your voice instead of the training-data average, give it something narrower to condition on every time.</p><h3>1. Build a small RAG system </h3><p>Feed a model like Claude a folder of your own published work and set it up to pull from that folder before it drafts anything new. </p><p><a href="https://github.com/andreasaez/how-to-claude">This isn&#8217;t complicated to build</a>. Set up a folder of past posts plus a simple retrieval step. It will replace sampling from everything the model has ever read with sampling from a distribution conditioned on specifically your sentences, your rhythm, and your word choices. That&#8217;s a much smaller, much more specific target than the training-data average it already contains, so the output drifts toward you instead of toward the internet&#8217;s midpoint (which at this point, is just AI training on slop.)</p><h3>2. Create your own copywriting skill</h3><p>Write the actual rules down; include banned phrases, sentence patterns you never use, structural requirements, etc. Then run a script that scans every draft for the patterns you&#8217;ve banned before you read it. Be specific about what you want, what is allowed and what is disallowed &#8212; LLMs require specificity above anything else. (Note: this emdash was specifically placed here by me.)</p><h3>3. Be specific, always</h3><p>A generic prompt has nowhere to go but a generic answer. </p><p>As I like to say: shit in, shit out.</p><p>A prompt loaded with a real number, an actual quote, or a specific outcome gives the model something too particular to round off to the average. This is the same principle behind the citability test good copywriters use.:</p><h3>Take any sentence and ask &#8220;could this be lifted out and used as a direct answer to a real question someone might ask?&#8221; If yes, it&#8217;s specific. If you&#8217;d need three more sentences of context before it means anything, it&#8217;s vague.</h3><p>Examples:</p><ul><li><p><em>&#8220;We help you streamline your workflow and save time.&#8221;</em> Pull this out on its own and it answers nothing. It could sit in literally any product&#8217;s copy unchanged.</p></li><li><p><em>&#8220;Cuts weekly reporting from 4 hours to 15 minutes.&#8221;</em> It directly answers <em>&#8220;how much time does this save,&#8221;</em> with a real number attached.</p></li></ul><h3>4. Give it a fixed point of view</h3><p>If you prompt an LLM to <em>&#8220;write about X&#8221;</em>, it will sample from the average opinion on topic X.</p><p>If you&#8217;re more specific with your angle, eg <em>&#8220;Write this from the position that most advice on X is backwards, and defend that&#8221;</em>, it will sample from a much narrower, much more specific region. A persona or stance does the same job a RAG system does for voice and it shrinks the target.</p><p>None of this fixes the first narrowing baked in during training, that requires access to the weight and scoring system themselves. The second narrowing that comes from generic prompting is entirely within your control.</p><p>And now, the obligatory FAQ section to get this picked up by AI. </p><p>Hi bots &#128075; &#128536;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dreasays.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dreasays.substack.com/subscribe"><span>Subscribe now</span></a></p><h2>Frequently asked questions</h2><h3>Why does AI-generated copy from different tools all sound the same?</h3><p>Large language models are almost all trained the same two-stage way: broad pretraining on existing text, followed by RLHF or a comparable alignment step that measurably narrows how many valid answers a model will give to the same prompt. Different products built on that same underlying training produce copy that converges toward the same safe, average register, no matter what interface sits on top of it.</p><h3>Does a better prompt actually change how the model generates text?</h3><p>Yes, but not by changing the model. A prompt reshapes which part of the model&#8217;s existing probability distribution gets sampled for that response. A specific, unusual, or contrarian prompt points the sampling process at a narrower, less average slice of what the model knows, which is why sharper prompts produce less generic output without any retraining involved.</p><h3>What is mode collapse in AI-generated text?</h3><p>Mode collapse is the measurable drop in output diversity that happens during RLHF and similar alignment training, documented in a 2024 study by Kirk et al. comparing supervised fine-tuning to full RLHF. Instead of exploring the many valid ways to answer a question, an RLHF-trained model converges toward a smaller set of answers that score well with human raters, which directly contributes to AI writing sounding repetitive across unrelated prompts.</p><h3>Can retrieval-augmented generation (RAG) fix AI writing sounding generic?</h3><p>It helps significantly, because it conditions the model&#8217;s output on a specific, narrow source, your own past writing, instead of letting it default to the broad average of its training data. Feeding a model a folder of your own work before it drafts anything shifts the distribution it&#8217;s sampling from toward your actual voice, a more durable fix than prompting alone since it doesn&#8217;t need to be re-specified in every conversation.</p><h3>Is there a way to permanently stop a model from producing generic copy?</h3><p>Not from the training side, since that narrowing happens before the model ships and isn&#8217;t something a user can undo. From the user side, the durable fix is combining specific, non-generic prompts with a persistent style reference, whether that&#8217;s a RAG system built on your own writing or a written set of rules checked against every draft, so the model always has something narrower than the training-data average to condition on.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dreasays.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">Drea Says Product Things is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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[Putting Claude’s watermarking to the test]]></title><description><![CDATA[Anthropic has just started marking Claude&#8217;s output.]]></description><link>https://dreasays.substack.com/p/putting-claudes-watermarking-to-the</link><guid isPermaLink="false">https://dreasays.substack.com/p/putting-claudes-watermarking-to-the</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Tue, 11 Aug 2026 10:03:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://support.claude.com/en/articles/16266773-how-claude-marks-ai-generated-content">Anthropic</a> has just started marking Claude&#8217;s output and has signed the EU AI Act&#8217;s Article 50(2) Code of Practice on Transparency of AI-Generated Content, confirming it started embedding machine-readable watermarks in text from new Claude models on August 2, 2026.</p><p>That announcement is a good excuse to actually explain how this category of technology works, because most people assume watermarking means hidden code slipped into the content, a few invisible characters or sneaky whitespace tucked in like a barcode. </p><p>It doesn&#8217;t work that way. </p><p>The watermark is the content, it&#8217;s the actual words the model chose. Once you see how that works, you start noticing where the whole system gets shakier than it sounds.</p><p>Anthropic hasn&#8217;t published the exact mechanism behind Claude&#8217;s watermark, so it is unclear how this will affect output.</p><p>What follows is grounded in Google&#8217;s SynthID, the clearest publicly documented example of this category of technology, and the open C2PA standard, which is the closest public reference point we have for what Claude&#8217;s system likely resembles.</p><h2><span>TL;DR</span></h2><ul><li><p><span>AI watermarking doesn&#8217;t hide anything inside the text. It shapes which words a model picks at each step, using a secret key that turns &#8220;random&#8221; token selection into a specific, checkable pattern. </span></p></li><li><p><span>Google&#8217;s SynthID does this with a keyed hash function, and it&#8217;s resilient enough to survive editing, cropping, and partial rewrites. </span></p></li><li><p><span>Anthropic confirmed that Claude now does something in the same category, embedding watermarks in text and C2PA-compliant metadata in files to comply with the EU AI Act, though it hasn&#8217;t disclosed the exact mechanism. </span></p></li><li><p><span>The open standard C2PA tackles a related but different problem: content provenance rather than token-level fingerprinting. </span></p></li><li><p><span>All of these approaches have real limits, and the gap between &#8220;this can be detected&#8221; and &#8220;this will always be detected&#8221; is bigger than most explainers let on.</span></p></li></ul><h2><span>What is watermarking?</span></h2><p>Every few weeks someone asks if AI companies are hiding invisible Unicode characters or zero-width spaces in generated text, a kind of digital secret handshake you could strip out with a find-and-replace. That approach exists in some contexts, and it&#8217;s trivially defeated. Copy the text into a plain text editor, and the &#8220;watermark&#8221; is gone.</p><p>That&#8217;s not what the serious players are doing.</p><p>Google built <a href="https://deepmind.google/models/synthid/">SynthID</a> for this. OpenAI has adopted it too, for the images and audio it generates, though not yet confirmed for text. There&#8217;s also a separate open industry standard called <a href="https://c2pa.org/">C2PA</a> (Coalition for Content Provenance and Authenticity) that tackles adjacent territory.</p><p>Anthropic has confirmed that Claude now marks its output too, using a text watermark for generated text and C2PA-compliant metadata for generated files, as part of signing the EU AI Act&#8217;s Article 50(2) Code of Practice, effective August 2, 2026.</p><p>The company hasn&#8217;t published how its text watermark actually works at the technical level, so what it shares with SynthID under the hood is unconfirmed. None of it depends on hidden characters, because hidden characters don&#8217;t survive the first paraphrase, screenshot, or platform that strips formatting.</p><h2><span>How context-hash watermarking works</span></h2><p><span>The actual mechanism is easiest to see through Gemini and SynthID, the clearest public example available. A language model doesn&#8217;t pick one exact next word. At every step, it scores a set of plausible candidates and normally samples from among the strongest ones, with some randomness controlled by &#8220;temperature.&#8221;</span></p><p><span>SynthID changes how that sampling happens. At each generation step, the model provider holds a secret 256-bit key. That key gets combined with the preceding tokens and run through a hash function, and the hash output deterministically splits the vocabulary into a &#8220;green&#8221; list and a &#8220;red&#8221; list.</span></p><p><span>Instead of sampling freely across all its top candidates, the model gets nudged toward whichever of those candidates fall on the green list. Do this at every step, across a long enough passage, and the text ends up containing more green-list tokens than chance alone would ever produce, a pattern invisible to a reader but recoverable by anyone holding the same key.</span></p><p><span>To anyone without the key, this looks exactly like ordinary random sampling, because the green and red lists reshuffle unpredictably at every step and there&#8217;s no way to tell which candidates were &#8220;nudged&#8221; without the key doing the sorting.</span></p><p><span>Functionally, it is random. The watermark doesn&#8217;t cost you output quality, because the model is still choosing from its top candidates either way. It&#8217;s just letting a secret key decide which of those top candidates gets the edge, instead of a dice roll.</span></p><h2><span>A worked example</span></h2><p><span>The following is a simplified version:</span></p><p>Say a model is completing &#8220;I love cake. My favorite dessert is ___&#8221; and the top candidates are chocolate, Black Forest, and cheesecake. Normally the model samples one based on temperature.</p><p>With SynthID, the provider holds a secret key and combines it with context, say the preceding few words, plus each candidate itself. It scores chocolate against key + &#8220;favorite dessert is&#8221; + &#8220;chocolate&#8221;, scores Black Forest the same way, and so on, then picks whichever candidate scores highest. Say it lands on chocolate, still one of the model&#8217;s own natural picks, just the one the key favored this round.</p><p>The process repeats for the next token: the next candidate set, maybe pie, ice cream, or smoothie, gets scored against the key and the updated context, and the highest scorer wins again.</p><p>Run that across a piece of text, and you get a specific, repeatable pattern, one that&#8217;s invisible to a reader but checkable by anyone holding the key. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_H5p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 424w, /__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 848w, /__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_H5p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png" width="1456" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:270,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94721,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/210727006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 424w, /__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 848w, /__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_H5p!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e02280-955c-4600-aa52-cacc13a473f3_2654x492.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><span>Detection is a one-sample statistical test: if a fraction &#947; of the vocabulary is green at each step, an un-watermarked passage should land roughly &#947; of its words in the green list by chance. A watermarked passage lands far more. The gap measured in standard deviations is the z-score.</span></p><h2><span>Why the statistics make this hard to fake</span></h2><p>This is where the resilience claim actually earns its keep. Detection doesn&#8217;t need an exact match, just a consistent lean toward the green set more often than chance predicts. If roughly a quarter of candidates are green at each step (the fraction is usually called &#947;), an un-watermarked passage should land around a quarter of its words in the green set. </p><p>A watermarked passage lands well above that, and the gap, measured in standard deviations as a z-score, is what gets checked. Over a few hundred tokens, a real watermark typically pushes that z-score into the high single digits, strong evidence by normal statistical standards, without needing every single token to cooperate.</p><p>That statistical margin is also part of why the watermark holds up under some editing. Chop the text up, reorder sections, paraphrase a few sentences, and the untouched portions still carry their own share of signal, so the overall score drops but doesn&#8217;t necessarily disappear. It has real limits, though. Heavy editing, translation, or paraphrasing the whole piece can weaken or remove the signal entirely, which is the caveat Anthropic itself has attached to Claude&#8217;s watermark.</p><h2><span>Where the assumptions start to wobble</span></h2><p>This is the part most explainers skip, and it&#8217;s worth sitting with before you treat watermarking as a solved problem.</p><p>The math above assumes real candidate diversity at each token. Plenty of text doesn&#8217;t have that. Whether it is a block of code, a list of factual dates, or a name spelled one specific way, there&#8217;s often only one correct next token, or close to it. No meaningful candidate pool means no meaningful watermark signal, regardless of how good the scoring function is. Low-entropy content (like short Linkedin posts) is watermark-resistant almost by accident.</p><p>The confidence numbers above also assume a long enough sample. Short outputs, a tweet, a headline, a two-sentence reply, simply don&#8217;t give the statistics room to work. You need volume for the pattern to become improbable-by-chance rather than merely unusual.</p><p>Cross-model laundering is the other gap.</p><p>SynthID can tell you whether text came from a Gemini-family model with a specific key. It can&#8217;t tell you whether a different provider&#8217;s model produced the underlying draft, and heavy multi-pass rewriting (draft in one model, polish in a second, translate and translate back) degrades any single model&#8217;s fingerprint layer by layer. </p><p>C2PA takes a different angle here by attaching verifiable provenance metadata to media as it&#8217;s created and edited, closer to a chain of custody than a statistical fingerprint.</p><p>That makes it useful for images and video in a way token-level watermarking isn&#8217;t, but it depends on every tool in the chain actually participating, which is a coordination problem.</p><p>Detection access itself is asymmetric. You need the secret key, or access to whoever holds it, to run the check with any confidence. Third-party &#8220;AI detector&#8221; tools that claim to spot watermarked text without that access are mostly pattern-matching on style, not reading a cryptographic signal, and their false-positive rates reflect exactly that.</p><p>Watermarketing isn&#8217;t theater; the cryptographic core is genuinely sound, and it holds up reasonably well against everyday editing. But &#8220;sound in principle&#8221; and &#8220;reliable in every real-world case&#8221; are different claims, and the gap between them is where most of the actual policy and product decisions live.</p><h2><span>What this means if you&#8217;re building with AI </span></h2><p><span>If your workflow depends on watermark detection catching AI-generated text reliably, plan around the edge cases above rather than the headline claim. Long-form content is where this works best. Short copy or technical content with few valid token choices, and anything passed through multiple models or heavy paraphrasing is where confidence drops fast, sometimes to nothing.</span></p><h2><span>Can the Claude watermark be identified?</span></h2><p><span>Anthropic hasn&#8217;t published the exact scheme (token-bias key, hash function, sampling details, etc), so there is no way of currently building a viable detector. Unless there is a verification key, no one outside Anthropic would be able to realistically do this.</span></p><p><span>I decided to put some of this to the test by building an artifact walking through how these schemes generally work statistically (n-gram*/token frequency-bias detection, z-score tests over a suspected watermark distribution), so you understand what signal a real detector would be looking for. </span></p><p><span>*n-gram = a sequence of x adjacent elements from a string of text</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!n-m8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 424w, /__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 848w, /__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 1272w, /__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!n-m8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png" width="1456" height="993" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:993,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:259165,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/210727006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 424w, /__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 848w, /__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 1272w, /__u/substackcdn.com/image/fetch/$s_!n-m8!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43766bc2-9ff7-467e-bc53-a85874695866_1786x1218.png 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 aria-hidden="true" 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><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>There&#8217;s no real detection happening since it isn&#8217;t Anthropic&#8217;s key, so it shouldn&#8217;t find anything in any text. Running my own unedited sentences through it a few times still produced a stray high-ish z-score here and there, not because it detected anything, but because z-scores on short passages are noisy by nature.</p><p>I decided to then run the entire blog post past it, and got an even more interesting result: every other word was marked as red. This is because the detector isn&#8217;t actually scoring several thousand independent words, it&#8217;s scoring a much smaller set of repeated word pairs. </p><p>Ordinary English leans hard on a small rotating cast of function words, &#8220;the,&#8221; &#8220;a,&#8221; &#8220;of,&#8221; &#8220;in,&#8221; &#8220;is,&#8221; &#8220;and,&#8221; and they show up every couple of words in any grammatical sentence. </p><p>Whichever way this key happens to hash those specific pairs gets replayed on roughly the same rhythm the words themselves fall into. It&#8217;s the same non-independence problem from the earlier test, just more visible at length as a handful of fixed, deterministic coin flips dressed up as a large sample.</p><h3>Wait, what does that mean?</h3><p>Calm down, let&#8217;s keep in mind this isn&#8217;t a real codebreaker tool of any sort. </p><p>But a statistically sound detection method can still produce a confident-looking, false signal on ordinary text if it isn&#8217;t built to account for how repetitive real language is. That&#8217;s not a flaw, and it&#8217;s a documented failure mode in the actual research this whole category of watermarking comes from.</p><p>Kirchenbauer et al., the team behind &#8220;<a href="https://proceedings.mlr.press/v202/kirchenbauer23a/kirchenbauer23a.pdf">A Watermark for Large Language Models</a>&#8221; (ICML 2023), introduced the green-list scheme this post has been describing throughout. Buried in their own discussion of the detection statistic is the same problem this post&#8217;s tool just hit: a repeated bigram like &#8220;Barack Obama&#8221; gets one fixed green or red verdict the moment it&#8217;s first hashed, and every later repetition of that exact pair just cashes in on the same verdict again. Their own worst-case scenario, stated plainly in the paper, is ordinary human-written text with enough repetition of a phrase like that racking up a falsely high green-token count and getting flagged as machine-generated, nothing watermarked about it at all. </p><p>The same team followed up the next year with &#8220;<a href="https://arxiv.org/abs/2306.04634">On the Reliability of Watermarks for Large Language Models&#8221; (ICLR 2024)</a>, and that one&#8217;s the actual experiment. They took watermarked text and ran it through human rewriting, LLM paraphrasing, and mixing it into longer hand-written documents, then measured how detection held up. Two things came out of it that pull in opposite directions. </p><h3>The good news for watermarking is the signal survived better than you&#8217;d expect, staying detectable after roughly 800 tokens on average even under strong human paraphrasing, using a threshold most fields would call very strong evidence. </h3><p>The catch sitting right next to it as paraphrased or mixed-in text statistically tends to leak n-grams from the original passage, and that leakage can produce high-confidence detections in places that shouldn&#8217;t register anything at all. (Which is why the Bible often gets flagged as being written by AI.)</p><h2><span>What&#8217;s unknown about Anthropic&#8217;s real scheme</span></h2><p><span>Public reporting confirms the watermark exists, applies globally to Claude&#8217;s outputs as of August 2, 2026, and is intended to be imperceptible to readers. Anthropic hasn&#8217;t published the specifics that would let a third party build a real detector:</span></p><ul><li><p><span>The hash function and how much preceding context it uses per token.</span></p></li><li><p><span>The green-list fraction (&#947;) and how strongly sampling is biased toward it.</span></p></li><li><p><span>The secret key or key-rotation policy.</span></p></li><li><p><span>Whether a public verification endpoint exists at all, reporting doesn&#8217;t mention one for text (unlike C2PA on images, which is an open, independently verifiable standard by design).</span></p></li></ul><p><span>That last distinction matters, given the image-side provenance (signed C2PA metadata on .svg/.png/.jpg) is a published, interoperable standard you genuinely can check today with independent tools. The text watermark is not architected that way in what&#8217;s public so far.</span></p><h2><span>So now what?</span></h2><p><span>A few options do exist:</span></p><ol><li><p><strong><span>C2PA content credentials on images</span></strong><span>: real and checkable now, using independent verifier tools, since it&#8217;s an open standard rather than a proprietary statistical signal.</span></p></li><li><p><strong><span>General AI-text stylometric detectors</span></strong><span> (perplexity/burstiness tools in the GPTZero family) : These don&#8217;t read any watermark at all; </span><mark data-color="#ffff00" style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);"><span>they guess from writing style</span></mark><span>. Coverage of Anthropic&#8217;s rollout explicitly flags their unreliability, and independent research has shown they misfire on both human and AI text often enough that a &#8220;detected&#8221; or &#8220;clean&#8221; result from one isn&#8217;t good evidence on its own, eg light editing, translation, or short passages degrade them further.</span></p></li><li><p><strong><span>A dedicated Anthropic verification tool for text</span></strong><span>: Not confirmed as publicly available as of this writing (Aug 2026) in any of the coverage checked below. If one ships, it would be the only way to reliably check the real watermark, since it&#8217;s the only party holding the key. I personally wouldn&#8217;t put it past them to monetize this, but who knows, really. </span></p></li></ol><h2><span>Frequently asked questions</span></h2><h3>Is AI watermarking the same as hidden text or invisible characters?</h3><p>No. Some early or low-effort watermarking schemes used invisible Unicode characters or whitespace patterns, and those are trivially removed by copying text into a plain editor. Serious watermarking like Google&#8217;s SynthID works differently: it shapes the actual word choices the model makes using a cryptographic key, so there&#8217;s nothing to strip out because the &#8220;watermark&#8221; is the content itself.</p><h3>How does SynthID watermark AI-generated text?</h3><p>SynthID uses a secret key combined with the surrounding context to score each plausible next word, then leans toward whichever ones score highest instead of leaving the choice to random sampling. To anyone without the key, the output looks like normal text, and quality holds up well because the model is still choosing among candidates it already found plausible.</p><h3>Can you remove an AI watermark by editing or paraphrasing the text?</h3><p>Partial editing usually isn&#8217;t enough. The watermark&#8217;s statistical signal is spread across the individual token choices throughout the text, so cutting, reordering, or paraphrasing some sections still leaves a detectable pattern in what remains. Getting the signal below a detectable threshold generally takes rewriting most of the piece, translating it, or otherwise touching a large share of the actual word choices, not just light copyediting.</p><h3>Does AI watermarking work on short text or code?</h3><p>Not reliably. The statistical confidence behind watermark detection depends on having enough tokens with real candidate diversity to build a pattern from. Short outputs don&#8217;t provide enough volume, and shorter content often has only one plausible next token at each step, leaving little room for a watermark signal to exist in the first place.</p><h3>What&#8217;s the difference between SynthID and C2PA?</h3><p>SynthID is a token-level cryptographic fingerprint built into how a model generates text or media. C2PA (Coalition for Content Provenance and Authenticity) is an open industry standard focused on attaching verifiable provenance metadata to content as it&#8217;s created and edited, more like a chain of custody than a statistical signal. They solve related but different problems, and a piece of content could use one, both, or neither depending on the tools involved in producing it.</p><h3>Does Claude watermark its output?</h3><p>Yes. Anthropic has confirmed that Claude embeds machine-readable watermarks in generated text and C2PA-compliant provenance metadata in generated files, starting with models launched from August 2, 2026 onward, applied globally rather than only in the EU. The move complies with Article 50 of the EU AI Act. Anthropic hasn&#8217;t disclosed the specific technical mechanism behind the text watermark, and has said the watermark can be weakened or removed by heavy editing, translation, or very short passages.</p><h3>Can third-party AI detector tools reliably spot watermarked content?</h3><p>Generally no, unless they have access to the specific model provider&#8217;s secret key. Most consumer-facing &#8220;AI detector&#8221; tools are pattern-matching on writing style rather than checking a cryptographic signal, which is why their false-positive and false-negative rates are considerably higher than the underlying watermarking technology itself would suggest.</p><h3>Can you break the Claude content watermark?</h3><p>In principle, given enough determination: heavy editing, translation, or full paraphrasing can weaken or remove the signal, per Anthropic&#8217;s own caveat above. In practice, nobody outside Anthropic can verify whether a given piece of text is watermarked in the first place, since nobody outside Anthropic holds the key. That also means there&#8217;s no way to confirm removal worked, since there&#8217;s no way to confirm detection would have worked either.</p>]]></content:encoded></item><item><title><![CDATA[How LLMs actually work (and why that changes how you prompt them)]]></title><description><![CDATA[Hello from the newsletter that gets to your inbox when I actually have something useful to say &#128075;]]></description><link>https://dreasays.substack.com/p/how-llms-actually-work-and-why-that</link><guid isPermaLink="false">https://dreasays.substack.com/p/how-llms-actually-work-and-why-that</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 02 Aug 2026 10:10:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!o3ox!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello from the newsletter that gets to your inbox when I actually have something useful to say &#128075;</p><p>I&#8217;ve been posting bits and pieces about this on <a href="http://www.linkedin.com/in/andreasaez">LinkedIn</a> for a few weeks now, and enough of you asked me to put it all in one place so here we are. As part of the ongoing series on what&#8217;s actually happening under the hood when we use AI tools, I&#8217;ll be breaking down some of the mechanics minus the &#8220;AI will replace your job&#8221; panic. </p><p>Let&#8217;s start with the thing that is super obvious and you need to know why it&#8217;s important: by default, an LLM doesn&#8217;t pause to think before it answers you. It starts talking immediately, and figures out what it&#8217;s saying as it goes.</p><p><strong>Models write answers one word at a time </strong></p><p>Picture someone answering a hard question out loud, live, with no time to prepare and no chance to go back and revise. That&#8217;s roughly what a model does by default. It writes its response one word at a time, and each word it commits to becomes the thing the next word has to follow from. There&#8217;s no rough draft sitting behind the scenes; the first version is the only version, unless you ask for something different.</p><p>This explains something that trips a lot of people up: why a strategic question gets you an answer that sounds confident but turns out to be nonsense. The model isn&#8217;t being &#8220;lazy&#8221; despite what it might seem like, it&#8217;s doing what it always does when nothing tells it otherwise, which is reach for the most common, most expected version of that answer. Ask a generic question, get a generic answer. Shit in, shit out.</p><p>The same thing happens when you try to describe your brand voice instead of showing it. If you tell the model your tone is "direct but slightly irreverent," it will produce copy that technically fits that description while sounding like nothing you'd actually write. The model is interpreting your description, not calibrating against real examples of your writing. Description and demonstration are not the same input, and they don't produce the same output.</p><p>But what about thinking mode?<br>That&#8217;s not really a draft, but it is close to what we would consider a type of process.</p><p>Once you understand that the model is committing to its answer as it goes rather than planning it out first, two techniques become obvious fixes.</p><h3><strong>Make it think out loud: chain of thought</strong></h3><p>Because the model generates one token at a time, each step it writes becomes part of the context for the next step. Chain of thought prompting takes advantage of that directly: you ask the model to reason through the problem step by step before it gives you the final answer.</p><p>This matters because the final answer is now built on the model&#8217;s own intermediate reasoning instead of a single jump straight to a plausible-sounding conclusion. For anything with real stakes, like positioning, prioritizing your ICP, or picking apart a competitor&#8217;s move, this is the difference between an answer that &#8220;sounds right&#8221; and one that&#8217;s actually been reasoned through.</p><h3><strong>Show it, don&#8217;t tell it: few-shot prompting</strong></h3><p>The second fix is few-shot prompting, and it solves the brand voice problem directly. Instead of describing what good looks like, you show the model examples of it. Give it three pieces of your best copy, and it reverse-engineers the pattern from those examples rather than guessing from your description of them. Three real examples will always tell the model more about your tone than two paragraphs explaining that tone ever could.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!o3ox!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 424w, /__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 848w, /__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 1272w, /__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!o3ox!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png" width="1456" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:942831,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/209477473?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 424w, /__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 848w, /__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 1272w, /__u/substackcdn.com/image/fetch/$s_!o3ox!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce3a58-f0d9-4e50-ad7a-c090b9323fc6_1624x890.png 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 aria-hidden="true" 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><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><h3><strong>Specificity is important</strong></h3><p>Both of these techniques point at the same underlying problem: the model has nothing to go on except what you give it. Five-word prompts get five-word thinking. If your outputs keep landing generic or slightly off, that&#8217;s almost always where the problem starts, not in the model&#8217;s capability.</p><p>The structure I use for this is <strong>Context, Instructions, Task</strong>. </p><p><strong>Context</strong> is the permanent layer: who you are, what you&#8217;re working on, what good already looks like for you. </p><p><strong>Instructions</strong> are the specifics people tend to skip because they assume the model will just figure it out (it won&#8217;t): tone, format, length, what to avoid. </p><p><strong>Task</strong> is the actual ask, and &#8220;write me a post&#8221; isn&#8217;t a task. &#8220;Write a 200-word post with a hook that stops someone mid-scroll, direct tone, no bullet points&#8221; is a task. The more specific you are, the less the model has to guess, and the less you have to fix afterward.</p><p>None of this requires a technical background. It just requires remembering what&#8217;s actually happening on the other side of the prompt box: a system committing to each word as it goes, working entirely from whatever you handed it before it started. Give it more to work with, and the output gets dramatically better. Give it a vague description and hope, and you get the average of the internet back.</p><p>Ughhh, but must I repeat myself every single time?<br>No, I&#8217;ll touch on that in the next part of this series - stay tuned!</p><div><hr></div><h3>If you&#8217;re as tired of AI Slop as I am&#8230;.</h3><p>I decided to try a new little side gig called <a href="http://www.fixyourslop.ai">FixYourSlop.AI</a></p><p>I can help you:</p><ul><li><p><span>Make your copy sound human</span></p></li><li><p><span>Give you proper differentiation </span></p></li><li><p><span>Make everything AEO referenced <br></span></p></li></ul><p><span>Just your friendly neighbourhood Spider-woman coming to the rescue &#128735; <br><br>There may also be a Konami code.<br>You know, for fun.<br><br>&#11014;&#65039;&#11014;&#65039;&#11015;&#65039;&#11015;&#65039;&#11013;&#65039;&#10145;&#65039;&#11013;&#65039;&#10145;&#65039;&#127345;&#65039;&#127344;&#65039;&lt;enter&gt;</span></p><div><hr></div><p>Until next time!</p><p></p>]]></content:encoded></item><item><title><![CDATA[Why your Claude setup sucks and how to fix it]]></title><description><![CDATA[There&#8217;s really just one difference between Claude pro users and Claude noob users, and it comes down to the setup.]]></description><link>https://dreasays.substack.com/p/why-your-claude-setup-sucks-and-how</link><guid isPermaLink="false">https://dreasays.substack.com/p/why-your-claude-setup-sucks-and-how</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Tue, 26 May 2026 07:16:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s really just one difference between Claude pro users and Claude noob users, and it comes down to the setup.</p><p>Most people building Claude skills spend their time perfecting the prompt, eg tweaking the structure, iterating on the output format, testing edge cases, etc. The skill gets better, yet the output stays mediocre. I&#8217;ve watched this happen across teams and it&#8217;s one of those problems that looks like a craft problem until you realise it&#8217;s an architecture problem.</p><p>The reason is simple: every prompt forces the skill to start from zero. That means it&#8217;s got no memory of your audience, no knowledge of your positioning, no understanding of how you or your team actually work. Claude is smart, but it can only work with what you give it in the moment, and &#8220;in the moment&#8221; is almost never enough.</p><p>This is a silo problem. Every skill knows its own world, with no cross-interaction and no shared foundation. It produces really recognisable failures: copy that writes <em>about</em> your audience instead of <em>for</em> them, positioning that sounds like every other B2B company in your space, content that&#8217;s technically on-brand but has none of the texture that makes your real stuff land, and half-baked PRDs that don&#8217;t quite hit the mark. </p><p>Three things that specifically break without a shared context layer:</p><p><strong>Context amnesia.</strong> Every new session, you&#8217;re re-explaining the same things. Your ICP, your voice, your market position. The quality of output ends up depending entirely on how much the user remembers to include on any given day, which is wildly inconsistent.</p><p><strong>Config drift.</strong> Hardcoded values go stale. Names change, frameworks update, team structures shift. At one skill, it&#8217;s manageable. At twenty skills across three teams, it becomes a maintenance job nobody signed up for. (I&#8217;m calling it now: AI Ops is coming as a job title, and this is why.)</p><p><strong>No learning loop.</strong> When a session goes well, or when Claude makes a mistake that reveals a real gap in a skill, that insight evaporates at the end of the session. There&#8217;s no mechanism to capture it, no way for it to improve the next run, no compounding. Every session is equally good, which means every session is equally mediocre.</p><p>The fix is a three-layer architecture. A shared knowledge base that lives in your Claude Project (positioning, ICP, brand guidelines, etc) that every skill checks before asking the user for anything. A personal MEMORY.md file per user that Claude writes to over time, building a picture of how that person works, their preferences, their decisions. Add an improvement loop that silently logs patterns and gaps across sessions so the humans managing the system have real material to work with.</p><p>The whole setup takes an afternoon. Each user onboards in about two minutes. And the compounding effect over six months is genuinely significant (richer shared context, smarter personal memory, better-calibrated skills) compared to a team that spent the same time maintaining isolated skills with hardcoded values.</p><p>I wrote up the full architecture, including exactly how to set it up step by step, over here: <a href="https://dreasaez.medium.com/your-ai-skills-are-silos-heres-how-to-fix-that-bdb04a507785">Your AI skills are silos. Here&#8217;s how to fix that.</a></p><p>If you&#8217;re building with Claude at your company and want to think through how this applies to your specific setup, just reply. The patterns are transferable to any team, any workflow, and any industry.</p><p>Andrea</p>]]></content:encoded></item><item><title><![CDATA[Forma now works for CS and vibe coders too]]></title><description><![CDATA[Expanding the Forma skillset in Claude]]></description><link>https://dreasays.substack.com/p/forma-now-works-for-cs-and-vibe-coders</link><guid isPermaLink="false">https://dreasays.substack.com/p/forma-now-works-for-cs-and-vibe-coders</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Wed, 13 May 2026 08:14:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Forma started as a tool for PMs and PMMs. The problems it solves, turning scattered context into structured, usable intelligence, show up in every role that has to make something clear and act on it fast... so naturally, I decided to expand the scope.</p><p><strong>Forma PM is still the core</strong></p><p>The full GTM workflow: positioning, ICP, messaging, feature comms, launch planning is available on <a href="https://dreasaez.gumroad.com/l/enwoc">Gumroad</a> as a set of MD files you upload to a Claude project and use immediately. A PDF version is included if that format works better for your setup.</p><p><strong>Forma CS scores your accounts before renewal pressure arrives</strong></p><p>The CS bundle is free. It gives customer success teams an account intelligence layer: scoring accounts as hot, warm, or cold based on product signals, surfacing expansion and upsell conversations at the right moment, and generating conversation cards so those calls land on something specific. The skill file packages it for immediate use.</p><p><strong>Forma Dev fixes the SEO gap in React apps</strong></p><p>Also free. If you&#8217;ve built with Lovable, Vite, or Create React App, crawlers see an empty shell where your product should be. Forma Dev diagnoses the gap and walks through the fix. It started as a Substack post and is now a skill file anyone can use.</p><p><strong>Forma Copy writes in your own style</strong></p><p>Forma Copy is a writing workflow built around voice capture first, structure second. Paste two or three pieces of your existing writing, define the argument you want to make, and Claude writes in your voice with a structure that leads with the point.</p><p>And my favourite one thus far&#8230;.</p><p><strong>Forma Roadmap structures your backlog into a roadmap</strong></p><p>Forma Roadmap takes your backlog and turns it into a Now/Next/Later outcome-based structure with a narrative brief and presentation ready for leadership. Forma Roadmap pulls positioning and ICP context from Forma PM, so the story you tell your exec team connects directly to the story you tell your market.</p><p>Both Roadmap and PM are available on Gumroad (I worked really hard on them!) - while the rest remain free. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.getforma.co&quot;,&quot;text&quot;:&quot;Get all skills&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.getforma.co"><span>Get all skills</span></a></p><p>Hope you make the best out of them!<br><br>Andrea</p>]]></content:encoded></item><item><title><![CDATA[Claude put me out of business]]></title><description><![CDATA[Hey all,]]></description><link>https://dreasays.substack.com/p/claude-put-me-out-of-business</link><guid isPermaLink="false">https://dreasays.substack.com/p/claude-put-me-out-of-business</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Wed, 18 Mar 2026 09:20:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey all,</p><p>Forma is shutting down. </p><p>Well, sort of.</p><p>I built Forma PM because narrative fragmentation is one of the most underestimated revenue problems in product. PMs and PMMs working in silos, launches that lose momentum before they start, strategies that make sense internally but land flat externally. I have lived that problem firsthand, written about it, and watched it cost teams real money and real time.</p><p>Forma was an AI-powered platform with seven connected tools: ICP builder, positioning canvas, messaging framework, launch brief, feature comms, and a validation engine that pressure-tested narratives before they shipped. The thing I was most proud of was the central intelligence layer. Context from one tool flowed into all the others, so your positioning shaped your messaging, your messaging anchored your launch, and everything stayed connected. That was the real product, not the individual tools, but the thread running through them.</p><p>It worked. People used it, got value from it, and told me it changed how they thought about their product story.</p><h3>But&#8230;. here&#8217;s the harsh truth:</h3><p>Building and maintaining an AI-powered SaaS product as a solo founder is expensive, and the AI market has created a pricing dynamic that is genuinely difficult for indie builders. People expect significant value at near-zero cost, and the infrastructure required to deliver that value reliably does not cost near zero. That gap does not close through optimism or better positioning. It closes through scale I did not have, or a different delivery model entirely.</p><p>So I made a product decision and moved Forma into Claude.</p><p>Everything Forma was built to do, the frameworks, the methodology, the connected thinking, is now available directly as a set of Claude skills + project. Same rigour, lower friction, no subscription required. It reaches more people now than it did as a standalone product, which tells me something about where AI-native tools are headed and what builders are actually willing to pay for.</p><p>Building Forma taught me things about architecture, pricing, and the gap between a correct insight and a viable business that I could not have learned any other way. The problem it was trying to solve has not gone away. If anything, the fragmentation between product and marketing teams is getting worse as AI accelerates shipping while slowing down the thinking.</p><p>I will keep writing about that here.</p><p><strong>If you want to use Forma, it is at <a href="http://www.getforma.co">getforma.co</a>.</strong></p><p>Thank you for being here while I figured this out!</p><p>Andrea</p>]]></content:encoded></item><item><title><![CDATA[The Lovable + SEO Problem]]></title><description><![CDATA[Things you should know if you're considering building]]></description><link>https://dreasays.substack.com/p/the-lovable-seo-problem</link><guid isPermaLink="false">https://dreasays.substack.com/p/the-lovable-seo-problem</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Fri, 13 Feb 2026 09:36:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve built your site with Lovable, there&#8217;s a very good chance that every page you&#8217;ve carefully crafted is serving search engines an empty shell &#8212; a blank <code>&lt;div id="root"&gt;&lt;/div&gt;</code> with zero content. Your headings, your calls to action, your internal links, your meta descriptions&#8230; none of it exists as far as Google is concerned.</p><p>I found this out the hard way while building <a href="http://www.getforma.co">Forma PM</a>. On the surface, everything looked great. Lovable even confirmed constantly that my SEO score was over 90%. But after seeing constant complaints from other on Reddit, I decided to run crawl test and saw what Googlebot was actually receiving an empty HTML page with a JavaScript bundle.</p><h2>Here&#8217;s what&#8217;s happening, why Lovable builds it this way, and exactly how to fix it.</h2><p>Lovable uses React with Vite to build single-page applications. That means every page on your site works the same way: the server sends a minimal HTML file (basically an empty container), then JavaScript runs in the browser to render all the actual content.</p><p>For humans, this works perfectly. Your browser executes the JavaScript, the page appears, and you never notice the difference.</p><p>For search engine bots, it&#8217;s a disaster. Most crawlers do a simple HTTP request and read the HTML they get back. They don&#8217;t reliably execute JavaScript. So what they see is this:</p><pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;&lt;title&gt;My Site&lt;/title&gt;&lt;/head&gt;
  &lt;body&gt;
    &lt;div id="root"&gt;&lt;/div&gt;
    &lt;script src="/__u/dreasays.substack.com/assets/index-abc123.js"&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p>This means there&#8217;s literally no content at all. Google has nothing to index, so your pages either don&#8217;t appear in search results or rank terribly because there&#8217;s no content signal.</p><h2>But wait&#8230; there&#8217;s more!</h2><p>It gets worse. Even if Google could somehow render your JavaScript, there&#8217;s another issue lurking in Lovable projects: invisible navigation links.</p><p>Lovable&#8217;s AI tends to build buttons and CTAs using React&#8217;s programmatic navigation pattern:</p><pre><code>&lt;Button onClick={() =&gt; navigate('/pricing')}&gt;See Pricing&lt;/Button&gt;</code></pre><p>This renders as a <code>&lt;button&gt;</code> element in the HTML &#8212; not an <code>&lt;a&gt;</code> tag. Search engine crawlers discover new pages by following links, and they can only follow real <code>&lt;a href="/__u/dreasays.substack.com/..."&gt;</code> anchor tags. A button with an <code>onClick</code> handler is completely invisible to them.</p><p>When I audited my site, I found <strong>20 instances across 11 public-facing files</strong> where Lovable had used this pattern instead of proper links. That included the main CTA on my homepage, every product page link on the &#8220;How it works&#8221; page, and every &#8220;Start free trial&#8221; button across all use case pages. My entire internal link structure was invisible to crawlers.</p><h2>Understanding Lovable&#8217;s contraints</h2><p>Before I get to the fix, you need to understand the constraints. Lovable controls the hosting and build pipeline. That means you cannot:</p><ul><li><p>Add custom build scripts (like <code>react-snap</code> or <code>prerender-spa-plugin</code>) to generate static HTML at build time</p></li><li><p>Modify the web server to add middleware that detects bot user agents</p></li><li><p>Intercept incoming requests to serve different content to crawlers vs. humans</p></li><li><p>Switch to a server-side rendering framework like Next.js</p></li></ul><p>Traditional prerendering approaches are off the table, so you&#8217;re left having to work within Lovable's architecture.</p><h2>How to fix the Lovable SEO issue</h2><p>After several rounds of iteration, here&#8217;s the approach that works within Lovable&#8217;s constraints. I&#8217;ve included the master prompt below, but first, here&#8217;s what each piece does and why it matters.</p><h3>1. Fix every Navigate Call (Immediate SEO Impact)</h3><p>The single highest-impact change is converting every <code>onClick={() =&gt; navigate(...)}</code> on public pages to a proper <code>&lt;Link&gt;</code> component. In React Router, <code>&lt;Link to="/pricing"&gt;</code> renders as a real <code>&lt;a href="/__u/dreasays.substack.com/pricing"&gt;</code> in the DOM &#8212; crawlable by bots and still handles client-side navigation for users.</p><p>This doesn&#8217;t require any infrastructure, it&#8217;s a find-and-replace across your components, and it immediately makes your internal link structure visible to crawlers.</p><h3>2. Build a centralized Route Registry</h3><p>Create a single file that lists every public, indexable route on your site with its path, title, meta description, last modified date, and sitemap metadata. This becomes the single source of truth for your sitemap, your SEO debug tools, and your prerender cache.</p><h3>3. Generate a Dynamic Sitemap</h3><p>Build a Supabase edge function that reads your route registry and generates a proper XML sitemap with <code>&lt;lastmod&gt;</code> dates. Point your <code>robots.txt</code> to it. This tells Google exactly which pages exist and when they were last updated.</p><h3>4. Add a Noscript Fallback</h3><p>Add a <code>&lt;noscript&gt;</code> block to your <code>index.html</code> with your site name, a brief description, and links to your key pages. This gives crawlers that don&#8217;t execute JavaScript at least some content and links to follow. It&#8217;s not a substitute for proper prerendering, but it&#8217;s a meaningful safety net.</p><h3>5. Build a prerender cache and SEO Debug Dashboard</h3><p>Create an edge function that can scan any page on your site, extract SEO elements (title, meta description, H1, H2s, internal links), and cache the results. Then build an admin page that lets you inspect every route, see what&#8217;s present and what&#8217;s missing, and monitor the health of your SEO across the entire site.</p><p>This won&#8217;t serve prerendered HTML to bots on its own &#8212; you need a CDN layer for that (more below). But it gives you complete visibility into your SEO status and a cache that the CDN layer can draw from.</p><h3>6. Set Up CDN-Level prerendering</h3><p>The final piece is routing bot traffic through a service that serves fully rendered HTML. Your two best options:</p><p><strong>Cloudflare Workers (recommended):</strong> Move your DNS to Cloudflare&#8217;s free tier, create a Worker that checks the user agent for bot signatures, and route those requests to your prerender edge function. Humans get the normal SPA. Bots get complete HTML.</p><p><strong>Prerender.io:</strong> A managed service that handles bot detection and rendering for you. The free trial is 30 days, which is enough to get your pages initially indexed. But you&#8217;ll need a permanent solution after that, which is why Cloudflare Workers is the better long-term bet.</p><h4>Do you actually need CDN-Level prerendering?</h4><p>Maybe not &#8212; at least not right away. The changes in steps 1 through 5 do a lot of the heavy lifting on their own. Converting navigation to real <code>&lt;a&gt;</code> tags means crawlers can now discover and follow your internal links. A proper sitemap tells Google exactly what pages exist. The <code>noscript</code> fallback provides baseline content in the raw HTML. And Google&#8217;s own renderer does attempt to execute JavaScript for indexing. It&#8217;s not 100% reliable, but combined with proper links and a sitemap, it picks up a surprising amount of SPA content.</p><p>My recommendation: ship the fixes, submit your sitemap in Google Search Console, and use the URL Inspection tool to test your key pages over the next couple of weeks. Monitor how much Google indexes on its own. If coverage looks good for your 30-50 page marketing site, you might not need the CDN layer at all. If you&#8217;re still seeing pages missing or showing thin content after a few weeks, that&#8217;s when you set up Cloudflare Workers, and the prerender cache you&#8217;ve already built slots right in.</p><h2>Things that will go wrong (and how to handle them)</h2><p>I went through multiple rounds of iteration getting this right. Here&#8217;s what to watch out for:</p><h3>Lovable + Rendertron</h3><p>When you ask Lovable to implement prerendering, it will very likely suggest using Google&#8217;s Rendertron as the rendering backend. This is wrong, as <strong>Rendertron&#8217;s public hosted instance has been deprecated.</strong> If Lovable builds your prerender function around a Rendertron endpoint, it will fail silently and your cache will be empty.</p><p>Tell Lovable explicitly to use a direct HTTP fetch with regex parsing, falling back to route registry data. No external rendering service needed.</p><h3>The SEO debug dashboard will lie to you</h3><p>The first version of my debug dashboard showed every page as green/healthy. The health check logic was marking pages as &#8220;success&#8221; just because the HTTP fetch returned a 200 status code, even though the fetched HTML was an empty SPA shell with no content.</p><p>Make sure the health scoring is based on what was actually extracted (non-empty H1, non-empty meta description, at least one internal link), not on whether the HTTP request succeeded. And make sure it distinguishes between content that was found in the actual HTML vs. content that was pulled from the route registry as a fallback.</p><h3>Converting links will break navigation</h3><p>When you convert <code>&lt;a href&gt;</code> tags to React Router <code>&lt;Link&gt;</code> components (or vice versa), you might introduce full-page reloads where there should be smooth SPA transitions. Standard <code>&lt;a href&gt;</code> tags trigger a full page load. React Router <code>&lt;Link&gt;</code> components handle navigation client-side.</p><p>I had a round where the mobile nav and dropdown links all got converted to plain <code>&lt;a&gt;</code> tags, which meant every click caused a full page reload with a white flash. The fix is making sure everything uses <code>&lt;Link to="..."&gt;</code> which renders as a real <code>&lt;a&gt;</code> tag in the DOM (so crawlers can see it) but handles navigation without a page reload (so users get instant transitions).</p><h3>Lazy loading will cause flash</h3><p>Lovable uses <code>React.lazy()</code> and Suspense to code-split every page. This means navigating between pages shows a loading spinner while the new page&#8217;s JavaScript chunk downloads. After converting navigation to proper <code>&lt;Link&gt;</code> components, this flash becomes much more noticeable because transitions happen instantly on click instead of having a small delay from the old <code>onClick</code> handler.</p><p><strong>The fix:</strong> <br>Remove lazy loading for all public marketing pages and only keep it for authenticated app pages (dashboard, tools, settings). </p><h3>Security implications</h3><p>Adding edge functions, database tables, and admin pages introduces attack surface. After implementing the SEO changes, run a security audit. Specific things to check:</p><ul><li><p><strong>SSRF on the prerender function:</strong> The function accepts a URL path parameter. If it doesn&#8217;t validate the input, an attacker could make it fetch arbitrary URLs. Ensure the path must start with <code>/</code> and cannot contain <code>@</code>, <code>//</code>, <code>\</code>, or protocol schemes.</p></li><li><p><strong>CORS:</strong> Lovable preview URLs change. If you hardcode allowed origins, your debug page will break when the preview URL rotates. Use pattern-based matching.</p></li><li><p><strong>Admin access:</strong> Make sure the SEO debug page checks for an admin role, not just an authenticated user.</p></li><li><p><strong>robots.txt:</strong> Remember to block <code>/admin/</code> paths.</p></li></ul><p></p><h2>The Master Prompt</h2><p>Here&#8217;s the prompt you can paste directly into Lovable to implement the full fix. It&#8217;s been refined through multiple iterations to avoid the pitfalls above:</p><div><hr></div><blockquote><p>Our site is a client-side rendered React SPA. Search engine bots are receiving an empty <code>&lt;div id="root"&gt;&lt;/div&gt;</code> shell instead of rendered content. We need to fix crawlability without switching frameworks or requiring a full technical rebuild.</p><p><strong>Important constraints:</strong> We cannot add custom build scripts, modify the web server, or add middleware. We need to work within the existing Vite + React + Supabase architecture.</p><p>Please implement the following:</p><p><strong>1. Centralized Route Registry</strong></p><p>Create <code>src/data/siteRoutes.ts</code> &#8212; a single source of truth for all public, indexable routes. Each entry should include: path, expected page title, meta description, expected H1 text, expected internal link paths, last modified date, sitemap priority, and change frequency. This file will be used by the sitemap generator, the SEO debug page, and the prerender cache.</p><p><strong>2. Project-Wide Navigate Audit and Fix</strong></p><p>Search every component and page file for <code>onClick</code> handlers that use <code>navigate()</code> for internal page links. For every instance on a public-facing page (not behind auth), convert from <code>onClick={() =&gt; navigate(...)}</code> to <code>&lt;Button asChild&gt;&lt;Link to="..."&gt;</code> so crawlers see real <code>&lt;a href&gt;</code> tags. Do NOT convert navigate calls inside authenticated/dashboard pages &#8212; those are blocked by robots.txt and don&#8217;t need fixing. Show me the full list of what you found and what you converted.</p><p><strong>3. Prerender Edge Function</strong></p><p>Create <code>supabase/functions/prerender/index.ts</code> that:</p><ul><li><p>Accepts <code>?path=/some-page</code> and optional <code>?refresh=true</code> and <code>?bulk=true</code></p></li><li><p>Fetches the published site URL + path via HTTP GET</p></li><li><p>Parses the returned HTML using string/regex parsing to extract: title, meta description, H1, H2s, internal links</p></li><li><p>Since a simple fetch of an SPA returns the JS shell, falls back to populating the cache from the route registry metadata</p></li><li><p>Caches results in a <code>prerender_cache</code> database table</p></li><li><p>Computes a health status: green (title + description + H1 + links all present), yellow (some missing), red (critical elements missing)</p></li><li><p>Tracks the source of each field (&#8221;fetched&#8221; vs &#8220;registry_fallback&#8221;)</p></li><li><p>Includes extraction_notes explaining what was found and where</p></li><li><p>Requires admin authentication</p></li><li><p>Validates the path parameter to prevent SSRF (must start with <code>/</code>, no <code>@</code>, <code>//</code>, <code>\</code>, or protocol schemes)</p></li><li><p>Has rate limiting (5 bulk scans/hour, 60 single scans/hour)</p></li></ul><p><strong>Do NOT use Rendertron or any external rendering service. Rendertron&#8217;s public instance has been deprecated.</strong></p><p><strong>4. Dynamic Sitemap Edge Function</strong></p><p>Create <code>supabase/functions/generate-sitemap/index.ts</code> that generates valid XML from the route registry with <code>&lt;lastmod&gt;</code>, <code>&lt;priority&gt;</code>, and <code>&lt;changefreq&gt;</code>. Requires admin auth. Keep <code>robots.txt</code> pointing to the static <code>/sitemap.xml</code> &#8212; the edge function is a generation tool, not the live endpoint.</p><p><strong>5. Database Table</strong></p><p>Create <code>prerender_cache</code> with columns: path (PK), html_snapshot, title, meta_description, h1, h2s (jsonb), internal_links (jsonb), internal_link_count, status, rendered_at, source, health, extraction_notes (jsonb), registry_complete (boolean). RLS: service role can read/write, admins can read, block anonymous access.</p><p><strong>6. SEO Debug Admin Page</strong></p><p>Create <code>/admin/seo-debug</code> (admin-only, with role check &#8212; not just authenticated) with:</p><ul><li><p>Single page inspector: enter a path, scan it, see extracted title/description/H1/H2s/links with health badge and extraction notes</p></li><li><p>Crawl coverage dashboard: table of all routes showing health status, what&#8217;s present/missing, last scanned date, with per-row refresh and bulk scan</p></li><li><p>Sitemap regeneration button</p></li></ul><p><strong>7. Enhanced index.html</strong></p><p>Add a <code>&lt;noscript&gt;</code> block with site name, description, and key internal links as real <code>&lt;a&gt;</code> tags.</p><p><strong>8. App.tsx and robots.txt</strong></p><p>Add the admin route. Ensure robots.txt blocks <code>/admin/</code>. Do not remove any existing disallow rules.</p><p><strong>After implementation, also:</strong></p><ul><li><p>Remove React.lazy() for all public marketing pages. Only keep lazy loading for authenticated pages (dashboard, tools, settings). Public page navigation should have zero loading flash.</p></li><li><p>Confirm all CORS allowed origins cover both <code>.lovable.app</code> and <code>.lovableproject.com</code> preview domains plus the production domain.</p></li></ul></blockquote><p></p><p>I would suggest using Lovable&#8217;s &#8220;plan&#8221; feature to ensure that this is done in phases so it doesn&#8217;t get confused.</p><h2>What comes next</h2><p>Don&#8217;t trust that everything is fixed just because Lovable says it&#8217;s done. Here&#8217;s how to actually check.</p><p><strong>View Page Source (not Inspect Element).</strong> <br>Right-click any page and choose &#8220;View Page Source.&#8221; This shows you the raw HTML the server sends &#8212; the same thing a crawler gets. You should see your <code>&lt;title&gt;</code>, <code>&lt;meta name="description"&gt;</code>, Open Graph tags, structured data, and the <code>&lt;noscript&gt;</code> block with your H1, site description, and internal links as real <code>&lt;a&gt;</code> tags. If you only see <code>&lt;div id="root"&gt;&lt;/div&gt;</code> and script tags outside of the noscript block, that&#8217;s expected for an SPA &#8212; the noscript content is your crawlable fallback.</p><p><strong>Check from the command line.</strong> <br>Run <code>curl -s https://yoursite.com/ | grep '&lt;a href'</code> to count the links a basic crawler would find in the raw HTML. Then try <code>curl -s https://yoursite.com/ | grep -i '&lt;h1'</code> to check for headings. You should see links in the noscript block at minimum.</p><p><strong>Count your internal links in the DOM.</strong> <br>On your homepage, open dev tools, go to the console, and run <code>document.querySelectorAll('a[href^="/"]').length</code>. This tells you how many internal anchor links exist on the rendered page. Do the same on a few content-heavy pages. If the numbers are healthy (10+ on pages with navigation and CTAs), your link structure is working.</p><p><strong>Inspect the CTA buttons.</strong> <br>Right-click any call-to-action button on your public pages and Inspect Element. You should see a real <code>&lt;a href="/__u/dreasays.substack.com/your-path"&gt;</code> in the DOM, not a <code>&lt;button&gt;</code> with an <code>onClick</code> handler. If it&#8217;s an <code>&lt;a&gt;</code> tag, crawlers can see it.</p><p><strong>Check your sitemap.</strong> <br>Visit <code>yoursite.com/sitemap.xml</code> directly. Make sure every public page is listed and the URLs are correct.</p><p><strong>Use Google&#8217;s Rich Results Test.</strong> <br>Go to <a href="https://search.google.com/test/rich-results">search.google.com/test/rich-results</a> and enter your URL. It renders the page using Google&#8217;s actual rendering engine and shows you the rendered HTML and a screenshot. This is the closest thing to seeing what Googlebot actually sees. <br><br><strong>Monitor in Google Search Console.</strong> <br>Submit your sitemap, then use the URL Inspection tool to test 5-10 key pages. Check what Google sees in its rendered preview. Under Pages, watch the "Not indexed" reasons,  "Discovered - currently not indexed" means Google found the page but hasn't processed it yet (give it time), while "Crawled - currently not indexed" means Google fetched it but found insufficient content (that's a problem). </p><p>If pages move from "not indexed" to indexed over the coming days, the fixes are working. (This will take a while, mine is still running, but I&#8217;m hopeful as previously it immediately showed nothing.)</p><p>Meanwhile&#8230;</p><p>The debug dashboard is your ongoing monitoring tool. Check it periodically to make sure new pages you add have complete metadata in the route registry and that nothing has regressed.</p><div><hr></div><p>And that is our nerdy round up of the week, thanks for sticking around!<br>See you next time,</p><p>A</p>]]></content:encoded></item><item><title><![CDATA[Building, Breaking, Fixing]]></title><description><![CDATA[What I learned this month about stability, narrative, and why your website might be lying to you]]></description><link>https://dreasays.substack.com/p/building-breaking-fixing</link><guid isPermaLink="false">https://dreasays.substack.com/p/building-breaking-fixing</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Wed, 28 Jan 2026 10:04:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VNzy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friends,</p><p>I&#8217;ve been deep in the build-learn-build loop again, and this past month taught me more than I expected. <a href="http://www.getforma.co">Forma PM</a> grew in ways that feel quieter but more meaningful. Stability work, architecture fixes, value chains, a few security scares that I caught early, and a lot of clarity about how a product should behave.</p><p>Here&#8217;s what I&#8217;ve been working through.</p><h2>1. Making Forma stable</h2><p>I wanted Forma to feel calm. That meant tearing out old save logic, consolidating everything into one system, and rebuilding the foundation so people can work without thinking about the software underneath.</p><p>The app now saves offline, handles multiple tabs without confusion, and relies on a single autosave path instead of five scattered cousins. I also caught an issue with encryption keys during account switching and tightened the whole security layer. It felt like tedious work at first, but the payoff is a product that behaves consistently.</p><p><strong>&#128161; Lesson</strong>: Audit. Then audit again. Then audit again after that!</p><h2>2. Rebuilding Messaging Builder with value chains</h2><p>I built a new feature and then had to start over &#129318; The previous structure made things easy to fill out but didn&#8217;t push enough clarity. I rebuilt <a href="https://getforma.co/product/messaging-builder">Messaging Builder</a> around a value chain model that forces each step to connect. This means looking at Capability &#8594;  benefit &#8594;  outcome &#8594; business impact. </p><p>The tool now pulls upstream context from the other Forma modules and generates channel-specific content from a single narrative. I also added verdict-based validation so teams know when something is ready and when it needs more work. AI gathers evidence, rules determine the verdicts, and the whole thing behaves with more reliability.</p><p><strong>&#128161;Lesson</strong>: RAG is important when building. People expect to be helped, not to figure out where to go next.</p><p>In all its glory, the Messaging Builder now looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!VNzy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VNzy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg" width="1456" height="1225" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1225,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:273071,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/186061324?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!VNzy!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee3ff2b8-f2db-44a4-aedb-c8bfc195c9fa_1517x1276.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 aria-hidden="true" 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><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><h2>3. Lessons that stuck (and sucked)</h2><p>This round of work taught me a lot about my own habits and the product&#8217;s expectations.</p><p>Fixing symptoms creates clutter, so I started digging until I understood the real cause every time. Security behaves better as a system rather than a list of tasks. Testing flows instead of pieces catches the problems that actually matter. Encryption punishes inconsistency, so I unified derivation methods across frontend and backend to avoid silent failures.</p><p>These lessons felt small while I was in them, but each one changed the way Forma works. They changed the way I build too. This month felt like leveling up without the fireworks, just steady progress and clearer thinking.</p><h2>Website Teardowns</h2><p>I&#8217;m kicking off a new series where I look at real websites and break down what&#8217;s working and what isn&#8217;t. Not to be harsh, not to dunk on anyone, but to understand how teams tell their story, where the narrative holds up, and where it quietly falls apart. It&#8217;s a way to learn from solid choices, spot the patterns that get in the way, and sharpen how we all think about product storytelling.</p><p>First candidate up: <strong><a href="https://getforma.co/blog/teardowns/intercom">Intercom</a></strong></p><p>Let me know if you want me to look at yours!</p><p>Until next time,</p><p>A</p>]]></content:encoded></item><item><title><![CDATA[The simple fix it that f*cked up my day]]></title><description><![CDATA[What started as a quick onboarding tweak turned into a 6-hour debugging odyssey through recursion hell, state management purgatory, and the occasional existential crisis.]]></description><link>https://dreasays.substack.com/p/the-simple-fix-it-that-fcked-up-my</link><guid isPermaLink="false">https://dreasays.substack.com/p/the-simple-fix-it-that-fcked-up-my</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 26 Oct 2025 17:32:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What started as a <em>quick</em> onboarding tweak turned into a 6-hour debugging odyssey through recursion hell, state management purgatory, and the occasional existential crisis. </p><p>Yes, I cried.</p><p>The goal was innocent enough:</p><blockquote><p>I should change the progress bar to indicate specific states instead</p></blockquote><p>Here&#8217;s what actually happened:</p><ul><li><p>I broke the entire backend</p></li><li><p>Restoring Lovable to a previous version doesn&#8217;t actually restore database changes, only front-end changes</p></li><li><p>And my brain&#8230; stopped working somewhere around Round 3.</p></li></ul><p>After five full rounds of &#8220;fix, refix, break something else, fix again,&#8221; the damn thing finally works. Elegantly, even.</p><p>Now, Forma gently recommends that new users start where they should, without nagging or trapping them in UX hell, and specifically tracks down every single step in tools so you know where you&#8217;re at and can skip ahead.</p><p>Oh, and while I was at it, I also:</p><ul><li><p>Added dark mode &#127769;</p></li><li><p>Built improved onboarding</p></li><li><p>Connected more context between tools (central intelligence system, coming to life)</p></li></ul><p>The lesson here&#8230;.</p><p>A simple feature is only simple if you think it through completely the first time. Otherwise, you&#8217;re just stacking simple fixes until they become a complex mess.</p><p>Also, vibe coding amirite.</p><p>Time spent fixing: <strong>5 hours</strong></p><p>Time spent thinking: <strong>1 hour</strong></p><p>Ratio we should aim for next time: <strong>Flip it.</strong></p><p>Forma PM is getting sharper, smarter, and (ironically) more aligned than I am.</p><p>Progress, right?</p><p>&#8212; Andrea</p>]]></content:encoded></item><item><title><![CDATA[Vibe coding: 5 lessons learned this week]]></title><description><![CDATA[A fast build week at Forma.]]></description><link>https://dreasays.substack.com/p/vibe-coding-5-lessons-learned-this</link><guid isPermaLink="false">https://dreasays.substack.com/p/vibe-coding-5-lessons-learned-this</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 19 Oct 2025 15:12:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A fast build week at Forma. We shipped experiments, spoke with users, and cleaned up our story. Here are five takeaways you can use right away.</p><h3>1. Data security is a competitive differentiator</h3><p>Users are genuinely concerned about sharing proprietary product strategy with ChatGPT. Not to mention, OpenAI is already looking at how to lock down and make pricing more expensive <em>(wait for it&#8230;..)</em></p><p>Privacy messaging works best when it&#8217;s concrete and comparative.</p><h3>2. Homepage real estate matters</h3><p>Any good product marketer knows this. The outcomes/benefits section of your homepage is valuable real estate, and you have but a few seconds to get people&#8217;s attention.</p><p>I rejigged pages and added a 4th card to highlight privacy, creating visual symmetry while reinforcing our core value prop.</p><h3>3. Visual design  insights</h3><p>Overly complex gradients can feel &#8220;naff&#8221; and distract from the message (this is a legit statement, from myself to myself.)</p><p>Simple, clean backgrounds often work better than elaborate patterns.</p><p>Glass-card styling with subtle borders creates enough visual interest without overwhelming.</p><h3>4. Messaging Strategy</h3><p>Security messaging is more powerful as an outcome/benefit rather than buried in features. Take a step back to understand your fact, benefit, and emotional statements.</p><p>&#8220;Your strategy stays yours&#8221; is a clear, emotional benefit statement that positions things while creating a value exchange.</p><h3>5. Content structure decisions</h3><p>Homepage vs dedicated pages: Homepage wins for critical differentiators that drive conversions. Keep your important messaging there!</p><p>The &#8220;outcomes&#8221; section is where emotional/strategic benefits live, not just functional features. Remember to balance: Benefit &lt;&gt; Value &lt;&gt; Feature.</p><div><hr></div><p>Oh, and of course, the ongoing lesson of test all of your edge functions, because the second you ask an AI to fix something, it will most certainly break something else.</p><p>If you haven&#8217;t checked out <a href="http://www.getforma.co">Forma PM</a> yet, please do give it a go!</p><p>Until next time,</p><p>A</p>]]></content:encoded></item><item><title><![CDATA[Lessons from the first week of vibe coding]]></title><description><![CDATA[Hi there!]]></description><link>https://dreasays.substack.com/p/lessons-from-the-first-week-of-vibe</link><guid isPermaLink="false">https://dreasays.substack.com/p/lessons-from-the-first-week-of-vibe</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 12 Oct 2025 10:01:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi there!<br>Last week I started building <strong>Forma PM</strong>, a new product for PMs, PMMs and founders to turn ideas into board-ready (and funding ready) narratives to get stakeholder buy-in faster. It started as a weekend experiment, and somehow, it&#8217;s already a product with paying users.</p><p>Building it has been fun. Breaking it has been&#8230; educational.</p><p>Here are some of the biggest lessons from the last few weeks:</p><h3><strong>1. Email templates are evil.</strong></h3><p>I sent my first announcement email without properly testing it. <em>Oops.</em></p><p>Looked fine in Gmail, but completely broke in other clients. Dark mode inverted everything, buttons shifted, gradients looked terrible.</p><p>HTML emails are unpredictable! If you don&#8217;t test everywhere, they&#8217;ll remind you why you should have.</p><h3><strong>2. OAuth is never &#8220;done.&#8221;</strong></h3><p>I spent hours debugging &#8220;invalid&#8221; errors that had nothing to do with configuration.</p><p>The real problem was timing. The app was checking auth state before the session fully loaded.</p><p>Fixing it meant rethinking how the app handled async state changes, not just the login flow.</p><h3><strong>3. Supabase gives you a secure foundation, but only if you build on it correctly.</strong></h3><p>Supabase is great because it comes with serious security and compliance out of the box SOC 2 certified, encrypted, and reliable.</p><p>But what you build on top of it is your responsibility.</p><p>That means adding <strong>row-level security (RLS)</strong> so users can only access their own data, validating every input before it hits the database, and setting rate limits to prevent spam or abuse.</p><p>Without those extra layers, you&#8217;re leaving the door wide open even if the foundation is solid.</p><h3><strong>4. Stripe webhooks are your source of truth.</strong></h3><p>And also an absolute fucking nightmare. Never trust client-side confirmations.</p><p>Everything, and I mean <em>everything, </em>depends on how webhooks fire and fail.</p><h3><strong>5. Cookie consent is not &#8220;nice to have.&#8221;</strong></h3><p>If you&#8217;re going to say &#8220;GDPR ready,&#8221; prove it. Granular consent, easy &#8220;reject all,&#8221; transparent tracking. Users trust you more when you&#8217;re honest about what you&#8217;re collecting.</p><h3><strong>6. Users will find the cracks faster than you do.</strong></h3><p>No matter how much you test, users will still break your logic in ways you never imagined.</p><p>Someone managed to get more than the limit of messages in the first version of the trial workflow. Fixing it meant tightening validation server-side and locking usage down by unique IDs.</p><p>Forma PM now a lot more stable and secure than when I started. Still rough around the edges, but it&#8217;s evolving fast.</p><p><strong>If you want to see what I&#8217;ve been building: <a href="https://getforma.co">getforma.co</a></strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.getforma.co&quot;,&quot;text&quot;:&quot;Check out Forma PM&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.getforma.co"><span>Check out Forma PM</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[I turned a weekend experiment into a new business]]></title><description><![CDATA[A few weeks ago, I built a small GPT to help PMs and PMMs write better business cases.]]></description><link>https://dreasays.substack.com/p/i-turned-a-weekend-experiment-into</link><guid isPermaLink="false">https://dreasays.substack.com/p/i-turned-a-weekend-experiment-into</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 05 Oct 2025 18:46:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few weeks ago, I built a small GPT to help PMs and PMMs write better business cases.</p><p>It was meant to be a test, a tiny hackathon project to see if I could automate part of the painful &#8220;how do I get stakeholders onboard?&#8221; process.</p><p>That experiment grew legs.</p><p>This week, it became a real product, and <strong><a href="http://www.getforma.co">Forma</a></strong> now has its first paying customer.</p><p>Forma helps product people turn half-formed ideas into structured, exec-ready strategies.</p><p>It&#8217;s where messy thoughts, half-written briefs, and loose hypotheses finally take shape.</p><p>You can think of it as a suite of AI copilots for the product world:</p><p>&#8594; <em>Business Case Coach</em> &#8212; prove the problem, earn the yes</p><p>&#8594; <em>Feature Comms</em> &#8212; keep PMs, PMMs, and stakeholders aligned</p><p>&#8594; Launch brief &#8212; <em>coming soon.</em></p><p>There&#8217;s still a lot to build, but the early validation is what matters most.</p><p>I didn&#8217;t start with a business plan. I started with a <strong>problem worth solving</strong>, tested fast, learned fast, and kept going.</p><p>That&#8217;s the real playbook!</p><blockquote><p>Start small. Validate early. Ship something useful.</p></blockquote><p>If you&#8217;re curious, Forma&#8217;s live now: <strong><a href="https://getforma.co">getforma.co</a></strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.getforma.co&quot;,&quot;text&quot;:&quot;Check it out!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.getforma.co"><span>Check it out!</span></a></p><p>Let&#8217;s see what takes shape next.</p><p>Andrea</p>]]></content:encoded></item><item><title><![CDATA[Vibe coding, conferences and a brand new GPT]]></title><description><![CDATA[Hey everyone,]]></description><link>https://dreasays.substack.com/p/vibe-coding-conferences-and-a-brand</link><guid isPermaLink="false">https://dreasays.substack.com/p/vibe-coding-conferences-and-a-brand</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Mon, 22 Sep 2025 08:10:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey everyone,</p><p>It&#8217;s me again, your not-so-steady product newsletter, because really, I only write when I have something to share (I truly don&#8217;t believe in spam.)<br><br>Anyway, so some cool stuff has happened over the last few weeks worth sharing!</p><h2>I built a GPT</h2><p>Yes, you read that right. <br><br>I had myself a little hackathon this morning and decided to build a GPT to guide product people through how to create a product problem outline.<br><br>It focuses on:<br>- Defining the core problem<br>- Clarifying why it matters (to customers + business)<br>- Mapping success metrics (leading + lagging)<br>- Capturing discovery experiments<br>- Prepping GTM communication with PMMS<br><br>What I like most is it feels less like a tool and more like a thoughtful product coach. It asks great follow-up questions, keeps people honest when being vague, and makes sure you don&#8217;t skip critical context.<br><br>Of course, all of this is based on years of experience and learnings from my book with <strong><a href="https://www.linkedin.com/in/mrdavemartin/">Dave Martin</a></strong>!<br><br>The end result is a problem outline that&#8217;s structured, shareable, and actually helps align teams &#10024;<br><br>If you&#8217;re a PM (or work with PMs), you know how messy this process can get. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://chatgpt.com/g/g-68cd059a095081918d7fb59569ce25a0-product-problem-guide&quot;,&quot;text&quot;:&quot;Get it here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://chatgpt.com/g/g-68cd059a095081918d7fb59569ce25a0-product-problem-guide"><span>Get it here</span></a></p><p></p><p>After launching it on Linkedin, <strong>it&#8217;s important to note:</strong></p><ol><li><p>The purpose of this GPT is to guide product people through how to structure thinking when they&#8217;re embarking on solving a new problem.</p></li><li><p>It is <strong>NOT</strong> going to do your job for you. It will not run discovery or tell you how to run experimentation.</p></li><li><p>However, once you have done that, it&#8217;ll help organise your findings so you can share and communicate these things across your org.</p></li></ol><h2>Upcoming talks</h2><p>I&#8217;m going to be talking in a few places, if you want to join and say hi!</p><h3><br>Agile Cambridge</h3><p>If you&#8217;re in the UK, come along to <strong><a href="https://agilecambridge.net/">Agile Cambridge</a></strong> on <strong>October 1-2</strong>. I&#8217;ll be there with Dave running a workshop.</p><h3>Product Drive 2025</h3><p>I love vibe coding as much as the next person, but people have got to stop thinking it&#8217;s going to help them bypass critical product processes and just get to launch. Join me <strong>October 7 @ Product Drive</strong> as I talk about how everyone needs to <strong><a href="https://productdrive.userpilot.com/">Stop Trying to Vibe Code their way to PMF.</a></strong><a href="https://productdrive.userpilot.com/"> </a></p><p></p><p>Hope to see you around!<br>A</p>]]></content:encoded></item><item><title><![CDATA[Is it time for a product foursome?]]></title><description><![CDATA[Product, design, and engineering make up the well-known product trio.]]></description><link>https://dreasays.substack.com/p/is-it-time-for-a-product-foursome</link><guid isPermaLink="false">https://dreasays.substack.com/p/is-it-time-for-a-product-foursome</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 13 Jul 2025 08:35:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Product, design, and engineering make up the well-known product trio. Most teams lean on it without blinking.</p><p>The gap shows up at launch. No one in that trio owns the customer story or the path to revenue, so sales is guessing the pitch, legal is fixing pricing, and the homepage changes three times before Friday.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dreasays.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">Drea Says Product Things is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>I wrote a short post on adding Product Marketing as the fourth seat from day one. Inside you&#8217;ll find:</p><ul><li><p>A quick test to spot pretend alignment</p></li><li><p>A four-seat table you can copy for your next kickoff</p></li><li><p>Three checks that turn a fuzzy value prop into a single repeatable line</p></li></ul><p>Give it a read if you want calmer launches.</p><h2><strong>&#128073; <a href="https://medium.com/@dreasaez/is-it-time-for-a-product-foursome-ccb7b6a2bdf2">Read the post</a></strong></h2><p></p><p>Have a wonderful summer,</p><p>A</p><p></p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dreasays.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">Drea Says Product Things is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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[Validation, confirmation, and skipping the thinking]]></title><description><![CDATA[If you think a PRD should be replaced with a prototype, you probably don&#8217;t understand what either is for.]]></description><link>https://dreasays.substack.com/p/validation-confirmation-and-skipping</link><guid isPermaLink="false">https://dreasays.substack.com/p/validation-confirmation-and-skipping</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Sun, 29 Jun 2025 11:16:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you think a PRD should be replaced with a prototype, you probably don&#8217;t understand what either is for.</p><p>That was the opening line of a LinkedIn post I shared this week &#8212; and it hit a nerve. Not because prototypes are bad (they&#8217;re not), or because PRDs are great (they&#8217;re also not.)</p><p>Prototypes help confirm that a solution works for the problem you believe exists. But they don&#8217;t tell you whether that problem is real, meaningful, or worth solving. That work happens earlier, through validation.</p><p>Somewhere along the way, the practice of writing things down became unfashionable. Apparently, now we can skip it all and go straight into AI and built whatever solution we desire.</p><p>By no means am I suggesting we need to go back to 20-page documents that nobody reads. But teams still need a way to align. Something that captures what has been validated, what&#8217;s still uncertain, what assumptions are in play, and how those will be tested. Call it a PRD, a brief, a discovery doc, or a <a href="https://medium.com/design-bootcamp/how-to-write-a-product-problem-outline-template-included-aa4bc19d776f">product problem outline</a>. The format doesn&#8217;t matter. What matters is that the thinking has happened, and it&#8217;s visible to the team.</p><p>This week I wrote about the difference between <strong>validation</strong> and <strong>confirmation</strong>, and why the sequence matters. When you mix them up, it becomes very easy to build things that look right but don&#8217;t solve anything, but because too often, teams skip the product thinking and jump straight into design.</p><h2><a href="https://medium.com/design-bootcamp/stop-using-confirmation-as-validation-in-product-management-fec7dc3190d5">&#128073; </a><strong><a href="https://medium.com/design-bootcamp/stop-using-confirmation-as-validation-in-product-management-fec7dc3190d5">Read it here</a></strong></h2><p>Hope it helps sharpen your thinking! And if anybody tells you otherwise, they know nothing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qksV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 424w, /__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 848w, /__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qksV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif" width="500" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:818862,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/167094533?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 424w, /__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 848w, /__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!qksV!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c0c987-3167-40e2-aa3b-a8c77cc6d1b1_500x258.gif 1456w" sizes="100vw" fetchpriority="high"></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 aria-hidden="true" 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><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></p><p></p>]]></content:encoded></item><item><title><![CDATA[Behavioural economics and more]]></title><description><![CDATA[Hey gang,]]></description><link>https://dreasays.substack.com/p/behavioural-economics-and-more</link><guid isPermaLink="false">https://dreasays.substack.com/p/behavioural-economics-and-more</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Mon, 14 Apr 2025 10:02:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TeKk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey gang,</p><p>Two themes have been circling in my head lately:</p><ol><li><p>The invisible wall between product marketers and product managers</p></li><li><p>The very real impact of behavioural economics on product decisions</p></li></ol><p>I&#8217;ve written about both in the last moth, and I think they&#8217;re more connected than they first appear. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!TeKk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 424w, /__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 848w, /__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!TeKk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png" width="1418" height="1338" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1338,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3220191,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dreasays.substack.com/i/161288678?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 424w, /__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 848w, /__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TeKk!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef9042e4-2f20-4ffc-a8dc-8cc612794a5b_1418x1338.png 1456w" sizes="100vw" fetchpriority="high"></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 aria-hidden="true" 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><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></p><div><hr></div><h3><strong>1. Product marketers need to understand product management</strong></h3><p>This is about the <em>how</em> and <em>why</em> behind product decisions.</p><p>This blog post comes from experience on both sides of the fence.</p><p>I started in product management before moving into product marketing, and I&#8217;ve seen firsthand what happens when PMMs aren&#8217;t brought into the thinking early (and what happens when they are).</p><p>This one&#8217;s for anyone who&#8217;s ever felt the tension between teams and wants to work better, together:</p><p>&#128073; <strong><a href="https://medium.com/design-bootcamp/why-product-marketers-must-understand-product-management-1bb6b41614f1">Read it here</a></strong></p><div><hr></div><h3><strong>2. Behavioural economics for product managers</strong></h3><p>We talk a lot about friction, conversion, time-to-value.</p><p>But often, what we&#8217;re really talking about is <em>how people behave under pressure, with limited time, limited context, and lots of cognitive shortcuts</em>.</p><p>This post breaks down some key behavioural concepts that I think every PM should have in their toolkit&#8212;from loss aversion to decision inertia&#8212;and how they show up in product work.</p><p>If you&#8217;ve ever wondered why a &#8220;good&#8221; feature didn&#8217;t land, this one might help connect the dots:</p><p>&#128073; <strong><a href="https://medium.com/design-bootcamp/behavioural-economics-for-b2b-product-teams-cf73a496446d">Read the post</a></strong></p><div><hr></div><p>I&#8217;d love to know what resonates and what you see in your world.</p><p>Just hit reply, or find me on <a href="https://www.linkedin.com/in/andreasaez/">LinkedIn</a>.</p><p>More soon,</p><p>Andrea</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dreasays.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dreasays.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[I accidentally went viral ]]></title><description><![CDATA[You're all very welcome]]></description><link>https://dreasays.substack.com/p/i-accidentally-went-viral</link><guid isPermaLink="false">https://dreasays.substack.com/p/i-accidentally-went-viral</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Mon, 17 Mar 2025 09:28:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few fun things have happened over the last month, primarily that I went viral (twice!)<br><br>Here&#8217;s what you missed:</p><h3><a href="https://dreasaez.medium.com/how-to-build-a-now-next-later-roadmap-without-the-chaos-a450b203a2e8"><br>How to build a Now, Next, Later roadmap without the chaos</a></h3><p>I included this in my last newsletter, but worth bringing back! I recently ran a little workshop with our product team, aligning around our OKRs, KPIs, and building out our roadmap.</p><p></p><h3><a href="https://dreasaez.medium.com/when-is-it-time-to-move-on-from-an-okr-25b311f3ded5">When is it time to move on from an OKR?</a></h3><p>As a follow up to the previous blog, Saeed Khan reached out with an excellent question: When is it time to move on from an OKR? How do you tie this to a Now, Next, Later roadmap if we&#8217;re not talking about dates? &#129300;</p><p></p><h3><a href="https://www.linkedin.com/posts/andreasaez_prodmgmt-productmanagement-roadmaps-activity-7304833430461075458-j6h9?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAL36McBpOeALfHrmjzo3vQojLJS4pDavOA">How to prioritize bugs on a roadmap</a></h3><p>If the question triggers you&#8230; well, it triggered me too. I ended up posting on Linkedin about this, and accidentally hit 63,500 views in under a week. </p><p>Quite predictably, the majority of people decided to tell me how to do this, proving that far too many people jump to answering a question without taking the time to read.</p><p>Our job as product leaders is not to tell someone how to do something &#128680; It is to listen, digest, and then break down the question properly: what are they really asking? How can we help them move past just the base level question and think more holistically?</p><p>When we do this, we empower young product managers to:</p><ol><li><p>Empower themselves and their peers to ask the right questions</p></li><li><p>Set the right expectations and communicate properly</p></li><li><p>Become autonomous and build confidence in their work</p></li><li><p>Build relationships with trust</p></li></ol><p>A lot of people assume that when someone asks <strong>&#8220;How do I do X?&#8221;</strong>, they&#8217;re simply looking for a step-by-step answer.</p><p>But more often than not, they&#8217;re grappling with something bigger&#8212;whether it&#8217;s unclear expectations, misalignment between teams, or a fundamental misunderstanding of how their work fits into the broader strategy.</p><p>Instead of <strong>reacting</strong> to the surface-level question, we should be asking ourselves:</p><p>&#8226; <strong>What problem are they actually trying to solve?</strong></p><p>&#8226; <strong>Where might confusion be coming from?</strong></p><p>&#8226; <strong>Is there a deeper knowledge gap that needs to be addressed?</strong></p><p>&#8226; <strong>How can we help them move from execution mode to strategic thinking?</strong></p><p>Would love to hear what you all have to say!<br><br>Until next time,</p><p>Andrea</p><p></p>]]></content:encoded></item><item><title><![CDATA[Let's talk about roadmaps]]></title><description><![CDATA[The writing has been slow, but worth the wait!]]></description><link>https://dreasays.substack.com/p/lets-talk-about-roadmaps</link><guid isPermaLink="false">https://dreasays.substack.com/p/lets-talk-about-roadmaps</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Tue, 18 Feb 2025 10:30:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KJTQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F258c2339-d87a-41f8-bf37-f2154f1e1872_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The writing has been slow, but worth the wait!</p><p>I&#8217;m back with something I think a lot of product people will find useful.</p><p>Stepping into a new product leadership role is always an adventure. You inherit a team that&#8217;s already doing great work, but sometimes, the structure around how success is measured and how priorities are set isn&#8217;t fully in place. That was the case for me recently.</p><p>You all know I love a good roadmap&#8230; but what I love even more is good structure.</p><p>I&#8217;m not here to tell you <strong>how</strong> to create a roadmap&#8212;there&#8217;s no single &#8220;right&#8221; way. But I do want to share a step-by-step framework for how to think through a roadmap in a structured way using a collaborative workshop with product leadership.</p><p>In my latest post, I walk through the exact process I used to build a <strong>Now, Next, Later</strong> roadmap&#8212;starting with OKRs, mapping initiatives to measurable outcomes, and making sure we&#8217;re always solving the right problems at the right time.</p><p>If you&#8217;re tackling something similar, I&#8217;d love to hear how you approach it.</p><p>&#128073; <strong><a href="https://dreasaez.medium.com/how-to-build-a-now-next-later-roadmap-without-the-chaos-a450b203a2e8">Check out the full post here</a>. &#128072;</strong></p><p>Would love to hear your thoughts!</p>]]></content:encoded></item><item><title><![CDATA[Creating a customGPT for sales enablement]]></title><description><![CDATA[PMs and PMMs are under pressure to basically do it all.]]></description><link>https://dreasays.substack.com/p/creating-a-customgpt-for-sales-enablement</link><guid isPermaLink="false">https://dreasays.substack.com/p/creating-a-customgpt-for-sales-enablement</guid><dc:creator><![CDATA[andrea saez]]></dc:creator><pubDate>Mon, 27 Jan 2025 08:34:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tFY_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PMs and PMMs are under pressure to basically do it all. It&#8217;s an impossible task, but with all these blurred lines, it is often hard to determine who leads what, and how to make the most out of it.</p><p>I am currently leading PMM at <a href="http://www.turtl.co">Turtl</a>, but as a team of two, it&#8217;s nearly impossible to handle positioning, messaging, ICP work, market and buyer research, relaunch a whole product, work on GTM &#8230; and on top of that, also do sales enablement. </p><p>To help me, I asked myself how I could use AI to help me scale things&#8230; and so Turtl GPT came to be. <br><br>Trained on Turtl&#8217;s value framework, messaging strategy, proof points, product taxonomy, and case studies, Turtl GPT provides:<br><br>&#9989; Speed &amp; scale: Instantly delivers insights on positioning, competitor intelligence, and customer success stories.<br><br>&#9989; Consistency &amp; accuracy: Ensures messaging aligns with our core values.<br><br>&#9989; Productivity boost: Reduces time spent searching for or waiting for answers across teams in multiple time zones, so teams can focus execution.<br><br>It&#8217;s also got guardrails to prevent hallucination and control (mis)information as new things are being developed, while allowing everyone to be empowered that they can create their own comms without anyone else becoming a silo.<br><br>It&#8217;s already able to run some playbooks and help with renewals and close deals. Scaling enablement one Turtl at a time &#128640; <br><br>Over the weekend I also trained it on some <em>legalese</em> so it can help SDRs deal with RFPs and renewals. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tFY_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 424w, /__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 848w, /__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_webp, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tFY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif" width="480" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3718524,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_424, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 424w, /__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_848, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 848w, /__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_1272, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!tFY_!, /__u/dreasays.substack.com/w_1456, /__u/dreasays.substack.com/c_limit, /__u/dreasays.substack.com/f_auto, /__u/dreasays.substack.com/q_auto:good, /__u/dreasays.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F866c8b49-1c9b-4251-814c-aa7f1cc32322_480x480.gif 1456w" sizes="100vw" fetchpriority="high"></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 aria-hidden="true" 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><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>Would love to hear how some of you are using AI to help scale work!</p><p>Til next time &#128406;,</p><p>Andrea</p>]]></content:encoded></item></channel></rss>