W
W
Case study · Instora

One listing in, a whole campaign out.

Instora is an AI marketing tool for real estate agents. An agent fills in one short form about a listing, and Instora writes the social posts, video script and listing copy, builds a page buyers can enquire from, and collects every lead in one place. I designed, built and run all of it.

  • RoleFounder & sole engineer
  • Timeline2026 – Present
  • StatusLive, taking sign-ups
Instora's website on a desktop monitor, laptop, tablet and phone, showing a generated Instagram post and a listing pageVisit instora.io ↗
Why

A real product, end to end.

I built Instora to show the full range of work a modern SaaS product takes, with AI at its core. That means more than calling a model: sign-in, billing, email, background jobs, monitoring and backups all have to work too, the way they would at a company.

Real estate marketing was a good problem for it. Every new listing needs the same pile of writing for different channels, and agents want leads out of it, not just posts. Instora covers the whole path, from the listing details to a buyer getting in touch.

The product

From listing to lead, in one place.

Create the marketing

Claude

One short form becomes an Instagram caption, a LinkedIn post, an X thread, a video script, listing copy with SEO tags, and a branded PDF kit.

Share it everywhere

Next.js

Every listing gets its own page with a photo gallery, a QR code for flyers and signs, and branded social graphics. Agents get a page of their own too.

Capture the leads

Supabase

Enquiries, open house sign-ins, followers and seller leads land in one inbox, with browser alerts and automatic follow-up emails.

Hardest problem

A minute is a long time to wait.

Writing a full kit takes Claude anywhere up to a minute, and sometimes it takes three calls: one retry if the reply isn't valid JSON, and one rewrite if the fair housing screen flags a phrase. Holding a web request open that long is fragile. A slow connection, a closed tab or a platform timeout would lose the work.

So the request doesn't wait. It saves the listing as “generating” and returns at once, and the generation keeps running on the server after the response is sent. The page checks the listing's status every two seconds and shows the stages of the kit. If the agent leaves, the kit-ready email brings them back. If generation fails, the listing is marked as failed and the agent can regenerate it.

How a marketing kit is generated
1

Agent submits

The listing is saved straight away with the status “generating”, and the request returns its ID.

2

Claude writes the kit

After the response is sent, the server asks Claude for the whole kit as one JSON object.

3

Check and fix

Copy that won't parse gets one retry. Copy that fails the fair housing screen gets one rewrite.

4

Agent watches progress

Meanwhile, the page checks the listing's status every two seconds and shows each stage of the kit.

5

Kit ready

The page refreshes with the finished kit, and an email lets the agent know in case they've left.

Compliance

Describe the home, not the buyer.

US fair housing law bars ads that suggest who a home is for, so “perfect for young families” or “walk to church” can get an agent in trouble. AI copy writes phrases like that easily. Every kit goes through a screen of known risky and dated wording. If anything is flagged, Claude gets one chance to rewrite those phrases, and anything still flagged is shown to the agent with a suggested replacement.

Leads

Leads that don't go cold.

Each listing page lets buyers enquire, book a showing, follow the home for updates or sign in at an open house from a QR code. New leads reach the agent by email and browser notification. If the agent hasn't replied, Instora sends follow-up emails on their behalf on days 1, 3 and 7, and it stops as soon as the agent replies or the home sells. When the price changes, an open house is scheduled or the home sells, followers get an update email unless the agent opts out.

Scheduled jobs handle the rest: onboarding emails, a Monday summary of each agent's week, refreshing social tokens and cleaning up unused uploads.

Billing

Plans that grow with the agent.

Agents start with one free listing, then subscribe through Stripe Checkout. Stripe webhooks set the plan, reset the monthly allowance when a renewal is paid, and email the agent if a payment fails. Agents who join a team use the team's plan instead of their own.

  • Free$0One listing to try it
  • Starter$29/mo10 listings a month
  • Pro$79/moUnlimited, with branding
  • Team$199/moUp to 10 agents
Operations

Built to be run, not just shipped.

Instora runs on Vercel, with Supabase for the database, sign-in and file storage. Row-level security keeps each agent's data private. The browser can only read: every write goes through the server, which validates it first, so nobody can upgrade their own plan or skip a usage limit with a direct request. Upstash Redis rate-limits generation and sign-in.

Errors go to Sentry and post to a Slack alerts channel, and an uptime monitor checks a health endpoint that also tests the database. The database is backed up nightly by GitHub Actions, and listing photos are copied to a separate server every night.

Built withNext.jsReactSupabaseClaudeStripeUpstash RedisVercelSentry
What's next

Posting straight to Instagram.

Instora can already publish a listing's graphic or photos to an agent's Instagram account or Facebook Page, with the caption and listing link. It's switched off for now while it goes through Meta's business verification and App Review. Once Meta approves it, agents won't need to copy and paste their posts at all.

Looking back

What I'd do differently.

I'd start Meta's review on day one. I built Instagram and Facebook posting first and only then turned to business verification and App Review, which depend on paperwork and Meta's timeline rather than code. Starting them alongside development would have let posting launch with everything else.

Let's work together

Have a role or project in mind?

I'm open to full-time roles, contract work, or just a conversation about what you're building.