{
  "slug": "launching-a-product",
  "url": "https://checklists.org/launching-a-product",
  "markdown": "https://checklists.org/launching-a-product.md",
  "title": "Launching a Product",
  "description": "Pre-launch checklist for shipping a public web product, from DNS to launch-day comms.",
  "category": "software",
  "tags": [
    "software",
    "business"
  ],
  "version": "1.0",
  "updated": "2026-07-07",
  "sources": [
    {
      "name": "Stripe — Testing your integration",
      "url": "https://docs.stripe.com/testing"
    },
    {
      "name": "Google Search Central — SEO Starter Guide",
      "url": "https://developers.google.com/search/docs/fundamentals/seo-starter-guide"
    }
  ],
  "intro": "For taking a public web product live, with roughly two weeks of lead time. Assumes the product itself works; this is everything *around* the product that decides whether launch day is a good day.",
  "itemCount": 26,
  "essentialCount": 7,
  "sections": [
    {
      "title": "Two weeks before",
      "items": [
        {
          "id": "1lrqkgv",
          "text": "Turn on auto-renew and transfer lock for the domain",
          "note": "An expired domain is a total outage plus a ransom negotiation. Set the registrant email to one that isn't hosted on the domain itself.",
          "essential": true
        },
        {
          "id": "1529bky",
          "text": "Verify HTTPS works on both the apex and www, with one redirecting to the other",
          "note": "Test `https://example.com` and `https://www.example.com` explicitly. Confirm certificate renewal is automated — expiry is the classic day-60 outage.",
          "essential": true
        },
        {
          "id": "2eda0d",
          "text": "Lower DNS TTLs to 300 seconds",
          "note": "Launch-week DNS mistakes get fixed in five minutes instead of a day. Raise them again once things are stable."
        },
        {
          "id": "atguji",
          "text": "Install error tracking and confirm it receives a real event",
          "note": "Throw a deliberate exception in production and watch it arrive. \"Installed\" and \"working\" are different claims."
        },
        {
          "id": "bq8iba",
          "text": "Set up analytics with 3–5 named events that define success",
          "note": "Signup, activation, payment. Pageviews alone can't answer \"is the product working?\" on launch night."
        },
        {
          "id": "15q7k7",
          "text": "Add external uptime monitoring that pages your phone",
          "note": "External — a monitor hosted in your own infrastructure goes down with it."
        },
        {
          "id": "z3bz3z",
          "text": "Publish a privacy policy and terms of service",
          "note": "An email address counts as personal data under GDPR and CCPA, and payment providers require published terms and a refund policy.",
          "when": "collecting-personal-data",
          "essential": true
        },
        {
          "id": "1ri2fey",
          "text": "Set up database backups and perform one restore",
          "note": "A backup you have never restored is a hope, not a backup.",
          "essential": true
        }
      ]
    },
    {
      "title": "One week before",
      "items": [
        {
          "id": "9vajyv",
          "text": "Make a real live-mode purchase with a real card, then refund it",
          "note": "Test cards prove the code; a live charge proves the account — live API keys, webhook endpoints, tax settings, and payout details all differ from test mode.",
          "when": "paid-product",
          "essential": true
        },
        {
          "id": "17sto50",
          "text": "Verify webhooks for failed payments and disputes are handled",
          "note": "The unhappy payment paths are where money silently leaks.",
          "when": "paid-product"
        },
        {
          "id": "ctpktu",
          "text": "Write unique titles and meta descriptions for every public page",
          "note": "The title tag is your search listing and your browser-tab label; 60 characters that do real work."
        },
        {
          "id": "1mv439k",
          "text": "Add Open Graph tags with a 1200×630 image, then paste the URL into Slack to check",
          "note": "Every launch link preview — on X, Slack, LinkedIn, iMessage — is rendered from these tags. Test the render, not the markup."
        },
        {
          "id": "1mdgceo",
          "text": "Add robots.txt and sitemap.xml, and submit the site to Search Console",
          "note": "Also confirms nothing is accidentally set to `noindex` — a common leftover from staging."
        },
        {
          "id": "19s13c1",
          "text": "Confirm transactional email lands in the inbox, not spam",
          "note": "Signup confirmation and password reset, tested against Gmail and Outlook. SPF, DKIM, and DMARC records are the difference."
        },
        {
          "id": "1ezbdai",
          "text": "Run a load sanity check at 10x expected launch traffic",
          "note": "Not a full load test — one script hammering the homepage and signup flow. A Hacker News front page can send tens of thousands of visits in a few hours, most of them in the first one."
        },
        {
          "id": "1lery2a",
          "text": "Add rate limiting to signup and any expensive endpoint",
          "note": "Bots find open signup forms within hours of launch, not days."
        }
      ]
    },
    {
      "title": "The day before",
      "items": [
        {
          "id": "mqdl2z",
          "text": "Freeze deploys of anything not launch-critical",
          "note": "Launch day is the worst possible day to debug an unrelated change."
        },
        {
          "id": "1akwqq1",
          "text": "Run a fresh-eyes signup on someone else's machine",
          "note": "Incognito, no saved state, ideally someone who has never seen the product. Your own browser has been hiding onboarding bugs for months."
        },
        {
          "id": "1hz21lt",
          "text": "Remove test accounts, debug endpoints, and staging credentials from production",
          "essential": true
        },
        {
          "id": "344kps",
          "text": "Verify the support channel works and someone is watching it",
          "note": "Send a test message to the support address and confirm a human sees it. Launch-day replies within the hour convert complainers into fans."
        },
        {
          "id": "kgljt6",
          "text": "Write the launch posts in advance",
          "note": "The announcement, the Show HN text, the social posts. Launch-morning adrenaline writes bad copy."
        }
      ]
    },
    {
      "title": "Launch day",
      "items": [
        {
          "id": "1q1oqdt",
          "text": "Smoke-test the critical path one final time before announcing",
          "note": "Signup, core action, payment. Five minutes, before the traffic arrives rather than with it.",
          "essential": true
        },
        {
          "id": "1hbdg8s",
          "text": "Post the announcements and stay in the threads",
          "note": "Founders answering questions in the comments measurably improves how a launch goes; a link-drop reads as spam."
        },
        {
          "id": "1ws7jxm",
          "text": "Watch the error tracker and dashboards through the day",
          "note": "New traffic exercises paths no test found. Triage in real time — launch-day bugs fixed within hours barely count as bugs."
        },
        {
          "id": "tqsj3",
          "text": "Confirm real transactions are arriving in the payment dashboard",
          "note": "Watching the code isn't the same as watching the money.",
          "when": "paid-product"
        },
        {
          "id": "v418ey",
          "text": "Capture every piece of user feedback somewhere durable",
          "note": "Launch-day feedback is the most honest you will ever get, and it evaporates from your memory within a week."
        }
      ]
    }
  ]
}