Inspiration The idea for EventFlow struck me during a conversation with a friend who runs a local pop-up art market. She was frustrated Eventbrite had taken nearly 15% of her ticket revenue in fees, and she had no way to know if tickets were oversold until angry customers showed up at the door. Meanwhile, I had just read about the H0: Hack the Zero Stack hackathon a challenge to build production-ready full-stack apps using Vercel v0 and AWS databases. The premise was simple: what if you could go from a prompt to a deployed app in minutes, on infrastructure that won't break when real users show up? That's when it clicked. The problem was real, the tools were finally mature enough to solve it, and the timing was perfect.

What it does EventFlow is a fair-trade ticketing platform for independent event organizers. It does three things differently: Transparent, Low Fees Instead of the industry-standard 10–15% effective rate, EventFlow takes just 2.5% + $0.30 per ticket, with every fee shown clearly at checkout. No surprises. Atomic Inventory Powered by Amazon DynamoDB, EventFlow guarantees zero overselling, even when 1,000 people click "Buy" on the same ticket at the exact same millisecond. The database handles the concurrency, not the application code. Smart Check-in Organizers get a QR scanner that validates tickets instantly, works offline, and prevents ticket fraud with dynamic QR codes that refresh every 30 seconds. Organizers can create events, set multiple ticket tiers, generate AI-powered flyers, scan tickets at the door, and track payouts—all from one dashboard. Attendees get a seamless, mobile-first checkout experience with live inventory counts and instant digital tickets.

How we built it

The Stack Layer: Technology Frontend: Next.js 14 (App Router) + React Server Components UI Generation: Vercel v0 (AI-powered component scaffolding) Styling: Tailwind CSS + shadcn/ui Backend: Next.js API Routes (serverless) Database: Amazon DynamoDB (PAY_PER_REQUEST) Authentication: NextAuth.js (JWT) Payments: Stripe Connect AI: Vercel AI SDK + OpenAI Deployment: Vercel

The Architecture I started with v0 prompts to scaffold the core UI components the organizer dashboard, public event landing pages, and the QR scanner. Within hours, I had a working frontend that looked production-ready. The real magic happened in the DynamoDB single-table design. I structured the data so that every operation reserving a ticket, checking inventory, scanning a QR code requires exactly one database query with sub-10ms latency. The atomic counter pattern was the game-changer: This single operation is atomic at the DynamoDB level. If 1,000 users hit claim simultaneously, DynamoDB serializes the writes internally and stops exactly when stock hits zero. No locks, no external cache, no complex distributed coordination. For payments, I integrated Stripe Connect with a platform fee model funds flow directly from the attendee to the organizer's bank account, with EventFlow automatically taking its cut via the Stripe fee structure. The AI flyer generator uses the Vercel AI SDK with GPT-4 to transform an event name and theme into a marketing image prompt and social captions all generated in seconds.

Challenges we ran into

  1. Webhook reliability. Stripe webhooks were the biggest operational risk. If a payment_intent.succeeded webhook failed, tickets would stay in "pending" status forever. I solved this by implementing idempotency keys on the reservation ID and building a reconciliation job that checks for orphaned payment intents every 5 minutes.

  2. QR code security. Static QR codes can be screenshot and shared. I implemented dynamic QR codes that encode a time-based hash the hash changes every 30 seconds, making screenshots useless after half a minute. The scanner validates the hash against the server, not just the ticket ID.

  3. Offline check-in. Venues often have poor Wi-Fi. I built a service worker that caches the list of valid ticket hashes for an event when the organizer loads the scanner page. If the network drops, the scanner still works it syncs the "used" statuses when the connection returns.

  4. State synchronization with v0-generated code. Rapid frontend iteration meant the data model kept shifting. I solved this by defining strict Zod schemas for every API request and response, ensuring the frontend and backend stayed aligned even as the UI evolved.

Accomplishments that we're proud of Zero overselling. The atomic counter pattern in DynamoDB guarantees that no matter how many concurrent buyers hit the system, we never sell more tickets than capacity.

Sub-100ms checkout. Every API route-reservation, confirmation, validation completes in under 100ms, thanks to DynamoDB's single-digit millisecond latency and PAY_PER_REQUEST scaling.

Full Stripe Connect integration. Organizers onboard once, and every ticket sale automatically transfers funds to their bank account minus our transparent 2.5% + $0.30 fee.

