
Inquifly
The invisible employee for photographers.
AI-powered inquiry automation that drafts responses in your voice, checks your calendar, and never sleeps. Built it for my own studio first, then productized into a multi-tenant SaaS.
The Problem
78% of clients book with the first photographer to respond. Yet most photographers lose bookings because:
- Slow responses. It takes 20+ minutes to read an email, check the calendar, and draft a reply.
- Double-booking risk. Manual calendar checking leads to costly errors.
- Lost revenue. Each slow response risks $500-5,000+ in booking value.
- Admin overload. Time spent on emails is time not spent shooting.
The Solution
An AI system that reads inquiry emails, checks calendar availability, and drafts personalized responses in the photographer's voice. Ready for one-click send.
The key insight: The AI doesn't just respond. It understands the inquiry, checks real availability, and sounds like the photographer.
Core workflow:
- Client emails photographer
- System receives inquiry (internal tool: Gmail API, SaaS: Postmark forwarding)
- AI extracts intent (name, date, session type)
- System checks Google Calendar availability
- AI drafts response with pricing + alternatives if booked
- Photographer reviews draft (internal tool: in Gmail, SaaS: in Inquifly dashboard) and sends

Evolution: Internal Tool → SaaS
Phase 1: Validate (Internal Tool)
Built a lightweight serverless system for my own studio (TRISP Studio). No database for state management. Used Gmail Labels as a finite state machine to track which threads had been processed.
Try the interactive demo:
Inquiry: Graduation Shoot - Studio & Campus
Hi,
I wanted to do a couple of shots in a studio and on campus. Ideal locations on campus are my college building, legacy gazebo, and the KSU sign.
For the studio shots I would like maybe a yellow or white backdrop. I am graduating with a psychology degree so maybe something that can correlate with that.
Are you available on November 12th around 2pm?
Thanks,
Jada
- Architecture: Vercel serverless + Gmail Pub/Sub webhooks
- Clever bit: Mark threads as "claimed" before slow AI operations to prevent race conditions
- Result: 99% faster, 62% cheaper than no-code alternatives
Phase 2: Productize (SaaS)
With validation complete, rebuilt for multiple users:
- Supabase for auth + multi-tenant data isolation
- Postmark for email forwarding (privacy-friendly, no Gmail API access)
- Stripe for usage-based subscriptions (Free → Founder → Creator → Pro → Studio)
- Knowledge base so each photographer configures their own packages, policies, and tone

Technical Highlights
Two-Stage AI Pipeline
Separating understanding from generation enables calendar lookup between stages.
Raw Email
"Hi! I'm looking for a graduation photographer for May 15th at Georgia State. Do you have any availability? Thanks, Sarah"
Stage 1: Extraction
Gemini parses email into structured data
Context Gathered
- • Extracted inquiry data
- • Graduation packages ($299-$599)
- • Photographer's tone settings
- • Business policies (50% deposit)
Calendar Check
Google Calendar API checks availability
Stage 2: Draft Generation
- • Inquiry + packages + policies + tone
- • Calendar status (unavailable + alternatives)
- • Sample responses for style
Draft Ready
Personalized response with alternatives
Stage 1 (Extraction): Email → structured JSON ({ name, date, session_type, location })
Stage 2 (Generation): JSON + packages + policies + availability → personalized draft
Deterministic Guardrails
AI handles language and tone. Code handles facts. The AI cannot invent prices. It only references the photographer's configured packages.
Idempotency Pattern
Multiple webhooks can fire for the same email. Solution: claim the thread immediately (internal tool: Gmail labels, SaaS: header deduplication) before expensive AI operations.
Tech Stack
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | Next.js 15 (App Router) | Server components + API routes in one framework. |
| React 19 + TypeScript | Type-safe UI with latest React features. | |
| Tailwind CSS v4 | Utility-first styling with dark mode support. | |
| Recharts | Usage analytics and time-saved visualizations. | |
| Backend & Database | Supabase (PostgreSQL) | User data, drafts, settings, processing logs. |
| Supabase Auth | Email authentication with session management. | |
| Zod | Runtime validation for API inputs. | |
| AI & Processing | Google Gemini API | Two-stage AI: inquiry extraction + draft generation. |
| Postmark Webhooks | Inbound email processing pipeline. | |
| Integrations | Google Calendar API | Real-time availability checking with freebusy. |
| Google OAuth 2.0 | Calendar and Gmail access tokens. | |
| Stripe | Subscription billing with usage-based limits. |
Impact

The analytics dashboard tracks activity, time saved, processing speed, and usage patterns like busiest days and peak hours.
| Metric | Before | After | Impact |
|---|---|---|---|
| Inquiry response time | 20+ minutes | 30 seconds | 97% faster |
| Calendar checking | Manual lookup | Real-time API | Zero double-bookings |
| Brand voice consistency | Varies by mood/time | Knowledge base driven | 100% on-brand |
| Time saved per month | 0 hours | ~10 hours (30 inquiries) | Reclaimed creative time |
| Inquiry-to-draft automation | Fully manual | One-click review | 95% automated |
| Alternative date suggestions | None (lost booking) | 3-day window scan | Recovered revenue |
Challenges & Learnings
Gmail Forwarding UX
Non-technical photographers struggle with complex filter setup.
Step-by-step wizard with test inquiry verification.
"Invest heavily in onboarding UX for complex third-party integrations."
AI Hallucination Prevention
LLMs might invent prices/policies if given too much creative freedom.
Strict separation of concerns. AI handles language; code handles facts.
"Never let AI generate business-critical numbers without deterministic guardrails."
OAuth Token Management
Google tokens expire efficiently; users shouldn't re-authenticate constantly.
Store refresh tokens securely and implement auto-refresh on expiry.
"Plan for long-lived integration maintenance from the start."
Race Conditions
Parallel webhooks can process the same email twice.
Claim threads immediately in DB *before* starting slow operations.
"Idempotency must check state first, not last."
What I'd Do Differently
- Email tracking. Measure actual conversion, not just drafts sent.
- Mobile notifications. Photographers check email on phones.
- RAG for FAQs. Scale knowledge base beyond structured packages.
- A/B test tones. Learn which styles convert better.
Skills Demonstrated
Next.js 15 + Supabase + Google APIs + Stripe
Two-stage Gemini pipeline with structured outputs
Internal tool validation → SaaS productization, usage-based pricing
Webhook handlers, OAuth flows, rate limiting
Google Calendar, Gmail, Postmark, Stripe
Live: inquifly.com