Hero image for From idea to €1000 revenue in 5 weeks

From idea to €1000 revenue in 5 weeks

Jan 2026

This idea began with a viral Instagram Reel:

(If you are too lazy to check it out: a family watches together a video with old photos that have been animated back to life with AI)

The YC mantra “Make something people want” had been stuck in my head. But how do you actually find those ideas?

Well, there it was: a video with millions of views, thousands of likes and endless comments asking for the name of the app. The twist? The app didn’t exist.

There are many apps for animating a single photo, some of them even free (such as Grok ) but I could not find any that generated a full video with transitions and music.

Indeed, I asked myself: Do I even know how to do it?

It turns out video generation models are harder to prompt and many of them change the faces of people in disturbing ways. It’s also boring (and hard) to join 20 videos into a single one and find a good background song.

So there it is: people might pay for easily creating a video from their family photos in 5 minutes.

Specifically, they might pay to move their loved ones emotionally.

That’s how Revivaly was born.

Choosing the right MVP

Users care absolutely nothing about your tech. They just want to use your service, get what they want ASAP and continue with their lives.

This is the moment where I had to put the business hat. I had 25 days until Christmas and needed to have a working, marketable, monetized product by then.

I wrote down my priorities:

Which led to product decisions such as:

Of course I wanted a native app: I work in a mobile native development team at Microsoft. And I would also have enjoyed setting up a Kubernetes cluster (why not). Being pragmatic is underrated.

Executing fast: the bottleneck has shifted

I don’t want to imagine how long it would have taken executing this project in the pre-LLM era. The first version was finished in 9 days using Cursor to “vibe code” the backend and frontend. But here’s what surprised me — in retrospect, I spent roughly:

AI tools compressed the first 50% dramatically: what might have taken 2 months became 9 days. But no LLM can tell you why users are dropping off at the payment screen or which TikTok hook will go viral.

The bottleneck is shifting from “can I build this?” to “can I sell this?”


That said, vibe coding is not magic. My most important role was being the code quality guardian, skimming through the generated code. The most common issues I had to deal with were:

I’m not comfortable doing blind vibe coding (where you almost do not review the code and just look at the result), especially for software where a production incident means lots of refunds.

The technical details

Output reliability

Probably one of the hardest parts was making the video generation cheap and reliable at the same time.

My target price was €0,50 per photo (if you upload more than 10 photos), so I could not spend €1,60 per photo using Google Veo. After spending €200 testing all kinds of video models in many many situations and with many prompt variations I came up with the following conclusions:

This led to a video generation process like this:

flowchart TD U[👤 User uploads<br/>up to 20 images] subgraph Parallel["⚡ Parallel Processing<br/>(~2 min)"] direction LR subgraph ImageProcessing["Image Processing<br/>(×20 Parallel Threads)"] direction TB subgraph Thread1["Thread 1"] direction LR P1[🧠 Animation<br/>Planning] -- "Video Direction<br/>Prompt" --> A1[🎬 Image<br/>Animation] end subgraph Thread2["Thread 2"] direction LR P2[🧠 Animation<br/>Planning] -- "Video Direction<br/>Prompt" --> A2[🎬 Image<br/>Animation] end subgraph ThreadN["..."] direction LR PN[...] --> AN[...] end end subgraph Covers["Cover Generation"] direction TB subgraph StartCover["Start Cover"] SC[🎨 Generate<br/>Start Cover] end subgraph EndCover["End Cover"] EC[🎨 Generate<br/>End Cover] end end end subgraph Output["🎬 Video Composition<br/>(~1 min)"] direction TB C[🎞️ Join Videos<br/>+ Add Music] F[✨ Final Video] C --> F end U --> P1 U --> P2 U --> PN U --> SC U --> EC A1 --> C A2 --> C AN --> C SC --> C EC --> C

My cost per image is right now €0,25 thanks to Wan 2.5. After a lot of testing, this model preserves faces quite well and tends to make subtle, elegant and realistic motions. Other video models can output absolute disasters.

Also, do not underestimate the image reasoning capability of Gemini. I tried to replace it with GPT-5 and the results were way worse and unreliable despite efforts on prompt optimization.

Failure mode analysis

My biggest mistake when making the backend was having a very basic error handling.

Processing one video of 20 photos (the most common order) takes approximately 140+ API calls:

sequenceDiagram participant Backend as 🖥️ Backend participant AWS as ☁️ AWS participant Gemini as 🧠 Gemini participant VideoInference as 🎬 Video Inference participant ImageInference as 🎨 Image Inference Note over Backend,ImageInference: Processing 20 photos in parallel loop For each photo (×20) Backend->>+AWS: 1. Check cache<br/>(existing video?) AWS-->>-Backend: Cache miss / hit Backend->>+AWS: 2. Generate upload signature AWS-->>-Backend: Signed URL Backend->>+Gemini: 3. Analyze image<br/>(Generate video prompt) Gemini-->>-Backend: Video direction prompt Backend->>+AWS: 4. Generate signed URL<br/>(for image download) AWS-->>-Backend: Signed download URL Backend->>+VideoInference: 5. Generate video<br/>(with AI-generated prompt) VideoInference-->>-Backend: Video job ID Backend->>+VideoInference: 6. Download video VideoInference-->>-Backend: Video file Backend->>+AWS: 7. Upload to S3 AWS-->>-Backend: S3 URL end Note over Backend,ImageInference: Cover Generation (Start + End) loop For each cover (×2) Backend->>+AWS: 8. Check cache<br/>(existing cover in S3?) AWS-->>-Backend: Cache miss / hit Backend->>+ImageInference: 9. Generate cover image ImageInference-->>-Backend: Cover image Backend->>+AWS: 10. Upload cover to S3 AWS-->>-Backend: S3 URL end Note over Backend,VideoComposition: Final Video Composition participant VideoComposition as 🎞️ Video Composition Backend->>+VideoComposition: 11. Start video composition<br/>(combine videos + music) VideoComposition-->>-Backend: Download URL Backend->>+VideoComposition: 12. Download final video VideoComposition-->>-Backend: Video file Backend->>+AWS: 13. Upload final video to S3 AWS-->>-Backend: Final S3 URL Note over Backend,VideoComposition: Total: 7 calls/photo (140 calls)<br/>+ 6 calls for covers<br/>+ 3 calls for composition = ~149 API calls

