<?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[Prompt-Led Product | For PMs Building in the AI Era: DraftKit]]></title><description><![CDATA[DraftKit: The Async Collaboration Workspace Built for Substack Writers. ]]></description><link>https://promptledproduct.substack.com/s/draftkit</link><image><url>https://substackcdn.com/image/fetch/$s_!moXs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979d931d-85f5-465b-8fc3-1fbc518f5319_1280x1280.png</url><title>Prompt-Led Product | For PMs Building in the AI Era: DraftKit</title><link>https://promptledproduct.substack.com/s/draftkit</link></image><generator>Substack</generator><lastBuildDate>Tue, 09 Jun 2026 18:20:11 GMT</lastBuildDate><atom:link href="https://promptledproduct.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[© 2026 Elena Calvillo | AI Product Leader]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[promptledproduct@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[promptledproduct@substack.com]]></itunes:email><itunes:name><![CDATA[Elena | AI Product Leader]]></itunes:name></itunes:owner><itunes:author><![CDATA[Elena | AI Product Leader]]></itunes:author><googleplay:owner><![CDATA[promptledproduct@substack.com]]></googleplay:owner><googleplay:email><![CDATA[promptledproduct@substack.com]]></googleplay:email><googleplay:author><![CDATA[Elena | AI Product Leader]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[DraftKit: The Async Collaboration Workspace Built for Substack Writers]]></title><description><![CDATA[Managing a guest post from pitch to published took me longer than writing the thing solo. DraftKit is the product I built to fix exactly that: one workspace for the draft, and the coordination.]]></description><link>https://promptledproduct.substack.com/p/draftkit-the-async-collaboration</link><guid isPermaLink="false">https://promptledproduct.substack.com/p/draftkit-the-async-collaboration</guid><dc:creator><![CDATA[Elena | AI Product Leader]]></dc:creator><pubDate>Mon, 18 May 2026 22:41:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!A-8O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A-8O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A-8O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png 424w, https://substackcdn.com/image/fetch/$s_!A-8O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png 848w, https://substackcdn.com/image/fetch/$s_!A-8O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png 1272w, https://substackcdn.com/image/fetch/$s_!A-8O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A-8O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png&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;:641854,&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://promptledproduct.substack.com/i/198333327?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A-8O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png 424w, https://substackcdn.com/image/fetch/$s_!A-8O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png 848w, https://substackcdn.com/image/fetch/$s_!A-8O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.png 1272w, https://substackcdn.com/image/fetch/$s_!A-8O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fc7f0d-8cf4-4247-b2f5-9aca3415f0f3_1728x972.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Managing a guest post from pitch to published took me longer than writing the thing solo. </p><p>I was switching between Gmail threads, a shared Google Doc, a Notion comment, and three DMs before a single paragraph was finalized. </p><blockquote><p><strong>DraftKit is the product I built to fix exactly that: one workspace for the draft, the feedback, and the coordination.</strong></p></blockquote><div><hr></div><h2>The Problem Collaboration Was Solving in the Wrong Place</h2><p>Guest posting on Substack is not a writing problem. It is a coordination problem.</p><p>A writer reaches out. You agree on a topic. The draft lives in Google Docs. The feedback lands in email. The scheduling conversation happens in DMs. And by the time you are ready to publish, you have touched six different tools for a single piece of content.</p><p><strong>The friction is not the writing. It is the overhead around the writing.</strong> And for async-first Substack writers who are not working inside a traditional editorial team, there is no tool that handles this specific workflow without requiring your collaborator to also pay for a subscription.</p><p>That is the exact gap DraftKit was built to close.</p><div><hr></div><h2>The Stack</h2><p>DraftKit is built on:</p><ul><li><p>&#9989; <strong>Lovable</strong> &#8212; product development and interface</p></li><li><p>&#9989; <strong>Supabase</strong> &#8212; database and auth</p></li><li><p>&#9989; <strong>Resend</strong> &#8212; transactional email</p></li><li><p>&#9989; <strong>TypeScript</strong> &#8212; application logic</p></li><li><p>&#9989; <strong>Stripe</strong> &#8212; payments and subscription management</p></li></ul><p>No agency. No co-founder. No external dev team. I shipped the entire product solo in under 30 days.</p><div><hr></div><h2>The PRD Decisions That Changed Everything</h2><h3>The Feature I Thought Would Drive Revenue Was Wrong</h3><p>Before I wrote a single line of code, I mapped out the product. The calendar was going to be the thing people paid for. Editorial planning, publishing schedules, content pipelines. I was convinced that was the value proposition.</p><p>The first wave of real users told me otherwise within two weeks. <strong>The writing workspace itself, the place where the draft lived and the feedback happened, was where people spent all their time.</strong> The calendar barely got touched.</p><p>That single signal changed the entire product direction before I built the wrong thing at scale. I stopped treating the calendar as a primary feature and rebuilt the workspace as the core product. That is the kind of feedback that only comes from shipping early and watching real behavior instead of running surveys.</p><div class="callout-block" data-callout="true"><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;802b8b38-9900-4688-adec-05d691278033&quot;,&quot;caption&quot;:&quot;Most collaboration tools stop at the introduction. They help you find someone, exchange contact info, and then leave you with a blank document and the vague pressure of a shared deadline.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;DraftKit: How SMART Match and SMART Draft Work&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:31598723,&quot;name&quot;:&quot;Elena | AI Product Leader&quot;,&quot;bio&quot;:&quot;AI Product Manager turned builder. Founder of DraftKit.app, AIAdventChallenge.com. I stopped asking for permission and now I lead through evidence. Published book author. Trusted by Reforge.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!RnEf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad6b36c8-e5a6-4820-b875-e7165528aae9_3000x3000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-18T21:22:11.098Z&quot;,&quot;cover_image&quot;:null,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://promptledproduct.substack.com/p/draftkit-how-smart-match-and-smart&quot;,&quot;section_name&quot;:&quot;DraftKit&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:198325687,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1252952,&quot;publication_name&quot;:&quot;Prompt-Led Product | For PMs Building in the AI Era&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!moXs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979d931d-85f5-465b-8fc3-1fbc518f5319_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></div><h3>I Refused to Let Subscription Walls Kill Collaboration</h3><p>There is a well-documented pattern in SaaS tools built for teams: the tool is useful, the person invites a collaborator, the collaborator hits a paywall, and the original user abandons the tool rather than asking their guest to pay.</p><p>I watched this happen repeatedly with tools Substack writers were already using. <strong>A guest writer should never have to buy a subscription to leave feedback on your draft.</strong> That is a tax on collaboration, and it kills the network effect that makes a tool like this worth anything.</p><p>So I built a credit-based guest access model. The writer who owns the workspace buys credits. Their collaborators get access without a subscription. This decision came directly from watching where writers dropped off in competing tools, and it is the one product choice I am most confident was correct.</p><h3>Shipping Speed Was a Product Decision, Not Just a Timeline</h3><p>I made a deliberate choice to ship the MVP in under 30 days using Lovable instead of a traditional development process. <strong>The build speed is not a flex, it is a data point about what is possible when you use prompt-led development for a focused, well-scoped product.</strong></p><p>The constraints of building fast forced better scoping. I could not over-engineer the feature set. I had to identify the minimum viable coordination layer and ship it. That discipline is visible in the product: DraftKit does one thing well instead of five things poorly.</p><div class="callout-block" data-callout="true"><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;735e52e0-2e7f-469b-9a49-b452f357fc57&quot;,&quot;caption&quot;:&quot;Before I wrote the first line of code, I had a clear picture of what DraftKit would be. A coordination tool for Substack writers, built around a calendar. Writers would book dates, manage their collaboration schedule, and the calendar would be the thing that made them pay. I was wrong about the most important part.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;DraftKit: The Assumption I Had Wrong About My Own Product&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:31598723,&quot;name&quot;:&quot;Elena | AI Product Leader&quot;,&quot;bio&quot;:&quot;AI Product Manager turned builder. Founder of DraftKit.app, AIAdventChallenge.com. I stopped asking for permission and now I lead through evidence. Published book author. Trusted by Reforge.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!RnEf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad6b36c8-e5a6-4820-b875-e7165528aae9_3000x3000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-18T21:20:01.136Z&quot;,&quot;cover_image&quot;:null,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://promptledproduct.substack.com/p/draftkit-the-assumption-i-had-wrong&quot;,&quot;section_name&quot;:&quot;DraftKit&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:198325401,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1252952,&quot;publication_name&quot;:&quot;Prompt-Led Product | For PMs Building in the AI Era&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!moXs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979d931d-85f5-465b-8fc3-1fbc518f5319_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></div><h2>What the Numbers Look Like</h2><ul><li><p><strong>~50 active users</strong> after launch, with no paid acquisition</p></li><li><p><strong>Built and shipped solo in under 30 days</strong></p></li><li><p><strong>Zero traditional dev process.</strong> Lovable, Supabase, and a clear PRD.</p></li><li><p><strong>Guest access credits</strong> adopted by the majority of active workspaces</p></li></ul><p>The metric I watch most is not signups. It is the number of workspaces that have at least one active collaborator. That number tells me whether the coordination layer is actually working, or whether people are using DraftKit as a solo writing tool. The data says the collaboration model is landing.</p><div><hr></div><h2>Who DraftKit Is For</h2><p>DraftKit is built for:</p><ul><li><p>&#9989; Substack writers who run guest post programs</p></li><li><p>&#9989; Newsletters with a co-author or editorial collaborator</p></li><li><p>&#9989; Solo creators managing content contributions from their community</p></li><li><p>&#9989; Writers who need async feedback without forcing collaborators onto another platform</p></li></ul><p>DraftKit is not the right tool if you are a solo writer with no external collaborators. It is also not a full editorial project management platform. It is a focused async collaboration workspace, and that focus is intentional.</p><div><hr></div><h2>The Technical Layer That Makes It Work</h2><p>Supabase handles the auth and the database. Every draft, comment, and workspace state is persisted in real time. Resend manages the transactional email layer: invites, notifications, and workspace activity summaries. Stripe handles the credit system cleanly without requiring a custom billing build.</p><p><strong>The architecture is intentionally boring, which is why it works.</strong> There are no clever custom solutions where a standard tool does the job. Every technical decision prioritized reliability over novelty.</p><div class="callout-block" data-callout="true"><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;3d1ae18f-5dac-49b4-8365-fd5a0bcd3bcd&quot;,&quot;caption&quot;:&quot;Every collaboration on DraftKit is a single row in one table. That decision made everything else easier. The collab_requests table is the core entity, and every feature, from guest access to workspace permissions to metrics, flows through it. Here is exactly how I designed it and why.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;DraftKit: The Database Schema Behind a Collaboration Product&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:31598723,&quot;name&quot;:&quot;Elena | AI Product Leader&quot;,&quot;bio&quot;:&quot;AI Product Manager turned builder. Founder of DraftKit.app, AIAdventChallenge.com. I stopped asking for permission and now I lead through evidence. Published book author. Trusted by Reforge.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!RnEf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad6b36c8-e5a6-4820-b875-e7165528aae9_3000x3000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-18T21:17:50.056Z&quot;,&quot;cover_image&quot;:null,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://promptledproduct.substack.com/p/draftkit-the-database-schema-behind&quot;,&quot;section_name&quot;:&quot;DraftKit&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:198324989,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1252952,&quot;publication_name&quot;:&quot;Prompt-Led Product | For PMs Building in the AI Era&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!moXs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979d931d-85f5-465b-8fc3-1fbc518f5319_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></div><p></p><h2>Try DraftKit</h2><p>If you run a Substack with guest contributors, collaborators, or co-authors, DraftKit removes the coordination overhead that was never supposed to be your job.</p><p><strong><a href="https://draftkit.app/">Try DraftKit at draftkit.app</a></strong></p><p>If you want to talk about the product decisions behind the build, or if you are auditing a similar collaboration tool and want a second set of eyes, <a href="https://promptledproduct.com/audits">book a product audit at promptledproduct.com/audits</a>.</p>]]></content:encoded></item><item><title><![CDATA[DraftKit: How SMART Match and SMART Draft Work]]></title><description><![CDATA[Most collaboration tools stop at the introduction.]]></description><link>https://promptledproduct.substack.com/p/draftkit-how-smart-match-and-smart</link><guid isPermaLink="false">https://promptledproduct.substack.com/p/draftkit-how-smart-match-and-smart</guid><dc:creator><![CDATA[Elena | AI Product Leader]]></dc:creator><pubDate>Mon, 18 May 2026 21:22:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!moXs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979d931d-85f5-465b-8fc3-1fbc518f5319_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most collaboration tools stop at the introduction. They help you find someone, exchange contact info, and then leave you with a blank document and the vague pressure of a shared deadline.</p><blockquote><p><strong>DraftKit has two AI features that pick up exactly where that blank document problem starts: SMART Match surfaces what you should write together before you commit, and SMART Draft builds the first structured outline after you do.</strong></p></blockquote><p>Here is exactly how both work under the hood.</p><div><hr></div><h2>SMART Match: AI Before the Commitment</h2><p>SMART Match runs on the public booking page. When someone visits your DraftKit profile and enters their Substack URL into the collaboration request form, the AI kicks in before they even hit submit.</p><p>The <code>analyze-collab-match</code> edge function fires as soon as the URL is entered. It fetches the RSS feeds from both newsletters: yours and your potential collaborator&#8217;s. It sends both content libraries to the AI through the Lovable AI Gateway, which routes through Google Gemini and OpenAI models depending on load. </p><blockquote><p><strong>The function returns three specific collaboration topic ideas, each with a format recommendation and the source articles it used to generate the suggestion.</strong></p></blockquote><p>A typical result looks like this: a topic, a one-sentence explanation of why it works given both audiences, a suggested format (co-written article, interview, newsletter shoutout), and pointers to the specific posts from both newsletters that informed the suggestion.</p><div><hr></div><h2>Why RSS Feeds and Not Something Fancier</h2><p>I could have built a richer content analysis layer. Profile scraping, engagement data, subscriber overlap estimates. I did not, for two reasons.</p><p>First, RSS feeds are public and reliable. Every Substack publication has one. The content is clean, structured, and requires no authentication. I do not need to scrape anything or handle authentication failures.</p><p>Second, <strong>topic matching based on what someone has actually written is more useful than matching based on anything else.</strong> If someone has published 12 posts about AI tooling and you have published 8 posts about product strategy, the overlap is obvious from the text. No engagement data needed.</p><p>The rate limiting reflects the cost model. Unauthenticated visitors get 10 SMART Match requests per hour. Authenticated users get 50. That is enough for real usage and keeps the edge function budget manageable.</p><div><hr></div><h2>SMART Draft: The AI Layer After the Yes</h2><p>SMART Match happens before a collaboration is confirmed. SMART Draft happens after.</p><p>When a host approves a collaboration request, they can trigger a first draft through the <code>generate-collab-draft</code> edge function. The function does three things:</p><ul><li><p>&#9989; Fetches RSS content from both participants&#8217; newsletters</p></li><li><p>&#9989; Combines the content with the collaboration context: the type of collab, the date, any message the requester included</p></li><li><p>&#9989; Returns a structured draft object, not freeform prose</p></li></ul><p>The returned draft is not a finished article. <strong>It is a scaffolded outline with a title, a hook, an ordered section breakdown with contributor assignments per section, talking points for each section, format suggestions, tone notes, and an estimated read time.</strong> The host reviews it in the workspace sidebar and decides whether to apply it to the editor.</p><div><hr></div><h2>The Re-Apply Guard</h2><p>This is the detail I am most glad I built. The first version of SMART Draft had a straightforward &#8220;Apply to Workspace&#8221; button. Click it, the draft populates the editor, done.</p><p>The problem is what happens on the second click. If you have applied a draft, made edits, written two paragraphs of real content, and then accidentally click &#8220;Apply&#8221; again, you lose everything you wrote.</p><p><strong>The re-apply guard prevents that.</strong> After a draft is applied for the first time, the button becomes a confirmation step. A prompt tells you that the workspace has been edited since the draft was last applied and asks you to confirm before proceeding. The re-inject only happens on explicit confirmation. Manual edits are never overwritten silently.</p><p>This was a bug I caught before it became a support ticket. Building the guard took less than an hour. Not building it would have cost someone a draft they could not recover.</p><div><hr></div><h2>No API Key Required</h2><p>Both AI features run through the Lovable AI Gateway. This is worth explaining because it is a meaningful architectural choice.</p><p>Most AI product builds require you to manage your own API keys: OpenAI, Anthropic, Google. You handle authentication, rate limits, billing, and model selection. The Lovable AI Gateway abstracts all of that. The edge functions call the gateway endpoint with no external API key required.</p><p><strong>The tradeoff is reduced model control.</strong> I am not selecting a specific model version or tuning temperature settings. For content matching and first-draft generation, that tradeoff is fine. The quality is consistent and the operational overhead is near zero.</p><p>If I ever need more control over the AI layer, the gateway is a single abstraction point to replace. One edge function to update, not a dozen places where API keys and model names are scattered.</p><div><hr></div><h2>What SMART Draft Does Not Replace</h2><p>SMART Draft is not a ghostwriter. It is scaffolding.</p><p>The output is useful because it solves the specific problem of starting a collaborative document from scratch. Two writers, one blank editor, and the implicit question of who writes what. The draft answers that question with section assignments and talking points. Both parties know where to start.</p><p>The writing is still yours. The SMART Draft is a starting structure, not a finished article. In practice, most collaborations that use SMART Draft end up with content that looks nothing like the original draft by the time it is published. <strong>That is exactly what it is supposed to do: reduce the friction of starting without replacing the work of finishing.</strong></p><div><hr></div><h2>The Storage Model</h2><p>SMART Draft outputs are stored as JSON in <code>collab_requests.ai_draft</code>. The field preserves the full structured draft independently of the workspace content. If the host applies the draft and then the collaborator rewrites everything, the original SMART Draft is still in the database.</p><p>This matters for two reasons. First, it gives me product intelligence on which SMART Draft suggestions actually made it into published collaborations. Second, it means the draft can always be re-applied or reviewed from the sidebar without regenerating it.</p><p>The <code>ai_suggestion_used</code> field tracks which elements of the SMART Match output the collaborator actually included in their request form. That data feeds back into improving the matching logic over time.</p><div><hr></div><h2>Try DraftKit</h2><p>SMART Match and SMART Draft are live on every DraftKit account. <strong><a href="https://draftkit.app/">Try them at draftkit.app</a></strong></p><p>If you are building AI features into a collaboration product and want a review of your AI interaction design before launch, <a href="https://promptledproduct.com/audits">book a product audit at promptledproduct.com/audits</a>.</p>]]></content:encoded></item><item><title><![CDATA[DraftKit: The Assumption I Had Wrong About My Own Product]]></title><description><![CDATA[Before I wrote the first line of code, I had a clear picture of what DraftKit would be.]]></description><link>https://promptledproduct.substack.com/p/draftkit-the-assumption-i-had-wrong</link><guid isPermaLink="false">https://promptledproduct.substack.com/p/draftkit-the-assumption-i-had-wrong</guid><dc:creator><![CDATA[Elena | AI Product Leader]]></dc:creator><pubDate>Mon, 18 May 2026 21:20:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!moXs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979d931d-85f5-465b-8fc3-1fbc518f5319_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before I wrote the first line of code, I had a clear picture of what DraftKit would be. A coordination tool for Substack writers, built around a calendar. </p><p>Writers would book dates, manage their collaboration schedule, and the calendar would be the thing that made them pay. </p><p>I was wrong about the most important part. </p><p><strong>The writing workspace, the place where the actual draft lives, turned out to be where users spent all their time.</strong> </p><p>The calendar is still in the product, but it is not the reason people stay.</p><div><hr></div><h2>The Feature I Built That Nobody Wanted</h2><p>The original DraftKit roadmap included a feature I was genuinely excited about: Virtual Coffee. The idea was a lightweight 1:1 meeting type, a way for writers to have a short call to explore a potential collaboration before committing to anything.</p><p>I built it. It shipped. And it sat there.</p><p><strong>Nobody was booking Virtual Coffees.</strong> The writers using DraftKit were not looking for another meeting on their calendar. They wanted to skip the discovery call entirely and get straight to the draft. The async-first model, where someone submits a collaboration request, gets approved, and both parties start writing immediately without a live call, was what actually matched how they worked.</p><p>I removed Virtual Coffee from the collaboration types. That was the easy decision. The harder one came when I looked at the calendar data.</p><div><hr></div><h2>What the Calendar Actually Is</h2><p>Here is what I expected: the calendar would be the thing people paid for. Manage your editorial schedule, see your booked collaborations, plan your publishing cadence. That would be the hero feature.</p><p>Here is what actually happened: users opened the calendar to check their availability, approved or declined requests, and then spent the rest of their time in the workspace editor.</p><p>The calendar did not lose its purpose. It still does something real: it shows available dates on your public booking page, prevents double-booking, and gives both parties a shared reference point for when a collaboration is due. <strong>Those are necessary functions, and I kept them.</strong> But the calendar is not why DraftKit is worth using. It is infrastructure, not a destination.</p><p>This is a distinction that matters when you are building. A feature can be necessary without being valuable. Necessary means the product breaks without it. Valuable means users actively choose to engage with it. The calendar falls into the first category. The workspace is firmly in the second.</p><div><hr></div><h2>The Decision That Changed the Product Direction</h2><p>When it became clear the workspace was the real product, I had two choices. Keep building calendar features on the assumption that usage would follow, or redirect that energy toward the workspace.</p><p>I redirected. The workspace got tables. It got sticky highlights for inline async annotations. It got long-form scaling to handle drafts up to 50,000 words. It got a real-time presence system. It got a SMART Draft generator that pulls RSS feeds from both writers and generates a structured first draft with section assignments.</p><p><strong>Every one of those decisions came from watching what users were actually doing instead of what I assumed they would do.</strong> None of them were on the original roadmap.</p><div><hr></div><h2>The Guest Access Model Came From the Same Observation</h2><p>The credit-based guest access model was also an assumption I had to update. My original thinking was that both parties in a collaboration would need a DraftKit account. That seems reasonable until you watch what happens: the writer with the account invites a collaborator, the collaborator hits a signup wall, and the original user abandons the tool because they are not going to ask their guest to sign up for something new.</p><p>I had seen this pattern in other tools. Writers were using Google Docs not because Google Docs is better for collaboration, but because Google Docs does not make you pay to leave a comment.</p><p>The solution was the Host-Pays credit model. The creator who owns the workspace spends one credit when they approve a collaboration. Their collaborators get full workspace access without a subscription. <strong>The person who is already bought in covers the cost. The guest never hits a wall.</strong></p><p>That single decision is visible in the product metrics. The majority of active workspaces have at least one collaborator who does not have a paid DraftKit subscription.</p><div><hr></div><h2>What I Would Do Differently</h2><p>The honest answer is: I would have watched the first ten users more closely before building anything past the core collaboration request flow.</p><p>I shipped fast. Under 30 days from first prompt to live product. That speed was real and it was valuable, but it meant I built a full calendar management system before I had confirmed evidence that calendar management was the problem people needed solved.</p><p>The Virtual Coffee feature cost maybe three days of build time. The rethinking of what the product actually was cost nothing in build time but required accepting that my original product vision was partially wrong.</p><p><strong>The willingness to call a feature unnecessary, even one you shipped, is more valuable than any specific technical skill.</strong> I cut Virtual Coffee. I repositioned the calendar as infrastructure. I put everything into the workspace. The product is better for all three decisions.</p><div><hr></div><h2>What DraftKit Is Now</h2><p>DraftKit is a writing workspace for Substack writers who collaborate. The calendar is how you manage availability and scheduling. The workspace is where the actual work happens.</p><p>The collaboration types that perform well in practice are all async-first: Async Drafting, Guest Post Exchange, Interview Style, Co-written Article. These are formats where writers need a shared editing environment, not a meeting.</p><p>The product does one thing better than anything else: it puts the draft and the collaboration in the same place so writers do not have to manage them separately.</p><div><hr></div><h2>Try DraftKit</h2><p>If you run a newsletter and you work with guest contributors, co-authors, or interview subjects, DraftKit removes the coordination overhead that was never supposed to be your job.</p><p><strong><a href="https://draftkit.app/">Try DraftKit at draftkit.app</a></strong></p><p>If you are building a similar tool and want a second opinion on your feature prioritization before you build the wrong thing, <a href="https://promptledproduct.com/audits">book a product audit at promptledproduct.com/audits</a>.</p>]]></content:encoded></item><item><title><![CDATA[DraftKit: The Database Schema Behind a Collaboration Product]]></title><description><![CDATA[Every collaboration on DraftKit is a single row in one table.]]></description><link>https://promptledproduct.substack.com/p/draftkit-the-database-schema-behind</link><guid isPermaLink="false">https://promptledproduct.substack.com/p/draftkit-the-database-schema-behind</guid><dc:creator><![CDATA[Elena | AI Product Leader]]></dc:creator><pubDate>Mon, 18 May 2026 21:17:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!moXs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979d931d-85f5-465b-8fc3-1fbc518f5319_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every collaboration on DraftKit is a single row in one table. That decision made everything else easier. </p><p><strong>The </strong><code>collab_requests</code><strong> table is the core entity, and every feature, from guest access to workspace permissions to metrics, flows through it.</strong> </p><p>Here is exactly how I designed it and why.</p><div><hr></div><h2>Why One Table Handles the Whole Lifecycle</h2><p>When I started designing the schema, the obvious instinct was to split things up. A <code>workspaces</code> table, a separate <code>collaborations</code> table, a <code>drafts</code> table. That would have been three tables to keep in sync, three places for a status to get out of sync, and three surfaces for an RLS policy to go wrong.</p><p>I chose a different approach. Every collaboration, whether it is an inbound guest post request, an outgoing proposal, or a solo draft someone created with the &#8220;Start Writing&#8221; button, is a row in <code>collab_requests</code>. <strong>The </strong><code>status</code><strong> field does all the state management:</strong> <code>pending</code> when someone submits a request, <code>approved</code> when the host accepts, <code>published</code> when the collab goes live, and <code>cancelled</code> when it falls through.</p><p>The shared workspace editor content lives directly in <code>collab_requests.shared_content</code> as sanitized HTML. There is no separate drafts table. The workspace is not a separate entity. It is a view into the state of a single row.</p><div><hr></div><h2>The Fields That Drive the Core Product</h2><p>The table has fields most collaboration tools would put in three separate tables. Here is what matters most and why each field exists:</p><ul><li><p>&#9989; <code>is_solo</code> (boolean) &#8212; when a creator hits &#8220;Start Writing&#8221; and opens a blank workspace with no collaborator, it creates a <code>collab_request</code> with <code>is_solo: true</code> and <code>status: 'approved'</code>. Solo drafts use the exact same workspace, the same editor, the same RLS policies. No special-casing anywhere.</p></li><li><p>&#9989; <code>shared_content</code> (HTML) &#8212; the live draft text. DOMPurify-sanitized on every save, with a tag whitelist that allows tables, images, and sticky highlights but blocks everything else. No base64 images, ever: the sanitizer strips them.</p></li><li><p>&#9989; <code>ai_draft</code> (JSON) &#8212; the SMART-generated first draft, stored separately from the live content. Hosts can generate it, preview it, and apply it to the workspace. A re-apply guard checks for manual edits before overwriting.</p></li><li><p>&#9989; <code>editing_sessions</code> (JSON array) &#8212; tracks who edited, when, and for how long. Not for billing. For product intelligence: which workspaces are actually being used versus opened once and abandoned.</p></li><li><p>&#9989; <code>content_last_edited_by</code><strong> / </strong><code>content_last_edited_at</code> &#8212; presence-aware fields that power the &#8220;someone else is editing&#8221; indicator without needing a separate real-time table.</p></li></ul><div><hr></div><h2>The Credit Model Lives in the Schema</h2><p>DraftKit runs on a Host-Pays credit model. The host spends one credit when they approve a collaboration or create a solo workspace. Guests never pay.</p><p><strong>That logic is enforced at the database level, not just the application layer.</strong> The <code>creators</code> table has a <code>credits</code> column defaulting to 3. The <code>get_host_capacity()</code> RPC returns the current available balance including referral bonuses. When a host approves a request, the credit deduction happens server-side before the status update.</p><p>Pro users bypass this entirely. <code>is_pro_user(user_id)</code> checks three conditions: the <code>user_roles</code> table for a <code>pro</code> role, the <code>creators.subscription_tier</code> column, and an active trial window. If any of those is true, no credit is deducted. A Founding Member who cancels their Stripe subscription still has the <code>pro</code> role in <code>user_roles</code>, so their access survives the cancellation.</p><div><hr></div><h2>The RLS Architecture</h2><p>Row-Level Security is the enforcement layer for every permission decision in DraftKit. Here is the actual policy logic, not a simplified summary:</p><p>Anonymous users can INSERT a <code>collab_request</code> with <code>status = 'pending'</code>. That is what makes the public booking page work without auth. But they cannot SELECT anything. A guest filling out a booking form on <code>draftkit.app/elena</code> has zero read access to the database.</p><p>Once a collaboration is approved, access opens up through a single helper function: <code>has_workspace_access(user_id, request_id)</code>. This function checks three conditions: is the user the host creator, is the user the original requester, or is the user listed in <code>workspace_collaborators</code> for that request. If any of those is true, the user gets full read and write access to the workspace.</p><p><strong>The host-only restriction on Writer&#8217;s Room invitations is also enforced at the RLS level.</strong> Only the request owner can INSERT into <code>workspace_collaborators</code>. A collaborator who has been invited cannot invite additional people. That is &#8220;Host Home Court Advantage&#8221; and it is a policy, not a UI constraint.</p><div><hr></div><h2>The Permanent Access Rule</h2><p>One of the most important schema decisions I made was around access persistence. Once a host spends a credit to unlock a workspace, that access is permanent. Downgrading from Pro to free does not lock anyone out of past work. Cancelling a subscription does not revoke access to approved collaborations.</p><p>This is intentional. <strong>Credits are an entry toll, not a recurring subscription.</strong> The <code>has_workspace_access()</code> function does not check current plan status. It checks whether the workspace was ever properly unlocked. That is a one-time event recorded in the <code>collab_requests</code> row itself.</p><p>The practical implication: if you approved a collaboration six months ago and then downgraded to free, you and your collaborator still have full access to that workspace. The credit was spent. The workspace is yours.</p><div><hr></div><h2>What the Supporting Tables Do</h2><p>The core <code>collab_requests</code> table is not the whole picture. A few supporting tables handle the pieces that would otherwise bloat the main row:</p><ul><li><p>&#9989; <code>workspace_collaborators</code> &#8212; multi-guest support (the Writer&#8217;s Room). Stores email, user_id, role, and join timestamp per invited collaborator. RLS-gated so only the host can insert.</p></li><li><p>&#9989; <code>workspace_presence</code> &#8212; real-time presence indicators. Heartbeat polling updates <code>last_active_at</code> per user. Shows the green dot in the Writer&#8217;s Room sidebar.</p></li><li><p>&#9989; <code>collab_metrics</code> &#8212; post-publication engagement snapshots. After a collaboration is marked &#8220;Published&#8221;, both parties enter their Substack post URLs and the metrics edge function pulls likes, comments, and subscriber counts. Stored as snapshots so the data is preserved even if the Substack post is later edited.</p></li><li><p>&#9989; <code>collaboration_messages</code> &#8212; the threaded conversation feed inside the workspace. Free users see the most recent message; older messages are gated behind Pro. The blurring is applied client-side but the data access is controlled server-side.</p></li></ul><div><hr></div><h2>The Decision I Would Make the Same Way Again</h2><p>Some product decisions feel uncertain for a long time. This one does not. <strong>Treating the workspace as a state on the collaboration row, rather than a separate entity, is the right architecture for this product.</strong></p><p>It means every historical collaboration is fully queryable from a single table. It means the analytics RPC is straightforward. It means there is one source of truth for status, access, content, and metrics.</p><p>If you are building a collaboration product and you are debating whether to separate the &#8220;workspace&#8221; from the &#8220;collaboration,&#8221; my answer is: do not, until you have a specific technical reason that forces the separation.</p><div><hr></div><h2>Try DraftKit</h2><p>The full collaboration infrastructure is live at <strong><a href="https://draftkit.app/">draftkit.app</a></strong>.</p><p>If you are building a similar product and want a technical review of your data model and access architecture, <a href="https://promptledproduct.com/audits">book a product audit at promptledproduct.com/audits</a>.</p>]]></content:encoded></item></channel></rss>