AI-powered marketing. The AI flyer generator turns a simple event description into a professional marketing asset in seconds, lowering the barrier for independent creators.

Offline QR scanning. The service worker cache means check-in works even in venues with zero internet connectivity.

What we learned

  1. Choose the right database for the workload. DynamoDB's atomic counters and PAY_PER_REQUEST billing were perfect for a ticketing platform with spiky traffic. I didn't need a relational database I needed a high-throughput, low-latency key-value store with strong consistency where it mattered.

  2. Solve race conditions in the database, not the code. The biggest lesson was that trying to manage concurrency in application logic is a losing battle. By pushing atomic operations to DynamoDB, I eliminated an entire class of bugs and performance issues.

  3. v0 accelerates iteration without sacrificing quality. I was skeptical that AI-generated UI could be production-ready. But v0 generated clean, accessible, responsive components that I could customize and extend. It didn't replace my engineering judgment it accelerated my execution.

  4. Shippable software > perfect software. The hackathon's emphasis on "shippable software" forced me to prioritize. I cut features that weren't core to the value proposition and focused on making the checkout flow bulletproof.

What's next for EventFlow

  1. Multi-currency support. Expand beyond USD to support organizers and attendees globally, with automatic currency conversion and localized pricing.
  2. Waitlist & VIP pre-sale. Add waitlist functionality for sold-out events and private pre-sale links for VIP attendees.
  3. Advanced analytics. Give organizers deeper insights attendance heatmaps, referral source tracking, and predictive pricing based on historical sales data.
  4. Event discovery. Build a consumer-facing "Browse Events" experience with personalized recommendations, search, and social sharing.
  5. Mobile app. Package the check-in scanner and attendee ticket wallet as native mobile apps for iOS and Android.
  6. Open source. Release the core platform as open source, allowing developers to self-host EventFlow for their own communities.

Built With

  • amazon-dynamodb
  • aws-iam
  • aws-sdk
  • jsqr
  • next.js-api-routes
  • nextauth.js-(auth.js)
  • openai-gpt-4
  • qrcode.react
  • react
  • react-webcam
  • shadcn/ui
  • stripe-webhooks
  • tailwind-css
  • typescript
  • vercel-ai-sdk
  • vercel-analytics
  • vercel-v0
  • zod
Share this project:

Updates

posted an update

EventFlow: Project Evolution Update Documenting the journey from concept to deployment for the H0: Hack the Zero Stack hackathon.

Overview Project: EventFlow — Fair-Trade Ticketing for Independent Creators Timeline: June 18, 2026 → Present Mission: Build a production-ready, monetizable ticketing platform that charges 2.5% + $0.30 instead of the industry standard 6-10%+, with zero overselling guaranteed by atomic DynamoDB operations.

Milestone 1: The Spark (June, 2026) The Inspiration The idea struck during a conversation with a friend who runs a local pop-up art market. She was frustrated — Eventbrite had taken nearly 15% of her ticket revenue in fees, and she had no way to know if tickets were oversold until angry customers showed up at the door. At the same time, I had just read about the H0: Hack the Zero Stack hackathon — a challenge to build production-ready full-stack apps using Vercel v0 and AWS Databases. The timing was perfect. Initial Concept: · A ticketing platform with transparent, low fees · Atomic inventory to prevent overselling · A beautiful, mobile-first checkout experience · Built entirely with Next.js, Vercel v0, and Amazon DynamoDB

Milestone 2: The Architecture (June, 2026) The Technology Stack Layer Technology Purpose Frontend Next.js 14 + Vercel v0 Rapid UI generation, server components Styling Tailwind CSS + shadcn/ui Production-ready components, dark mode Database Amazon DynamoDB Atomic counters, single-digit millisecond latency Payments Stripe Connect Direct payouts, automatic fee collection Authentication NextAuth.js Google OAuth + Magic Links AI Vercel AI SDK + OpenAI AI-generated flyers and captions Deployment Vercel Serverless, global CDN

The Database Design I designed a single-table DynamoDB schema to handle all operations with sub-10ms latency:

Table: EventFlow PK: Partition Key | SK: Sort Key | GSI1: SK → PK (for user→events queries) Entities:

  • EVENT#{id} → METADATA (event details)
  • EVENT#{id} → TIER#{tierId} (ticket tiers with available_count)
  • EVENT#{id} → TICKET#{ticketId} (individual tickets)
  • USER#{id} → PROFILE (user details)
  • ORDER#{orderId} → METADATA (payment records)
  • RESERVATION#{id} → METADATA (temporary holds with TTL)

