# Build an Event Calendar App in Lovable

- Tool: Lovable Prompts
- Last updated: June 2026

## TL;DR

Paste the starter prompt into Lovable Build mode and get a working event calendar: public browse with month view, RSVP with capacity caps, organizer dashboard, and ICS export — all on Supabase Cloud. The capacity race-condition edge function and timezone discipline are non-negotiable. Full chain: ~100–150 credits on a Pro $25/mo plan, about one full day of building.

## Frequently asked questions

### Can I sell tickets with Stripe through this build?

Not in the starter prompt — this kit is for free RSVP events like Luma-style community gatherings. To add paid tickets, you need to add Stripe Checkout to the RSVP flow: create a checkout session edge function, redirect guests to Stripe, and confirm payment in a webhook before inserting the RSVP. That is a follow-up project, roughly equivalent to the shopping cart prompt kit. If you just need paid events for a few events per month, Luma's 2.5% paid-event fee is often cheaper than the dev cost of Stripe integration.

### How do I handle recurring weekly meetups without duplicating rows?

The recurring events follow-up prompt adds a recurrence_rule column to the events table and expands virtual instances in JavaScript at render time — no duplicate rows in the database. The starter prompt intentionally omits recurrence because Lovable's first pass on RRULE logic tends to create duplicate rows, which are harder to clean up than a missed virtual expansion. Add recurrence only after the base calendar is working.

### Why does my event show the wrong time to attendees in other timezones?

Your event's starts_at is stored as UTC (correct), but you're rendering it without timezone conversion. In EventCard.tsx and EventDetail.tsx, use formatInTimeZone(event.starts_at, event.timezone, 'PPP p zzz') from date-fns-tz — this formats the event in the organizer's stated timezone and appends the timezone abbreviation (e.g. 7:00 PM PDT). If you want to also show the attendee's local time, add a second line: formatInTimeZone(event.starts_at, Intl.DateTimeFormat().resolvedOptions().timeZone, 'h:mm a zzz') + ' your time'.

### Can attendees RSVP without signing up for an account?

Yes. The rsvp-create edge function accepts guest_email and guest_name for anonymous RSVPs. The RSVP form in RSVPDialog.tsx shows just two fields (name and email) for unauthenticated visitors, and a one-click confirm for signed-in users. The edge function inserts with user_id = null and guest_email = provided email. Organizers see both types in the RSVP list. Anonymous RSVPs still receive confirmation and reminder emails via Resend as long as they provide a valid email.

### How do I send a calendar invite (.ics) by email?

The ics-export edge function generates a VCALENDAR/VEVENT block for any event UUID. In the RSVP confirmation email (sent by rsvp-create), include a line with a link to /functions/v1/ics-export?event_id=UUID. You can also attach the .ics directly in the Resend email body using a data URL — construct the VCALENDAR string server-side in the rsvp-create function, base64-encode it, and add it as an attachment to the Resend API call. The Resend confirmation email follow-up prompt covers this.

### What happens when capacity is reached — does it auto-close RSVPs?

After you add the waitlist follow-up prompt, the system switches from rejecting RSVPs when capacity is full to placing them on a waitlist with status='waitlist'. Before that, the rsvp-create edge function returns a 409 capacity_full response and RSVPDialog shows an 'Event is full' message. The capacity counter on EventDetail.tsx shows 'X going / Y capacity' in real time (with the Realtime subscription from the CORS follow-up prompt). The 'RSVP' button becomes disabled when rsvp_count >= capacity so users can't even open the dialog.

### Can I export the RSVP list to CSV for the venue?

Yes — the CSV export follow-up prompt adds a one-click download to the organizer dashboard. It fetches all RSVPs for an event using the organizer's auth session (which already has SELECT permission), builds a CSV with Name, Email, Status, and Responded At columns, and triggers a browser download. No new edge function is needed for this — it runs entirely in the browser with the existing Supabase JS client. The generated file is named [event-slug]-rsvps.csv.

---

Source: https://www.rapidevelopers.com/lovable-prompts/lovable-prompts-for-building-event-calendar-app
© RapidDev — https://www.rapidevelopers.com/lovable-prompts/lovable-prompts-for-building-event-calendar-app
