<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Devin D</title>
    <description>The latest articles on DEV Community by Devin D (@devin_daymore).</description>
    <link>https://dev.to/devin_daymore</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980721%2F2e97da6e-0a43-447a-b18a-25a49a046dc5.jpg</url>
      <title>DEV Community: Devin D</title>
      <link>https://dev.to/devin_daymore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devin_daymore"/>
    <language>en</language>
    <item>
      <title>Pre-launch waitlist tools in 2026, compared</title>
      <dc:creator>Devin D</dc:creator>
      <pubDate>Fri, 14 Aug 2026 14:50:09 +0000</pubDate>
      <link>https://dev.to/devin_daymore/pre-launch-waitlist-tools-in-2026-compared-3kp1</link>
      <guid>https://dev.to/devin_daymore/pre-launch-waitlist-tools-in-2026-compared-3kp1</guid>
      <description>&lt;p&gt;I make Waitlister, one of the tools below. Read this with that in mind.&lt;/p&gt;

&lt;p&gt;I wrote it anyway because the roundups I found disagreed with each other on basic facts. Three of them listed three different starting prices for the same product. So where I could check something myself I did, and where I couldn't I say so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hate subscriptions, fixed launch window: &lt;strong&gt;LaunchList&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Want a real free plan, referrals, email tools: &lt;strong&gt;Waitlister&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Minimal widget, live in ten minutes, have a budget: &lt;strong&gt;GetWaitlist&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Running a contest or sweepstakes: &lt;strong&gt;KickoffLabs&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest is why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The table
&lt;/h2&gt;

&lt;p&gt;Alphabetical, so the running order isn't an opinion.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Starting price&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Referrals&lt;/th&gt;
&lt;th&gt;Public API&lt;/th&gt;
&lt;th&gt;First-party SDK&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GetWaitlist&lt;/td&gt;
&lt;td&gt;$15/mo&lt;/td&gt;
&lt;td&gt;Closed to new accounts&lt;/td&gt;
&lt;td&gt;Yes, $15 plan&lt;/td&gt;
&lt;td&gt;Yes, unauthenticated&lt;/td&gt;
&lt;td&gt;None found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GrowSurf&lt;/td&gt;
&lt;td&gt;$125/mo&lt;/td&gt;
&lt;td&gt;14-day trial&lt;/td&gt;
&lt;td&gt;Yes, core product&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;npm + PyPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KickoffLabs&lt;/td&gt;
&lt;td&gt;$19/mo&lt;/td&gt;
&lt;td&gt;Yes, 100 uniques/mo&lt;/td&gt;
&lt;td&gt;Yes, plus contests&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;None found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LaunchList&lt;/td&gt;
&lt;td&gt;$19 one-time&lt;/td&gt;
&lt;td&gt;Yes, 100 submissions&lt;/td&gt;
&lt;td&gt;Yes, on free tier&lt;/td&gt;
&lt;td&gt;None found&lt;/td&gt;
&lt;td&gt;None found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefinery&lt;/td&gt;
&lt;td&gt;$49/mo&lt;/td&gt;
&lt;td&gt;14-day trial&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;None found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Viral Loops&lt;/td&gt;
&lt;td&gt;$49/mo&lt;/td&gt;
&lt;td&gt;14-day trial&lt;/td&gt;
&lt;td&gt;Yes, core feature&lt;/td&gt;
&lt;td&gt;Yes, 16 endpoints&lt;/td&gt;
&lt;td&gt;Unverifiable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Waitlister&lt;/td&gt;
&lt;td&gt;$19/mo&lt;/td&gt;
&lt;td&gt;Yes, 100 subscribers&lt;/td&gt;
&lt;td&gt;Yes, $19 plan&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One note on that free-tier column. Three of these have a free plan rather than a trial: KickoffLabs, LaunchList and Waitlister. The rest give you 14 days and then stop, and GetWaitlist's free tier is closed to accounts created after June 12, 2025. When you're still validating, that difference matters more than the headline price.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GetWaitlist
&lt;/h3&gt;

&lt;p&gt;The pitch is fast setup. Embed a widget, collect emails, track referrals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; $15/mo Basic, $50/mo Advanced, $250/mo Pro. No free tier for accounts created after June 12, 2025.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest:&lt;/strong&gt; simplicity, and an unusual developer surface. The documented API needs no authentication at all. I fetched a live waitlist as JSON with no credentials. Their docs say a much larger authenticated API exists, mostly undocumented, and to ask if you need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest weakness:&lt;/strong&gt; the free tier is closed to new accounts, so the cheapest way in is $15/mo. Sending from your own domain is gated to the $250 plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GrowSurf
&lt;/h3&gt;