The Atomic Counter Pattern: Javascript // Zero oversell guarantee — atomic decrement await dynamodb.update({ TableName: "EventFlow", Key: { PK: EVENT#${eventId}, SK: TIER#${tierId} }, UpdateExpression: "SET available_count = available_count - :dec", ConditionExpression: "available_count > :zero", ExpressionAttributeValues: { ":dec": 1, ":zero": 0 } });

Key Insight: This single operation is atomic at the DynamoDB level. If 1,000 users hit "Buy" simultaneously, DynamoDB serializes writes internally and stops exactly when stock hits zero. No locks, no external cache, no race conditions.

Milestone 3: The First Components (June 2026) v0-Powered UI Generation I used Vercel v0 to generate the core UI components with targeted prompts: Prompt 1: Organizer Dashboard Generate a Next.js React Server Component for an event organizer dashboard. It should have a sidebar with navigation, a revenue chart, key metrics cards, and a list of recent events as cards. Use shadcn/ui components.

Prompt 2: Public Event Landing Generate a Next.js React Server Component for a public event landing page. Show a hero section with event title, date, venue map, ticket tier selector with live availability, and a sticky "Buy Tickets" button.


Prompt 3: QR Scanner
Generate a Next.js client component for a QR code scanner using getUserMedia.
Show a viewfinder overlay, validation results with green/red feedback,
and a manual fallback input.

Results:
 Full dashboard with sidebar navigation
 Event cards with live inventory counts
 QR scanner with camera access and manual fallback
Dark mode support with next-themes

 Milestone 4: Integrations (June 2026)
Stripe Connect
I integrated Stripe Connect to handle payments and payouts:
· Standard Accounts: Organizers onboard via Stripe's hosted flow
· Application Fees: 2.5% + $0.30 automatically deducted from each transaction
· Destination Charges: Funds flow directly from attendee → organizer's bank account

Webhook Configuration:
Endpoint: /api/webhooks/stripe
Events: payment_intent.succeeded, payment_intent.payment_failed
Fee Structure:
javascript
const paymentIntent = await stripe.paymentIntents.create({
  amount: totalAmount,
  currency: 'usd',
  application_fee_amount: platformFee, // 2.5% + $0.30
  transfer_data: {
    destination: organizerStripeAccountId,
  },
});

Amazon DynamoDB (Vercel Integration)
I provisioned the DynamoDB table directly through the Vercel Marketplace — zero configuration required:
Table: EventFlow
Billing Mode: PAY_PER_REQUEST
Primary Key: PK (String), SK (String)
Global Secondary Index: GSI1 (SK → PK)

Milestone 5: AI-Powered Features (June 22, 2026)
AI Flyer Generator
Using the Vercel AI SDK + OpenAI GPT-4, I built a flyer generator that turns an event name and theme into marketing assets in seconds:
API Route:

Javascript
// /api/ai/generate-flyer
export async function POST(req: Request) {
  const { eventName, theme } = await req.json();
  const { text } = await generateText({
    model: openai('gpt-4-turbo'),
    prompt: `Generate a marketing flyer copy and DALL-E prompt 
             for an event called "${eventName}" with theme "${theme}".`,
  });
  return Response.json(JSON.parse(text));
}

User Experience:
1. Organizer enters event name + selects theme (e.g., "Retro 80s", "Minimalist")
2. GPT-4 generates marketing copy and a DALL-E prompt
3. Replicate generates a 1024x1024 image
4. Flyer auto-populates into the event's media slot

Result: Professional marketing assets in seconds — no design skills required.

Milestone 6: The Check-in Experience (June 23, 2026)
QR Code Scanner
I built a production-ready QR scanner for day-of-event check-in:
Features:
Camera access with viewfinder overlay
 Dynamic QR codes (refresh every 30 seconds to prevent screenshot fraud)
Real-time validation (green/red feedback + sound)
Manual fallback for hard-to-scan tickets
 Offline mode — Service worker caches valid hashes for the event

Validation Flow:
javascript
// /api/tickets/scan
const ticket = await dynamodb.get({
  TableName: "EventFlow",
  Key: { PK: `EVENT#${eventId}`, SK: `TICKET#${ticketId}` }
});

