This website uses cookies

Read our Privacy policy and Terms of use for more information.

The Weekly Buildout

The 72-Hour Sprint

Most SaaS founders spend months perfecting their product before launch. I spent 72 hours getting my first 100 beta users for Listaza.app.

Here's the brutally honest breakdown of what worked, what failed, and the automation systems that made it possible.

THE WEEKLY UPGRADE
📋 What Is Listaza?

AI-powered marketplace listing generator. Upload a product photo → get optimized eBay and Facebook Marketplace listings in seconds.

Built for resellers, small businesses, and anyone tired of writing the same product description 50 times.

The tech stack: React.js frontend, Supabase for database and auth, OpenAI GPT-4o-mini for listing generation, and n8n for all the automation glue.

The Launch Strategy (What I Planned)

Going into launch weekend, I had a comprehensive multi-channel plan:

  • Twitter threads about the problem (manual marketplace listings are soul-crushing)

  • LinkedIn posts targeting marketplace sellers and resellers

  • Reddit submissions across 15+ communities

  • Instagram stories with app demos

  • TikTok scripts showing before/after transformations

  • Email sequences for beta signups

  • Referral program for founding members (lifetime Pro access for the first 100)

I created content for every platform. Wrote posts. Designed graphics. Built automation workflows.

Then reality hit.

What Actually Happened

Win #1: The Email Template That Converted at 43%

The MVP wasn't my landing page. It was the welcome email.

I created a brand-consistent HTML email template using our existing styling—gradient headers, clean typography, beta user badges showing their founding member number (e.g., "You're Beta User #47").

The psychology: People love exclusivity. Showing them they're one of the first 100 creates FOMO and commitment.

Screenshot callout: [Insert: Welcome email template showing beta badge and "Founding Member - Lifetime Pro Access" offer]

The email structure:

  • Hero section with personalized greeting

  • Beta user badge with their unique number

  • Clear explanation of lifetime Pro access (normally $9.99/mo)

  • Feature roadmap preview

  • Direct CTA to start creating listings

Conversion rate: 43% of email recipients created their first listing within 24 hours.

Here's the actual HTML template structure I used:


```html
<!-- Email Template Structure -->
<div style="max-width: 600px; margin: 0 auto; font-family: system-ui;">
  
  <!-- Gradient Header -->
  <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); 
              padding: 40px; text-align: center;">
    <h1 style="color: white; margin: 0;">Welcome to Listaza Beta! 🎉</h1>
  </div>
  
  <!-- Beta Badge -->
  <div style="background: #f7fafc; padding: 30px; text-align: center;">
    <div style="display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                color: white; padding: 15px 30px; border-radius: 8px; font-weight: bold;">
      Beta User #{{ beta_number }}
    </div>
    <p style="margin-top: 20px; font-size: 18px; color: #2d3748;">
      You're one of our first 100 Founding Members
    </p>
  </div>
  
  <!-- Content Section -->
  <div style="padding: 30px; background: white;">
    <h2 style="color: #2d3748;">Lifetime Pro Access - Unlocked ✓</h2>
    <p style="color: #4a5568; line-height: 1.6;">
      As a founding member, you now have lifetime access to Pro features (normally $9.99/mo):
    </p>
    <ul style="color: #4a5568; line-height: 1.8;">
      <li>Unlimited listing generations</li>
      <li>Priority support</li>
      <li>Early access to new features</li>
      <li>Direct influence on our roadmap</li>
    </ul>
  </div>
  
  <!-- CTA Button -->
  <div style="padding: 30px; text-align: center; background: #f7fafc;">
    <a href="https://listaza.app/dashboard" 
       style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
              color: white; padding: 15px 40px; text-decoration: none; 
              border-radius: 8px; font-weight: bold; display: inline-block;">
      Create Your First Listing →
    </a>
  </div>
  
</div>
```

Why it worked:

  1. Personalization (beta number, name)

  2. Visual status symbol (the badge)

  3. Clear value prop (lifetime access vs. $9.99/mo)

  4. Single, obvious CTA

Failure #1: The Reddit Strategy Disaster

I wrote 15 different post variations tailored to specific subreddits:

  • r/Entrepreneur

  • r/FlippingMarkets

  • r/SideHustle

  • r/EcommerceTips

  • r/Reselling

  • r/SmallBusiness

  • ...and 9 more

Spent hours crafting posts that matched each community's tone and rules.

Then I actually read the rules.

Turns out 90% of these subreddits prohibit self-promotion entirely.

  • r/Entrepreneur? Banned for promotional content.

  • r/FlippingMarkets? Self-promotion Sundays only (and I missed it).

  • r/SideHustle? Must have established account history.