&lt;p&gt;A referral program tool that people sometimes use as a waitlist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; $125/mo Startup, $314/mo Business, custom above. 14-day trial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest:&lt;/strong&gt; the in-product referral experience. A user's share link is generated the moment they log in, with no separate signup. It also has the most complete developer surface in this list, mine included: an OpenAPI 3.1 spec, official SDKs on npm and PyPI, seven documented webhook events, and an MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest weakness:&lt;/strong&gt; it isn't built for pre-launch. No landing page builder, no queue position, no move-up-by-referring mechanic. If you want a viral waitlist for an unlaunched product this is the wrong shape of tool, and the entry plan is several times the cost of the pre-launch options.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  KickoffLabs
&lt;/h3&gt;

&lt;p&gt;The contest and sweepstakes specialist. Refer-five-friends-to-win mechanics, points leaderboards, compliant giveaways.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; free plan (100 uniques/mo, branded). Hobby $19, Premium $69, Business $145, Enterprise $289, roughly 30% less annually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest:&lt;/strong&gt; contest mechanics and fraud detection. If you want to run a sweepstakes, this is the one. Twelve documented outbound webhook events, with per-plan rate limits published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest weakness:&lt;/strong&gt; heavier than a plain waitlist tool. Multi-language means duplicating a campaign per language and translating the strings yourself. Its &lt;code&gt;llms.txt&lt;/code&gt; doesn't mention the API, so an agent reading that file first won't find it, though the API itself is documented.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  LaunchList
&lt;/h3&gt;

&lt;p&gt;The pitch is the pricing model: pay once, no subscription. For a two or three month launch window that's a better deal than paying monthly forever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; free tier (100 submissions, referrals, fraud detection). One-time per campaign: $19 for 500 submissions, $79 for 10,000, custom above 100,000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest:&lt;/strong&gt; one-time pricing, and a free tier that includes referrals and fraud detection. Embeddable widget for the no-code platforms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest weakness:&lt;/strong&gt; fewer features than the subscription tools. No email broadcast system, so bring your own ESP. Simpler hosted pages. And if you want to drive it from code, I could not find an API: their docs sitemap lists thirty-six pages and none of them is an API page. Webhooks exist through a plugin on the Grow plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prefinery
&lt;/h3&gt;

&lt;p&gt;Running since 2007, longer than most of this category has existed. Enterprise SLAs, deep API, many custom fields per subscriber, staged beta rollouts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; $49/mo Lite, $249/mo Essentials, $499/mo Pro month-to-month; $39/$199/$399 billed semiannually. 14-day trial, no free plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest:&lt;/strong&gt; maturity and flexibility. If you can describe a waitlist mechanic you can probably build it here. Eighteen documented webhook events covering the full tester lifecycle, the most of anyone in this list. Its pricing table is also unusually explicit that API and webhooks are excluded from the entry plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest weakness:&lt;/strong&gt; the interface shows its age and setup is slow. For a founder who wants a good-looking waitlist page and a leaderboard by tonight, it's overkill, and $49 is a steep entry for validating an idea.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Viral Loops
&lt;/h3&gt;

&lt;p&gt;The referral-template platform. Pick a template modeled on a famous launch, add your copy, run it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; billed annually, $35/mo Start-up through $279/mo Power. Month-to-month is higher. 14-day trial, no free plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest:&lt;/strong&gt; the template library. You start from a mechanic that already worked rather than from zero. Sixteen documented API endpoints with per-endpoint rate limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest weakness:&lt;/strong&gt; no free plan. I also could not verify what's gated to which plan: their pricing page returns 403 to automated requests, and their &lt;code&gt;openapi.json&lt;/code&gt; returns 403 rather than 404. There's a &lt;code&gt;@viral-loops/widgets&lt;/code&gt; package on npm last published in 2022 with no repository or homepage, and I found no vendor page linking to it, so I won't call it first-party.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Waitlister
&lt;/h3&gt;