if (ticket.status === 'paid' && !ticket.checkedInAt) {
  // Valid — mark as used
  await dynamodb.update({
    Key: { PK: `EVENT#${eventId}`, SK: `TICKET#${ticketId}` },
    UpdateExpression: "SET checkedInAt = :now",
    ExpressionAttributeValues: { ":now": new Date().toISOString() }
  });
  return { valid: true, name: ticket.buyerName };
} else {
  //  Invalid or already used
  return { valid: false, reason: ticket.status };
}

 Milestone 7: Testing & Validation (June 24-28, 2026)
The "Atomic Inventory" Test
Scenario: 500 concurrent users attempting to buy the last ticket
Setup:

· Event: "H0 Hackathon Demo Night"
· Tier: "Early Bird" — Capacity: 5
· Tool: k6 load testing

Result: Zero oversells — DynamoDB's atomic counter held firm. The 6th user received an inventory exhausted error.
Lighthouse Scores
· Performance: 94/100
· Accessibility: 100/100
· Best Practices: 100/100
· SEO: 100/100

Milestone 8: Current Feature Set
Organizer Dashboard
 Create events (4-step wizard)
Manage ticket tiers (add/remove/update)
 AI-powered flyer generation
 Real-time sales tracking
 Revenue charts (last 30 days)
 Attendee list with check-in status
 QR scanner (online + offline)
Payouts & transaction history
 Event settings & Stripe Connect

Attendee Experience
Browse events with search
Event details with venue map
 Live inventory counts (15-second polling)
 Atomic checkout (no oversells)
Transparent fee display (2.5% + $0.30)
 Stripe payment element
 Dynamic QR tickets (30-second refresh)
Add to Google/Apple Calendar
Email receipts with QR images

Backend
Atomic inventory (DynamoDB conditional updates)
 Stripe Connect (automatic payouts)
 Webhook handling (idempotent)
 Rate limiting (5 req/min per IP)
 Zod validation for all API requests
Global error boundary
 Service worker (offline support)

Next Steps
Feature Status Target
Multi-currency support Planned July 2026
Waitlist functionality  Planned July 2026
Advanced analytics Planned August 2026
Mobile apps (iOS/Android) Planned Q3 2026
Open source release Planned Q4 2026

Code Snippet Spotlight
Atomic Ticket Reservation:
```typescript
// POST /api/tickets/reserve
export async function POST(req: Request) {
  const { eventId, tierId, quantity } = await req.json();

  //  Atomic decrement — no race conditions!
  const result = await dynamodb.update({
    TableName: "EventFlow",
    Key: { PK: `EVENT#${eventId}`, SK: `TIER#${tierId}` },
    UpdateExpression: "SET available_count = available_count - :qty",
    ConditionExpression: "available_count >= :qty",
    ExpressionAttributeValues: {
      ":qty": quantity,
      ":zero": 0
    },
    ReturnValues: "UPDATED_NEW"
  });

  if (!result.Attributes) {
    throw new Error("Not enough tickets available");
  }

  // Create reservation with 10-minute TTL
  const reservationId = nanoid();
  await dynamodb.put({
    TableName: "EventFlow",
    Item: {
      PK: `RESERVATION#${reservationId}`,
      SK: "METADATA",
      eventId,
      tierId,
      quantity,
      expiresAt: Date.now() + 600000, // 10 minutes
      TTL: Math.floor((Date.now() + 600000) / 1000)
    }
  });

  return Response.json({ reservationId, expiresAt: Date.now() + 600000 });
}

 Links
· Live Demo: https://event-flow-fawn-kappa.vercel.app/
· GitHub Repository: https://github.com/Linkxee-Tech/event-flow
· Tech Stack: Next.js, Vercel v0, Amazon DynamoDB, Stripe Connect, Vercel AI SDK

Acknowledgments
· H0 Hackathon Team — For creating this challenge and providing the infrastructure
· Vercel — For v0 and the deployment platform
· AWS — For DynamoDB and the PAY_PER_REQUEST billing model
· Stripe — For Connect and seamless payment infrastructure
· OpenAI — For GPT-4 powering the AI flyer generator

This update was created for the purpose of participating in the H0: Hack the Zero Stack with Vercel v0 and AWS Databases hackathon. #H0Hackathon

EventFlow is live, scalable, and ready to serve independent creators worldwide.

Log in or sign up for Devpost to join the conversation.