DEV Community

Biricik Biricik
Biricik Biricik

Posted on • Originally published at zsky.ai

How I Built a Zero-Signup AI Platform (And Why It Converts Better)

When I launched ZSky AI, an AI image and video generation platform, I made a decision that every SaaS advisor told me was wrong: no signup required. No email. No OAuth. No account creation of any kind. You open the site, you generate images, you leave. Fifty free generations per day, no strings attached.

Four months later, this is the single best product decision I have made. Here is why, and how I implemented it technically.

The Problem with Signup Walls

Every AI image generator I tested before building my own had the same flow:

  1. Land on homepage
  2. See impressive examples
  3. Click "Try it"
  4. Hit a signup/login wall
  5. Decide whether this is worth giving away my email

Step 5 is where most users leave. Industry data puts signup-wall abandonment at 60-80% depending on the product category. For AI tools -- where users are often just curious and have low commitment -- abandonment is at the higher end.

I wanted to test a hypothesis: what if step 5 simply did not exist?

The Results

I do not have A/B test data because I never had a signup wall to compare against. But I do have engagement data from the first four months that tells a clear story:

Metric Value
Visitors who generate at least 1 image 34%
Visitors who generate 5+ images (same session) 18%
Return visitors (within 7 days) 22%
Free users who upgrade to paid 4.2%
Median time from landing to first generation 11 seconds

That 34% first-generation rate is roughly 3x what comparable tools with signup walls report (typically 8-12% of visitors create an account and generate). The 11-second median time-to-first-generation is only possible because there is no authentication flow between the user and the product.

The 4.2% free-to-paid conversion rate is on the higher side for freemium SaaS. I attribute this to the fact that users who upgrade have already experienced the product extensively. They are not converting on a promise; they are converting on demonstrated value.

Implementation: IP-Based Credit System

The core technical challenge of a no-auth product is identity. Without accounts, how do you limit usage, prevent abuse, and track anything?

The answer is IP-based credits with fingerprint reinforcement.

The Credit Tracker

class CreditTracker:
    def __init__(self, redis_client, daily_limit=50):
        self.redis = redis_client
        self.daily_limit = daily_limit

    def check_and_deduct(self, ip: str, fingerprint: str) -> tuple[bool, int]:
        """
        Returns (allowed, remaining_credits).
        Uses both IP and browser fingerprint to prevent
        trivial circumvention.
        """
        today = date.today().isoformat()

        # Check IP-based credits
        ip_key = f"credits:{today}:{ip}"
        ip_used = int(self.redis.get(ip_key) or 0)

        # Check fingerprint-based credits
        fp_key = f"credits:{today}:{fingerprint}"
        fp_used = int(self.redis.get(fp_key) or 0)

        # Use the higher of the two counts
        used = max(ip_used, fp_used)

        if used >= self.daily_limit:
            return False, 0

        # Increment both counters
        pipe = self.redis.pipeline()
        pipe.incr(ip_key)
        pipe.incr(fp_key)
        pipe.expire(ip_key, 86400 * 2)  # TTL: 2 days
        pipe.expire(fp_key, 86400 * 2)
        pipe.execute()

        return True, self.daily_limit - used - 1
Enter fullscreen mode Exit fullscreen mode

The dual-tracking (IP + browser fingerprint) handles the most common circumvention attempts:

  • VPN/proxy users: The fingerprint catches them even if the IP changes.
  • Incognito mode: The IP catches them even if the fingerprint changes.
  • Both VPN + incognito: This defeats the system. I accept this. A determined user who goes to this much effort for 50 free AI generations has earned them.

Browser Fingerprinting (Lightweight)

I do not use a heavy fingerprinting library. The fingerprint is a hash of a few stable browser properties:

function getFingerprint() {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    ctx.textBaseline = 'top';
    ctx.font = '14px Arial';
    ctx.fillText('fingerprint', 2, 2);
    const canvasHash = canvas.toDataURL().slice(-32);

    const components = [
        navigator.language,
        screen.width + 'x' + screen.height,
        new Date().getTimezoneOffset(),
        canvasHash,
        navigator.hardwareConcurrency || 'unknown',
    ];

    return sha256(components.join('|'));
}
Enter fullscreen mode Exit fullscreen mode

This is intentionally weak. I am not trying to build an advertising tracking system. I am trying to prevent one person from consuming 500 free generations per day. The fingerprint is good enough for that purpose without being invasive.

Rate Limiting Without Auth

Beyond daily credit limits, I need rate limiting to prevent the API from being overwhelmed. Without user accounts, rate limiting is purely IP-based:

class RateLimiter:
    def __init__(self, redis_client):
        self.redis = redis_client

    def check(self, ip: str) -> bool:
        now = time.time()
        key = f"ratelimit:{ip}"

        pipe = self.redis.pipeline()
        pipe.zremrangebyscore(key, 0, now - 60)  # Remove entries older than 60s
        pipe.zadd(key, {str(now): now})
        pipe.zcard(key)
        pipe.expire(key, 120)
        _, _, count, _ = pipe.execute()

        # Max 5 concurrent/recent requests per IP per minute
        return count <= 5
Enter fullscreen mode Exit fullscreen mode

This uses a Redis sorted set as a sliding window. Each request adds a timestamp; entries older than 60 seconds are pruned. If the count exceeds 5, the request is rejected with a 429.

Five requests per minute per IP is generous for human users (who take 10-30 seconds to review each result and write a new prompt) but restrictive enough to prevent naive scripting. For legitimate API access at higher rates, users can purchase an API key.

Handling Edge Cases

