<?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: FollowTheDuck</title>
    <description>The latest articles on DEV Community by FollowTheDuck (@followtheduck).</description>
    <link>https://dev.to/followtheduck</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3966010%2F10ab9d01-47e8-4598-b702-69cfe9f15db7.png</url>
      <title>DEV Community: FollowTheDuck</title>
      <link>https://dev.to/followtheduck</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/followtheduck"/>
    <language>en</language>
    <item>
      <title>A GDPR-conscious waitlist checklist for founders</title>
      <dc:creator>FollowTheDuck</dc:creator>
      <pubDate>Wed, 03 Jun 2026 14:00:06 +0000</pubDate>
      <link>https://dev.to/followtheduck/a-gdpr-conscious-waitlist-checklist-for-founders-43a8</link>
      <guid>https://dev.to/followtheduck/a-gdpr-conscious-waitlist-checklist-for-founders-43a8</guid>
      <description>&lt;p&gt;Most GDPR panic on a ten-field waitlist is theater. You are not building a hospital records system; you are collecting emails with consent. What matters is &lt;strong&gt;provable consent&lt;/strong&gt;, &lt;strong&gt;honest purpose&lt;/strong&gt;, and &lt;strong&gt;a way to delete someone when they ask&lt;/strong&gt; — not a forty-page policy before your first signup.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;not legal advice&lt;/strong&gt;. If you process health data, children, or enterprise DPIAs, talk to a lawyer in your jurisdiction. For the typical indie SaaS waitlist aimed at EU visitors, five operational checks cover most of the risk founders actually trip over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 1 — Name the role
&lt;/h2&gt;

&lt;p&gt;You are almost certainly the &lt;strong&gt;controller&lt;/strong&gt; for your waitlist: you decide why the email exists and what you send. Your waitlist vendor is the &lt;strong&gt;processor&lt;/strong&gt;: they store and send on your instructions.&lt;/p&gt;

&lt;p&gt;Before you collect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy policy link on the signup surface (hosted page or embed)&lt;/li&gt;
&lt;li&gt;Vendor listed as processor (or sub-processor) in your policy or DPA&lt;/li&gt;
&lt;li&gt;Know where data lives (EU hosting matters if you sell "EU-first" — match the claim)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your policy still says "we do not collect personal data" while you run Mailchimp, fix that mismatch first. Regulators read the live page, not your intentions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 2 — Consent you can replay
&lt;/h2&gt;

&lt;p&gt;A pre-ticked marketing box is not consent under GDPR. Neither is "by signing up you agree to everything."&lt;/p&gt;

&lt;p&gt;Minimum viable pattern for a product waitlist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unchecked box or clear sentence: "Email me when access opens"&lt;/li&gt;
&lt;li&gt;Link to privacy policy next to the submit button&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit trail&lt;/strong&gt;: IP, timestamp, wording shown, confirmed opt-in if you use double opt-in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When someone emails "I never signed up," you need a row to show them, not a shrug. Tools that ship consent logs out of the box save you a spreadsheet archaeology project later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 3 — Purpose-bound copy
&lt;/h2&gt;

&lt;p&gt;One waitlist, one primary purpose: early access / launch notification. Do not bolt "and weekly partner offers" onto the same form unless that is what they agreed to.&lt;/p&gt;

&lt;p&gt;Footer on launch emails: who you are (legal name + address), why they are receiving this, one-click unsubscribe or delete path. If you run a separate newsletter list, separate purpose text — see &lt;a href="https://followtheduck.app/blog/waitlist-vs-newsletter-pre-launch" rel="noopener noreferrer"&gt;waitlist vs newsletter&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 4 — Retention with a default
&lt;/h2&gt;

&lt;p&gt;"Indefinite" is a policy choice you will regret. Pick a retention window — &lt;strong&gt;twelve to twenty-four months&lt;/strong&gt; after last interaction is common for launch lists — and automate purge or anonymize.&lt;/p&gt;

&lt;p&gt;Document it in your privacy policy. Run the purge. "We might delete someday" is not the same as deleted rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 5 — Data subject requests without heroics
&lt;/h2&gt;

&lt;p&gt;Someone will ask: export my data, delete me, correct my email. You need a &lt;strong&gt;playbook&lt;/strong&gt;, not a panic thread.&lt;/p&gt;

&lt;p&gt;Owner-side workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search by email (normalized — &lt;code&gt;user+tag@gmail.com&lt;/code&gt; and &lt;code&gt;user@gmail.com&lt;/code&gt; may be the same person)&lt;/li&gt;
&lt;li&gt;Export JSON/CSV if they want portability&lt;/li&gt;
&lt;li&gt;Delete subscriber + consent rows + queue position&lt;/li&gt;
&lt;li&gt;Confirm by email you completed it (keep a minimal log that you fulfilled the request, without keeping their marketing data)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your vendor offers a privacy workspace for owners, use it. If you DIY, script deletion across DB + ESP so ghosts do not receive launch mail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Double opt-in — when it helps compliance posture
&lt;/h2&gt;