&lt;p&gt;Hosted landing pages, embeddable forms, referral program, email broadcasts, custom domains, webhooks and a REST API, plus native embeds for Framer, Webflow, WordPress, Shopify, Squarespace and Bubble among others.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free (100 subscribers, 1 waitlist). $19 Launch (unlimited subscribers, referrals, 2,500 emails/mo). $29 Pro (custom domain, advanced analytics). $49 Growth (custom email domain, 30+ translations, referral fraud detection). $129 Business (team seats).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest:&lt;/strong&gt; the free tier is a plan rather than a trial, and $19 gets you unlimited subscribers, referrals and email broadcasts in one place. Several tools here expect you to bring your own ESP for that last part. On the developer side there's an OpenAPI 3.0.3 spec at waitlister.me/openapi.json, an npm SDK, and an MCP server listed in the official MCP registry. Appending .md to any docs URL returns raw markdown, which is useful if you point an agent at it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest weakness:&lt;/strong&gt; It's much younger than some other options. And for a referral program that lives inside your product for years, GrowSurf is the right shape.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to pick
&lt;/h2&gt;

&lt;p&gt;Start with whether you're validating or launching. If you're validating, pick something with a real free plan so you don't pay for a test that may go nowhere. If you're launching and budget isn't the constraint, the question becomes campaign shape instead.&lt;/p&gt;

&lt;p&gt;Then the shape. A pre-launch queue with referrals, a contest, and an ongoing in-product referral program are three different products, and forcing one tool into another's job is what makes people hate their tooling.&lt;/p&gt;

&lt;p&gt;Solo founder or small team: start free somewhere and pay when you hit the thing you actually need, whether that's referrals, a custom domain, your own sending domain, or translations. Enterprise, contests, or a long-term referral engine inside your app: pick the specialist.&lt;/p&gt;

&lt;p&gt;Everything above is checkable, and some of it will be wrong within a month. If you find something that already is, say so and I'll correct it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>startup</category>
    </item>
    <item>
      <title>I made my SaaS installable by AI agents. Here's what was broken.</title>
      <dc:creator>Devin D</dc:creator>
      <pubDate>Fri, 14 Aug 2026 09:18:10 +0000</pubDate>
      <link>https://dev.to/devin_daymore/i-made-my-saas-installable-by-ai-agents-heres-what-was-broken-3c17</link>
      <guid>https://dev.to/devin_daymore/i-made-my-saas-installable-by-ai-agents-heres-what-was-broken-3c17</guid>
      <description>&lt;p&gt;Two weeks ago I watched an agent run a full product launch on Waitlister, my waitlist tool.&lt;/p&gt;

&lt;p&gt;It created the waitlist, generated and published a landing page, signed up a test address, checked the signup was real by fetching the public page unauthenticated, then unpublished and deleted everything it had made.&lt;/p&gt;

&lt;p&gt;Nobody touched the dashboard.&lt;/p&gt;

&lt;p&gt;The interesting part isn't that run. It's what I found while getting there, because almost none of it was visible from a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I bothered
&lt;/h2&gt;

&lt;p&gt;My users are pre-launch founders, which is exactly the group now building landing pages by prompting Claude, Cursor, or v0 instead of opening a site builder. "Add a waitlist to my site" is a normal thing to ask an agent to do, and increasingly nobody types my product name at all.&lt;/p&gt;

&lt;p&gt;The uncomfortable part is when an agent hits a 404 or installs a package that doesn't exist, it doesn't debug. It picks a different tool in the next sentence and never tells the user it switched. You lose without ever seeing a bounce.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I shipped, in order of how much it turned out to matter
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full API coverage for the whole job.&lt;/strong&gt; Not most of it. More below, because this one was worth the other five combined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A &lt;code&gt;skill.md&lt;/code&gt; route.&lt;/strong&gt; One page written for an agent rather than a person: a decision tree (no API key yet, go this way; account key, go that way), both code paths, and a self-check at the end so the agent can confirm it worked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An OpenAPI spec at a fixed URL.&lt;/strong&gt; Valid 3.0.3 at &lt;code&gt;/openapi.json&lt;/code&gt;, all five endpoints, auth, rate limits, error shapes. Endpoint changes update the spec and the SDK types in the same PR or they don't merge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real npm SDK&lt;/strong&gt;, plus four aliases under the names an agent is likely to reach for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An MCP server&lt;/strong&gt;, 14 tools, so agents that speak MCP get typed calls instead of reading my docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;llms.txt&lt;/code&gt; and &lt;code&gt;llms-full.txt&lt;/code&gt;&lt;/strong&gt;, an index of the docs in plain text with a short block at the top saying what this product is and where the golden path starts.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What was broken
&lt;/h2&gt;