The error handling was just “if there is an error, stop and alert Raul”.

Now imagine what happens when your TikTok video goes viral on Christmas Eve. And now imagine that Gemini NSFW filters start triggering (mistakenly or not). Also, the video inference provider decides it’s a good day to return invalid download URLs.

10% of the videos started having some kind of error on the 24th of December (either related to Gemini or my inference provider) and required manual intervention, which meant manually restarting the rendering process (thank God I made it idempotent) and sending an email to the customer, and reimbursing part or the full payment.

I think I lost €100 in revenue due to this mistake. I could have probably designed the system for more robust error handling without compromising time to market.

Go to market

This is where most side projects die. We, developers, don’t particularly enjoy marketing, but no one will find your product unless you get out there.

I forced myself out of my comfort zone and I’m glad I did. I decided to start with the Spanish market, and since this is a B2C product I began with TikTok, Instagram and YouTube Shorts.

Dec 8 First TikTok posted

Decent traction, started experimenting with different formulas

Dec 17 First sale: €10

With just 15 followers on TikTok

Dec 20 Second and third sales

4 hours apart on the same day

Dec 22 Viral video takes off

170K views, 9K likes, 2K saves, 800 shares

Dec 24 Order avalanche begins

Woke up with 5 orders already processed

Jan 6 €1000 revenue milestone

On Three Kings Day 👑

The Dec 22 viral moment? It happened just because I reuploaded a video I had published 2 days ago with a different hook.

In today’s broken attention span, the hook is everything. 3 My previous hooks were generic: “Great gift idea for Christmas” with me talking to the camera without showing anything interesting in the first 3 seconds.

The winning hook? “You can also make a video like this” while showing the viral video in the background. The shared social context did all the heavy lifting: viewers instantly understood what the product was about because they had already seen (and loved) the original video.

This changed the perception of Revivaly and increased social proof, which made the rest of sales much easier.

By January 6th (Three Kings Day), Revivaly had crossed €1000 in revenue — from zero to paying customers in 5 weeks. This figure is net of refunds and excludes sales to friends and family: only real customers.

Marketing is a very human art that will increase in value as more software in the market competes for attention.

The business side

I’m sorry. I’m so sorry for not making another subscription-based SaaS.

As a consumer I don’t like subscriptions and one-time pricing made the business simple to understand: I only pay for my providers when people pay for my service. If people don’t pay, my infrastructure costs are low (around €20/mo).

The pricing was designed so that it is €1 per photo up to 10 photos. From 10 photos up to 20 it’s “free”. This pricing strategy turned out to be effective in increasing the average sale (35% of sales were for the maximum €10 tier).

However, I’m not sure if this has a healthy margin because for a €10 video with 20 photos this is the cost breakdown 4 5 :

VAT €2,10
Video Inf. €5,00
Margin €2,19
VAT: €2,10
Stripe: €0,40
Video Inf.: €5,00
Image Inference: €0,11
Video Processing: €0,20
Margin: €2,19

Which is fine, until taxes enter the picture. After income tax (~45% marginal rate), I’m left with roughly €1,20 of real net profit per sale.

Let me put this graph in a more simple way:

Providers €5,71
Taxes €3,09
Me 🙋 €1,20
Providers: €5,71
Taxes: €3,09
Me 🙋: €1,20

12% margin. That’s what I discovered while processing orders on Christmas Eve. Merry Christmas to me.

Learnings

What’s next

Fortunately, I localized Revivaly in both English and Spanish from day one. My plan is to market this product internationally.

I don’t have all the answers yet—international marketing is a different beast—but figuring it out is part of the fun.

Being early to this niche won’t last forever. The viral video has surely inspired other builders, competition is coming.

Big players like Google might ignore this niche, but they could launch generalist tools that eat into my market. Still, returning customers prove there’s real value in nailing this specific use case.

This space moves incredibly fast and my opportunity window is small.

Time to seize the opportunity. See you in the Q1 update.

Footnotes

  1. I still think I have undermarketed this product. Building felt comfortable; putting myself out there didn’t.

  2. However, some articles, such as this one from Vercel , point out that they might not be that effective.

  3. By “hook” I mean the first 2-3 seconds of the video. I want to give special thanks to my friends who helped me decide which hook would convert better (your feedback was invaluable in finding the winning formula).

  4. This breakdown represents the best case scenario where a customer does not reedit their video. Each customer is given 5 credits for a €10 video, which implies 5 photos to be animated again, which is €1,25 in inference costs.

  5. I’m hoping that inference costs will go down significantly in the next 6 months, which should improve margins substantially.