The Only Reddit Communities That Actually Allow Self-Promotion:

  • r/SideProject (designed for makers sharing projects)

  • r/betatesters (kinda on the nose…)

  • r/alphaandbetausers (specifically for beta testing)

Everything else requires you to engage authentically for months, build karma, then maybe mention your product in a comment if someone specifically asks.

Lesson: Research community rules BEFORE writing 15 different post variations. I wasted 4 hours on content that was DOA.

What I should have done: Spent those 4 hours engaging genuinely in r/Entrepreneur discussions, offering value, and building presence. Then launch in 3 months with actual credibility.

Win #2: Pre-Planning Premium Features

Instead of just launching with core functionality, I spent time mapping out premium features based on early user conversations and feedback form submissions.

The Premium Feature Roadmap:

  1. Multi-Photo Support - Upload multiple angles, AI generates comprehensive listings

  2. Barcode Scanning - Point phone at barcode → instant product details

  3. Auto-Post to eBay - Generate listing and publish directly (no copy/paste)

  4. Poshmark/Mercari Integration - Expand beyond eBay and Facebook

  5. Batch Listing Mode - Upload 10 photos, get 10 listings in one go

  6. Analytics Dashboard - Track which listings perform best

  7. AI Product Photography - Generate professional product placement images using Google Imagen

Screenshot callout: [Insert: Notion database showing feature requests with priority scores, user votes, and implementation complexity]

Why this mattered:

When beta users signed up, I could point to a roadmap. This isn't just a tool—it's a product with a future. People weren't betting on what it is today; they were investing in what it becomes.

Plus, having feature requests already categorized in Notion meant I could immediately start prioritizing based on user votes and feasibility.

Failure #2: Supabase Webhook Hell

I wanted real-time notifications when new users signed up. Sounds simple, right?

The Setup:

  • User signs up → Supabase database trigger

  • Webhook fires to n8n

  • n8n sends Slack notification + email alert

  • I celebrate another founding member

What Actually Happened:

  • Timestamps in UTC, needed America/New_York

  • Webhook payload parsing errors

  • Duplicate confirmation emails

  • 3 hours of debugging at 2 AM

The Technical Problem:

Supabase sends timestamps like this:

2026-02-15T03:44:44.912056+00:00

I needed them like this:

2026-02-15 11:44:44 PM EST

The Fix - n8n Code Node:

```javascript
// Timestamp Conversion for Supabase Webhooks
const items = $input.all();

items.forEach(item => {
  const utcTimestamp = item.json.created_at;
  
  // Convert to America/New_York timezone
  const date = new Date(utcTimestamp);
  const options = {
    timeZone: 'America/New_York',
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: true
  };
  
  const formatter = new Intl.DateTimeFormat('en-US', options);
  const parts = formatter.formatToParts(date);
  
  const year = parts.find(p => p.type === 'year').value;
  const month = parts.find(p => p.type === 'month').value;
  const day = parts.find(p => p.type === 'day').value;
  const hour = parts.find(p => p.type === 'hour').value;
  const minute = parts.find(p => p.type === 'minute').value;
  const second = parts.find(p => p.type === 'second').value;
  const period = parts.find(p => p.type === 'dayPeriod').value;
  
  // Format: YYYY-MM-DD HH:MM:SS AM/PM
  item.json.formatted_timestamp = `${year}-${month}-${day} ${hour}:${minute}:${second} ${period} EST`;
});

return items;
```

The Duplicate Email Problem:

Users were getting 2-3 welcome emails. The issue? No tracking of whether we'd already sent one.

The Database Fix:

Added a confirmation_email_sent column to the user_profiles table:

```sql
ALTER TABLE user_profiles 
ADD COLUMN confirmation_email_sent BOOLEAN DEFAULT FALSE;
```

Then updated the n8n workflow to check this flag before sending:

```javascript
// Check if confirmation email already sent
const emailSent = $('Webhook').item.json.confirmation_email_sent;

if (emailSent === true) {
  // Skip email, just send Slack notification
  return false;
}

// Send email and update database
return true;
```

Final n8n Workflow Structure:

  1. Webhook Trigger - Receives Supabase payload

  2. Code Node - Converts timestamps

  3. IF Node - Check if email already sent

  4. Send Email Node - Welcome email with beta badge

  5. Slack Node - Internal notification

  6. Supabase Update Node - Mark email as sent

Lesson: Build your notification system BEFORE launch. Not at 2 AM while users are signing up.

Subscribe to keep reading

This content is free, but you must be subscribed to Joe Builds Systems to continue reading.

I consent to receive newsletters via email. Sign up Terms of service.

Already a subscriber?Sign in.Not now

Reply

Avatar

or to participate

Keep Reading