&lt;p&gt;Honest list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The file I wrote for agents was the one file agents couldn't read.&lt;/strong&gt; My &lt;code&gt;llms.txt&lt;/code&gt; is proxied from a vendor, the proxy forwards the caller's user-agent, and the vendor had AI-bot blocking switched on by default. Every AI crawler got a 403 on the document whose only purpose is being read by AI&lt;br&gt;
crawlers. I found it by requesting my own files with eight bot user-agents and diffing the status codes. One vendor toggle can put it back, silently, which is why the check now runs on a schedule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;llms-full.txt&lt;/code&gt; is too big to be read at answer time.&lt;/strong&gt; It's 961 KB and grows with every docs page. It serves from my side in about 1.3 seconds, and Claude's answer-time fetcher still timed out on it at 60 seconds. The small index is the one that actually gets read. I haven't fixed this yet;&lt;br&gt;
the options are trimming it or splitting it, and I've done neither.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents guess your package name.&lt;/strong&gt; &lt;code&gt;waitlister-js&lt;/code&gt;, &lt;code&gt;waitlister-sdk&lt;/code&gt;, &lt;code&gt;waitlister-node&lt;/code&gt;, &lt;code&gt;@waitlister/sdk&lt;/code&gt;. Instead of arguing with that, I published all four as real packages that re-export the SDK and carry a deprecation notice pointing at the canonical name. A wrong guess installs and self-corrects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My email validator rejected valid addresses.&lt;/strong&gt; Agents test with plus-tags, because that's how you make a disposable address on an account you already own. My validator refused some of them. Human users with Gmail aliases had been hitting the same wall for as long as the rule existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My 404s weren't 404s.&lt;/strong&gt; Unknown doc slugs returned a soft page with a 200. An agent reading status codes concludes the page exists and that it guessed the URL right, then builds on it. Real 404s, plus a 301 from the old getting-started URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The single page that would have saved five fetches was labeled for the wrong reader.&lt;/strong&gt; In the first live test the agent's own friction report said the docs were split across pages with no single page giving the complete picture, so it fetched five. &lt;code&gt;skill.md&lt;/code&gt; is that page, and &lt;code&gt;/docs/api&lt;/code&gt; linked to it in a callout at the very top. The callout was headed "Integrating with an AI agent," which is a label about &lt;em&gt;who it's for&lt;/em&gt;, and the agent was reading through a fetch-summarizer where that reads as a sidebar. Reframed as "Fastest path: complete single-page integration guide," it started landing. The link was never missing. It was filed under the wrong thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every run used to die at the same sentence.&lt;/strong&gt; The agent could create a waitlist through the API and then had to say "now open the dashboard to build your landing page." That one gap ended the automated path every time, no matter how good the rest of the surface was. Creating, updating, and publishing a landing page over the API is what made an end-to-end run possible at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one thing I'd tell someone starting this
&lt;/h2&gt;

&lt;p&gt;Test with the real fetchers, not with curl. Every failure above lived in the gap between what my server sends and what an agent's toolchain actually receives: a user-agent rewritten in transit, a file that serves fine but times out at answer time, a status code that lies, a link that survives the fetch but not the summary. Curl told me everything was fine. It was, for curl.&lt;/p&gt;

&lt;p&gt;Where I've got to: four consecutive live runs with zero wrong guesses, a complete correct integration plan from public surfaces alone in about 90 seconds, and a waitlist created from an empty account in three minutes and eighteen seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check it yourself
&lt;/h2&gt;

&lt;p&gt;All of it is live. If you want to see what an agent actually receives, point yours at &lt;a href="https://waitlister.me/skill.md" rel="noopener noreferrer"&gt;waitlister.me/skill.md&lt;/a&gt; and ask it to set up a waitlist.&lt;/p&gt;

&lt;p&gt;The same path written for a person is at &lt;a href="https://waitlister.me/growth-hub/guides/set-up-waitlist-with-ai-agent" rel="noopener noreferrer"&gt;waitlister.me/growth-hub/guides/set-up-waitlist-with-ai-agent&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>agents</category>
      <category>agentskills</category>
    </item>
  </channel>
</rss>