&lt;p&gt;Double opt-in is not required by GDPR for every list. It is strong evidence the inbox owner agreed. Tradeoff: you lose signups who never click confirm. For EU-heavy traffic and future paid email, many founders enable it on the product waitlist only. Deeper tradeoff math: &lt;a href="https://followtheduck.app/blog/waitlist-double-opt-in-worth-it" rel="noopener noreferrer"&gt;double opt-in worth it&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you flip the embed live
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Privacy policy matches what you collect&lt;/li&gt;
&lt;li&gt;[ ] Processor/DPA or terms acknowledged&lt;/li&gt;
&lt;li&gt;[ ] Consent wording matches what you will send&lt;/li&gt;
&lt;li&gt;[ ] Retention period set and documented&lt;/li&gt;
&lt;li&gt;[ ] You tested export + delete on a fake address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GDPR on a waitlist is mostly discipline: say what you do, log what they agreed to, delete when the relationship ends. The founders who get burned are not missing a magic clause — they are missing the delete button when a user asks.&lt;/p&gt;

</description>
      <category>data</category>
      <category>privacy</category>
      <category>saas</category>
      <category>startup</category>
    </item>
    <item>
      <title>Hosted waitlist page vs embed on your site</title>
      <dc:creator>FollowTheDuck</dc:creator>
      <pubDate>Wed, 03 Jun 2026 11:23:18 +0000</pubDate>
      <link>https://dev.to/followtheduck/hosted-waitlist-page-vs-embed-on-your-site-15b2</link>
      <guid>https://dev.to/followtheduck/hosted-waitlist-page-vs-embed-on-your-site-15b2</guid>
      <description>&lt;p&gt;A hosted waitlist page (&lt;code&gt;followtheduck.app/w/your-slug&lt;/code&gt;) is not a compromise. It is the fastest way to learn if strangers care. An embed on your domain is not "more professional." It is for when trust already lives on your site and you are optimizing conversion, not time-to-first-signup.&lt;/p&gt;

&lt;p&gt;The mistake is picking based on how the URL looks in a screenshot. Pick based on &lt;strong&gt;where your buyer's skepticism lives&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosted — when speed wins
&lt;/h2&gt;

&lt;p&gt;Use a hosted page when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You do not have a marketing site yet (Notion landing, Twitter bio only)&lt;/li&gt;
&lt;li&gt;You are running a &lt;strong&gt;proof-before-code&lt;/strong&gt; probe this week&lt;/li&gt;
&lt;li&gt;Your traffic comes from social posts and communities, not SEO on your domain&lt;/li&gt;
&lt;li&gt;You want consent, confirm email, and export without touching your app's deploy pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hosted gives you a shareable link in minutes. You A/B copy on the vendor page. You send traffic from Indie Hackers, LinkedIn, Product Hunt teaser — places where people click links, not navigate your nav bar.&lt;/p&gt;

&lt;p&gt;You might worry a third-party URL looks cheap. Most signups never notice the hostname if the headline matches the post they came from. They notice vague copy and a slow form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embed — when trust wins
&lt;/h2&gt;

&lt;p&gt;Use an inline embed when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You already have organic or paid traffic to &lt;code&gt;yoursite.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your brand is the asset (agency, established newsletter, sequel product)&lt;/li&gt;
&lt;li&gt;Design system matters — the form must sit in your hero without an iframe box&lt;/li&gt;
&lt;li&gt;Legal/compliance wants the signup on the same origin as your privacy policy link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good embed is a script, not a clunky iframe — a few lines, inherits your layout, still posts to the vendor backend so you are not rebuilding double opt-in in your API route.&lt;/p&gt;

&lt;p&gt;Cost: you touch deploys when copy changes, and you own breakage if your CSP blocks the script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision in one minute
&lt;/h2&gt;

&lt;p&gt;Answer two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Where does traffic come from this month?&lt;/strong&gt; Mostly off-site → hosted. Mostly your domain → embed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What are you optimizing?&lt;/strong&gt; Days to first measurable signup → hosted. Percent of existing visitors who join → embed.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Idea validation, no site&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launch on existing SaaS marketing site&lt;/td&gt;
&lt;td&gt;Embed in hero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Hunt next week, site is a single HTML file&lt;/td&gt;
&lt;td&gt;Hosted link in first comment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EU privacy copy must sit next to company imprint&lt;/td&gt;
&lt;td&gt;Embed + policy on same site&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can run both: hosted for outbound campaigns, embed on the homepage — same waitlist backend, two surfaces. Do not maintain two different promises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vanity trap
&lt;/h2&gt;

&lt;p&gt;Founders delay launch two weeks to ship a Webflow page so the form lives on &lt;code&gt;getacme.com&lt;/code&gt;. The probe needed to start on day two with a hosted link. By week three they have a beautiful site and twelve signups from friends.&lt;/p&gt;

&lt;p&gt;Flip when data says so: hosted until fifty strangers confirm; then embed on the domain you are already driving to ads and SEO.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational details that matter more than hostname
&lt;/h2&gt;

&lt;p&gt;Whichever surface you choose, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile keyboard does not cover the submit button&lt;/li&gt;
&lt;li&gt;Confirm email arrives in under a minute (Gmail, Outlook, Proton if you sell privacy)&lt;/li&gt;
&lt;li&gt;UTM/ref parameters pass through so you know which post worked&lt;/li&gt;
&lt;li&gt;Export works the day you need beta invites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://followtheduck.app" rel="noopener noreferrer"&gt;followtheduck&lt;/a&gt; ships hosted and embed off one waitlist so you are not re-platforming when you move from probe to branded site.&lt;/p&gt;

&lt;p&gt;The URL is not the product. The signup rate is. Host for speed, embed for trust — in that order, not the other way around.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>product</category>
      <category>saas</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