Shared IPs (Universities, Offices, Coffee Shops)

This is the biggest practical problem with IP-based systems. A university campus might have 10,000 students behind one IP address. If one student uses all 50 credits, the other 9,999 get nothing.

My mitigation is a combination of approaches:

  1. Fingerprint differentiation. Different devices on the same IP get separate credit pools because their fingerprints differ.
  2. Generous limits. Fifty per day is high enough that even in shared-IP environments, most users will not hit the limit.
  3. Graceful degradation. When the limit is hit, the UI does not show an error. It shows remaining credits as zero and offers a paid tier. The message is "upgrade for unlimited" rather than "you are blocked."

In practice, I have received exactly two support emails about shared-IP issues in four months. Both were from university students. I manually whitelisted both IPs with a higher limit.

API Abuse

Without authentication, bot abuse is a real concern. I use a tiered defense:

Layer 1: Rate limiting (described above). Stops naive scripts.

Layer 2: Request validation. Generation requests require a short-lived token generated by the frontend JavaScript. The token includes a timestamp and a proof-of-work nonce. Automated scripts must execute JavaScript to get a valid token, which eliminates simple curl-based abuse.

async function getGenerationToken() {
    const timestamp = Date.now();
    const nonce = await solveChallenge(timestamp, difficulty=18);
    return btoa(JSON.stringify({ t: timestamp, n: nonce }));
}
Enter fullscreen mode Exit fullscreen mode

The proof-of-work takes approximately 200ms in a browser -- imperceptible to users but expensive for bots making thousands of requests.

Layer 3: Behavioral analysis. I track request patterns and flag IPs that generate at machine-like speeds (consistent sub-second intervals between requests) or use repetitive prompts. Flagged IPs get temporarily throttled rather than blocked.

Layer 4: Manual review. For the rare sophisticated abuse that gets past the automated layers, I review daily logs and block IPs manually. This happens roughly once a week.

Analytics Without Accounts

Without user accounts, product analytics require different approaches:

  • Session-based tracking. A random session ID in localStorage tracks user behavior within and across sessions. No PII, no email, no name.
  • Cohort analysis by IP range. I can analyze usage patterns by geography using IP geolocation without tracking individuals.
  • Prompt analytics. Anonymized prompt data shows what users are creating, which informs model selection and feature prioritization.
  • Conversion funnel. Landing page visit, first generation, fifth generation, pricing page view, checkout -- all tracked by anonymous session ID.

I lose the ability to send re-engagement emails (no email addresses to send to) and I cannot do user-level cohort analysis. These are real trade-offs. I compensate with in-product notifications and a strong organic return rate.

Why No-Auth Converts Better (My Theory)

The conventional wisdom is that capturing an email is the most important thing a SaaS can do. You get the email, you nurture the lead, you convert them over weeks of drip campaigns.

I think this model is wrong for AI tools, for two reasons:

1. The product IS the marketing. Every image a free user generates is a potential share. Users screenshot their creations, post them on social media, send them to friends. Every generation is a word-of-mouth opportunity. A signup wall reduces the number of generations, which reduces organic distribution.

2. Value-first conversion is stickier. Users who convert to paid after generating 50+ images have a deep understanding of the product. Their churn rate is lower because they made an informed decision. Users who convert after seeing a landing page and entering their email have high expectations and no experience -- a recipe for early churn.

My paid subscriber churn rate is 6% monthly. Industry average for AI SaaS tools is 8-12%. I believe the no-auth free tier is a significant factor in that difference.

The Technical Cost of No-Auth

There are real engineering costs to this approach:

  1. No user profiles. Users cannot save preferences, view generation history, or access their images from another device. This is my biggest feature limitation. I am currently building optional (not required) accounts that let users claim their anonymous session history.

  2. Abuse mitigation is harder. Every defense I described above is more complex than a simple "block this user ID" would be. IP-based systems have more edge cases and false positives.

  3. Payment integration is awkward. When a user purchases a paid tier, I need to create an account at that point. The transition from anonymous to authenticated introduces UX complexity -- the user must now create credentials for something they have been using without credentials.

  4. Support is harder. When a user emails support, I have no account to look up. I ask for their IP address or a screenshot, which is not a great experience.

When Not To Do This

No-auth is wrong for products where:

  • User data is the product. If you are building a collaborative tool, users need persistent identity.
  • Compliance requires identity. Healthcare, finance, education -- regulated industries need to know who is using the product.
  • The free tier is expensive to serve. If each free request costs you $0.50 in compute, you cannot afford to serve anonymous users at scale without some conversion friction to filter out casual browsers.
  • You rely on email marketing for revenue. If drip campaigns are your primary conversion mechanism, you need emails.

For AI generation tools, creative tools, developer utilities, and other products where the value is in the output rather than in persistent user state, no-auth is worth serious consideration.

Conclusion

Removing authentication was a one-day code change that improved every metric I track: engagement, conversion, retention, and organic growth. The engineering cost of IP-based rate limiting and abuse prevention is real but manageable.

The strongest argument for no-auth is not any single metric. It is this: when you remove the signup wall, you force yourself to build a product that converts on its own merits. There is no drip campaign to fall back on. Either the product is good enough that people come back and pay, or it is not. That constraint makes you build a better product.

If you want to see how a zero-signup AI platform feels from the user side, try ZSky AI. Open the site, generate an image, and notice that at no point did anyone ask for your email address.


I am the founder of ZSky AI, where we run AI image and video generation on self-hosted GPUs with zero signup required. I write about the engineering and product decisions behind building an AI platform from scratch.

Top comments (0)