A tale of two launches.
You shipped it on a Saturday. A weekend project. Maybe a utility app, maybe a clever AI wrapper, maybe a niche tool that scratches an itch nobody else bothered to scratch. You used Cursor, or Replit, or Vibecodeapp. The stack doesn’t matter. What matters is that it works, it’s live, and on Sunday morning you posted it to r/SideProject.
By Sunday night, it’s on the front page of Hacker News. Your Vercel dashboard looks like a hockey stick. Your database is sweating. You’re refreshing your analytics tab every thirty seconds, watching the concurrent user count climb past numbers you’d never planned for.
This is the moment every indie builder dreams about. It’s also the moment that separates the apps that become real products from the ones that become screenshots in a Twitter thread about “that one time I went viral.”
What happens next depends almost entirely on what you set up before the 15 minutes of fame: specifically, whether you have any way to talk to the people who just showed up.
Let’s walk through two versions of the same story.
World one: The silent viral spike
Days 1–2: The high
Your app hits 12,000 signups in 48 hours. You’re running on adrenaline and cold brew. The Reddit thread has 400 comments. People are posting screenshots. A couple of YC founders DM you on Twitter. You feel like you’ve made it.
But here’s the thing: all you have is a signup flow and whatever core feature you shipped. There’s no onboarding sequence. There’s no welcome message beyond a default confirmation email from your auth provider. There’s certainly no push notification infrastructure. You didn’t think you’d need any of that yet.
Most of those 12,000 people try your app once. Some poke around for a few minutes. A few power users dig in. But the majority (the ones who signed up because the Reddit thread looked cool) are gone within the hour, and you have no mechanism to bring them back.
Days 3–7: The build sprint
You’re energized. You take the week off from your day job (“family emergency”) and start shipping features. You build the three things people asked for most in the Reddit comments. You fix the worst bugs. You add a proper settings page. The app is legitimately better now.
But who are you building for? You don’t actually know much about your users. You know how many signed up. You can see some aggregate page views in your analytics. But you don’t know which features they tried, where they got stuck, or what made the power users stick around.
You’re building on vibes and Reddit comments.
Week 2: The email
You want to tell your users about the new features. The problem: you have no messaging infrastructure. Your auth system has their email addresses, so you export the list to a CSV, paste it into your personal Gmail (or maybe a free Mailchimp tier), and send a blast.
The email’s subject line is something like “Exciting updates to [App Name]!” You write it in twenty minutes. It goes to all 12,000 addresses at once. There’s no segmentation because you have nothing to segment on. There’s no personalization because you don’t know anything about these people beyond their email.
The open rate comes back at 22%. That’s roughly average for a bulk email from an unknown sender, which is exactly what this is. A few hundred people click through. A few dozen re-engage. Most don’t.
You send another email the following week. The open rate drops to 16%. A handful of people unsubscribe. The ones who don’t unsubscribe simply ignore you. Your app is already fading from their memory, replaced by whatever new thing hit the front page this week.
Week 4+: The plateau
Traffic is back to baseline. Your analytics dashboard, which briefly looked like a rocket ship, now looks like a cliff followed by a flat line. You have maybe 200 weekly active users from that original cohort of 12,000. That’s a 98.3% churn rate on your viral spike.
You didn’t lose those users because your app was bad. You lost them because you had no way to build a relationship with them after signup. No onboarding to show them the good stuff. No timely nudge when they hadn’t opened the app in three days. No way to tell them “hey, that feature you wanted? It’s live” in a channel that actually reaches them.
You had 48 hours of attention and no infrastructure to convert it into retention.
World two: The prepared viral spike
Same app. Same Reddit post. Same 12,000 signups in 48 hours. But in this version, you spent an extra afternoon before launch setting up OneSignal.
It wasn’t a heroic effort. You added the SDK, configured push notification permissions and in-app messaging, and wired up a few basic event triggers. You did it because you’d read enough post-mortems from other indie devs to know that “we’ll add engagement tooling later” is the most common last words of a promising side project.
Here’s how the same viral spike plays out differently.
Days 1–2: Onboarding at scale
As those 12,000 users sign up, they’re opted into a welcome sequence. Not just a generic “thanks for signing up” email, but an actual mobile onboarding flow. The first in-app message fires when they land on the dashboard for the first time, pointing them to the feature that Reddit was raving about. A second message triggers if they haven’t tried the core workflow within the first session, offering a quick walkthrough.
For users who grant push notification permissions (and in this world, you actually ask at a contextually appropriate moment rather than on first page load, because the OneSignal SDK lets you control that timing), you now have a direct channel to their device. That’s a fundamentally different relationship than “their email address sitting in a CSV somewhere.”
On day two, you send a push notification to users who signed up but didn’t complete the core action. The message is specific: “You created an account yesterday but haven’t [done the thing] yet. Here’s a 30-second walkthrough.” The re-engagement rate on this message is 4x what you’d get from email because it arrives on their lock screen, in real time, while your app is still fresh in their mind.
Days 3–7: Building with signal
You’re still doing the same build sprint; cranking on features, fixing bugs, improving the UX. But now you’re not building blind. Because you instrumented your app to trigger OneSignal Events when users complete key actions (finished onboarding, used the export feature, hit the paywall) you now have segments that actually mean something. You can see that users tagged “completed_core_workflow: true” within their first session are your power users, and users who never triggered that tag bounced from the same screen.
This changes your roadmap. Instead of building what Reddit commenters suggested (a vocal minority), you prioritize the friction point that’s actually causing drop-off. You ship a fix on day five and create an in-app message in OneSignal’s dashboard, targeting the segment of users whose tags indicate they stalled at that step. The message fires via a programmatic trigger you set in your code: when a user lands on the screen where the fix lives, OneSignal displays it. No batch send, no blast. It shows up in context, at the moment it’s relevant.
Crucially, you’re not blasting everyone with the same message. Your power users (the ones who show they’ve already hit every feature) get a different notification than the users who signed up and never came back. You build two segments in OneSignal: one filtered on “features_used greater than 3,” another on “last_session_date more than 5 days ago.” The power user segment gets a push about the new feature you just shipped. The lapsed segment gets a re-engagement nudge that highlights the core value prop they missed. Same tool, different messages, because the tags you set give you something to filter on.
Week 2: Multi-channel engagement
In World One, this is when you sent the Mailchimp blast. In World Two, you’re running a coordinated multi-channel strategy without thinking of it in those terms.
Users who are active in the app see in-app messages about new features: contextual, non-intrusive, triggered by their behavior. Users who opted into push get timely notifications when something relevant to them happens. Users who haven’t opened the app in a week get an email. The right message arrives in the right place at the right time, and that’s not a marketing platitude; it’s just what happens when your engagement stack can actually see what users are doing.
The result: your email open rate is north of 35% because you’re only emailing people who aren’t reachable via push or in-app, and the content is relevant to their actual usage pattern. Your push notification tap-through rate is above 8%. Your in-app messages have a 40% interaction rate because they fire at the exact moment the user would benefit from them.
Week 4+: Retention compounding
A month out from the viral spike, traffic has come down from the peak. That’s inevitable; no one sustains front-page-of-Reddit traffic forever. But the floor is dramatically higher. Instead of 200 weekly active users from the original 12,000, you’re sitting at 2,400. Same app, same viral moment, 12x the retention.
And here’s where it compounds. Those 2,400 active users are generating the kind of engagement signals: feature usage, session frequency, workflow completion. You can A/B test your onboarding messages. You can identify which notification cadence maximizes weekly retention without triggering unsubscribes. You can spot your most engaged users and turn them into advocates.
The viral spike was the same. The difference is everything that happened after.
The infrastructure you set up before you need it
There’s a reason we framed this as two versions of the same story rather than a feature comparison chart. The gap between World One and World Two isn’t about having access to more marketing tools. It’s about whether you can build a relationship with your users outside of the moments when they happen to be inside your app.
If you’re vibecoding a side project the temptation is to defer everything that isn’t the core product. Engagement tooling feels like a “scale problem,” something you’ll set up when you have real users. But the catch-22 is that without it, you can’t keep the users you get.
The practical reality of modern app development is that users make a retention decision in their first 48 hours. They either form a habit or they forget you exist. If you can’t reach them during that window with onboarding guidance, with timely nudges, with proof that your app is alive and improving, then you’re relying entirely on their intrinsic motivation to come back. And for the vast majority of users, intrinsic motivation loses to the next notification from the next app.
What this looks like in practice
If you’re building right now and haven’t thought about engagement infrastructure yet, here’s the minimum viable setup that would have changed World One into World Two:
Push notifications with permission timing. Don’t ask on first load. Ask after the user has experienced value. After they’ve completed the core action, after they’ve had their “aha” moment. And, don’t ask generically. With the OneSignal’s SDK you have programmatic control over when the permission prompt fires and what that prompt looks like to highlight key value and drive opt-in rates.
A full onboarding sequence, not a one time welcome email. Two or three in-app messages that trigger based on behavior, not time. First message on dashboard load. Second message if the user hasn’t completed the core workflow. Third message highlighting a non-obvious feature that power users love. All easy to do right from the OneSignal Dashboard or using our MCP with your favorite tool.
A lapsed-user re-engagement flow. If someone hasn’t opened the app in 72 hours, send a push. If they don’t respond, send an email 48 hours later. If they come back, show an in-app message about what’s new.
Basic segmentation from day one. Even simple segments (e.g. active in the last 7 days, completed onboarding, hasn’t tried feature X) let you avoid the “same blast to everyone” trap. OneSignal creates these segments from the events your app is already firing; you just need to tag them.
Virality is a window, not a destination
The vibecoding era has made it dramatically easier to build and ship software. That’s genuinely great. But it’s also created a generation of apps that are optimized for launch and completely unequipped for the day after. When the spike comes, will you be able to handle it? Will you be able to keep those users?
Engagement infrastructure isn’t a growth hack. And it’s not a heavy implementation. It’s a single SDK, set up in minutes with Cursor, that is plumbing you’ll be happy you implemented before the water starts to run.
If you’re building something right now, set up OneSignal before you post it to Reddit. Your future self (the one staring at the analytics dashboard at 2 AM, watching the numbers climb) will thank you.
Get Started for Free