SZMeetups.com
Meetup Platform for Shenzhen
Passion Project for the Shenzhen Community
Project Overview
The Challenge
Create a community events platform for Shenzhen, China that serves both English-speaking expats and local Chinese users equally well. The platform needed to handle event discovery, user accounts, organizer profiles, and scale gracefully as the community grows.
What We Built
A Complete Events Ecosystem
For Event-Goers:
- Browse events by category, district, or date
- RSVP and bookmark events
- Get email reminders before events start
- Export events to personal calendars (Google, Apple, Outlook)
- Follow favorite organizers for updates
For Event Organizers:
- Submit events with rich text descriptions and images
- Manage recurring events (weekly meetups, monthly gatherings)
- Build a public organizer profile with logo, description, and event history
- Track RSVPs and engagement
For Administrators:
- Review and approve submitted events
- Manage users, organizers, and venues
- Import events in bulk from external sources
- Customize SEO settings and landing pages
Key Capabilities
Fully Bilingual
Every page, every event, every piece of content works in both English and Chinese. Users see content in their preferred language. Organizers can submit in one language—the system auto-translates to the other using AI. This isn't bolted-on translation; it's built into the architecture.
Relevant for: Any business serving multilingual markets—tourism, hospitality, international services, cross-border commerce.
Automatic SEO at Scale
The platform generates hundreds of search-optimized landing pages automatically: "Tech Events in Nanshan," "Food & Drink Events in Futian," and every other combination. Each page has proper meta tags, structured data, and internal linking. Zero manual work required.
Relevant for: Marketplaces, directories, listing sites, any platform where long-tail search traffic matters.
Smart Event Imports
Built-in scrapers pull events from major local sources (convention centers, ticketing sites) and stage them for review. When external sites block automated access, administrators can paste HTML directly and the system extracts the same data. Events get translated, formatted, and imported with images handled automatically.
Relevant for: Aggregator sites, news platforms, data consolidation projects.
Background Automation
The platform handles ongoing tasks without manual intervention:
- Sends reminder emails 24 hours and 1 hour before events
- Notifies organizers when recurring events are about to expire
- Auto-archives stale content that isn't confirmed
- Runs scheduled data imports
Relevant for: Any SaaS product, subscription service, or platform requiring ongoing user engagement.
Referral & Growth Tracking
Every user gets a personal referral code. When they share it, the system tracks who signs up and who engages. A public leaderboard shows top community contributors. This turns users into growth drivers.
Relevant for: Community platforms, membership sites, products with referral programs.
Built for Growth
The platform is designed to run efficiently at scale:
- Fast page loads: Content renders on the server, so users see data immediately
- Optimized images: Automatically resized and served from a global CDN
- Smart caching: Popular pages are cached; updates appear within seconds
- Database performance: Indexed for every common query pattern
The 48-Hour Approach
This project was built by 48hourmvp.com using our rapid development methodology:
-
Pre-built foundations: We don't start from scratch. Authentication, email, file uploads, background jobs—these are solved problems we bring to every project.
-
Database-first design: We model the data correctly upfront. The rest of the application flows from a well-designed schema.
-
Modern tooling: We use frameworks and services that eliminate boilerplate. Less code means fewer bugs and faster delivery.
-
Ship, then iterate: A working product in users' hands is worth more than a perfect spec in a document. We launch fast, then improve based on real feedback.
What You Get
When you work with us, you're not just getting a website. You're getting:
- Production-ready code: Properly structured, documented, and maintainable
- Admin tools included: Manage your platform without touching code
- Scalable architecture: Built to handle growth without rewrites
- Handoff documentation: Your team can maintain and extend it
Let's Build Yours
Whether you need a marketplace, a community platform, a SaaS product, or something entirely different—we can build the first working version in 48 hours.
Frontend

Admin Panel

Programmatic SEO
One of the key decisions we made early on with SZMeetups was to invest heavily in programmatic SEO. Instead of manually creating landing pages for every possible search query, we built a system that automatically generates hundreds of optimized pages from our structured data.
The Problem with Manual SEO
A typical events site might have a handful of category pages. But users search for very specific things: "tech events in Nanshan", "outdoor activities in Dapeng", "language exchange Futian". Creating individual pages for every combination of category and district would be tedious and error-prone. With 11 districts and 17 categories, that's over 200 unique landing pages—before you even consider time-based variations.
The Programmatic Solution
We built a dynamic routing system that parses URLs like /tech-events-in-nanshan or /concerts-in-futian into structured queries. A single page component handles all combinations, pulling the appropriate events from our database and generating locale-aware meta tags, titles, and descriptions on the fly.
/events-in-futian → All events in Futian
/tech-events → All tech events citywide
/tech-events-in-nanshan → Tech events in Nanshan only
Each page gets proper canonical URLs, hreflang tags for English/Chinese, and structured data for rich search results. The content is genuinely useful—filtered event listings with cross-links to related pages—not just SEO keyword stuffing.
Why This Matters
Programmatic SEO isn't about gaming search engines. It's about meeting users where they already are. When someone searches "business networking Luohu", they have clear intent. A dedicated landing page with relevant events, optimized metadata, and a clean URL serves that intent better than forcing them through a generic homepage filter.
The technical investment pays dividends as the site grows. Adding a new category or district automatically creates new landing pages. The SEO value compounds over time as search engines index and rank these pages. And because everything is generated from live data, the pages stay fresh without manual intervention.
Directory Structure
1SZMeetups.com/
2├── docs/ # Documentation
3├── prisma/
4│ ├── schema.prisma # Database schema
5│ └── seed.ts # Seed data
6├── public/
7│ ├── images/ # Static images
8│ │ └── categories/ # Category images
9│ ├── favicon.ico # Favicon files
10│ ├── manifest.json # PWA manifest
11│ └── sitemap.xml # Generated sitemap
12├── scripts/
13│ ├── backfill-event-slugs.ts
14│ └── generate-sitemap.ts
15├── src/
16│ ├── app/ # Next.js App Router
17│ │ ├── [locale]/ # Localized pages (en/zh)
18│ │ │ ├── [seoSlug]/ # SEO landing pages
19│ │ │ ├── about/
20│ │ │ ├── blog/
21│ │ │ │ ├── [slug]/
22│ │ │ │ └── write/
23│ │ │ ├── collections/
24│ │ │ ├── events/
25│ │ │ │ └── [slug]/
26│ │ │ ├── leaderboard/
27│ │ │ ├── o/[slug]/ # Organizer profiles
28│ │ │ ├── organizers/
29│ │ │ │ └── new/
30│ │ │ ├── privacy/
31│ │ │ ├── terms/
32│ │ │ ├── v/[slug]/ # Venue profiles
33│ │ │ └── venues/
34│ │ │ └── new/
35│ │ ├── admin/ # Admin console
36│ │ │ ├── blog/
37│ │ │ ├── collections/
38│ │ │ ├── events/
39│ │ │ ├── organizers/
40│ │ │ ├── redirects/
41│ │ │ ├── referrals/
42│ │ │ ├── reports/
43│ │ │ ├── seo/
44│ │ │ ├── settings/
45│ │ │ ├── users/
46│ │ │ └── venues/
47│ │ ├── api/ # API routes
48│ │ │ ├── admin/ # Admin APIs
49│ │ │ ├── auth/ # Auth APIs
50│ │ │ ├── blog/
51│ │ │ ├── collections/
52│ │ │ ├── cron/ # Cron jobs
53│ │ │ ├── dashboard/
54│ │ │ ├── events/
55│ │ │ ├── inngest/ # Background jobs
56│ │ │ ├── leaderboard/
57│ │ │ ├── organizers/
58│ │ │ ├── recurring/
59│ │ │ ├── redirect/
60│ │ │ ├── reports/
61│ │ │ ├── ticket/
62│ │ │ ├── translate/
63│ │ │ ├── upload/
64│ │ │ ├── user/
65│ │ │ └── venues/
66│ │ ├── dashboard/ # User dashboard
67│ │ │ ├── events/
68│ │ │ └── share/
69│ │ ├── login/
70│ │ ├── recurring/ # Recurring event confirmation
71│ │ ├── settings/
72│ │ ├── signup/
73│ │ │ └── profile/
74│ │ ├── submit/ # Event submission
75│ │ └── ticket/
76│ ├── components/
77│ │ ├── admin/ # Admin components
78│ │ │ ├── index.ts
79│ │ │ ├── manage-members-dialog.tsx
80│ │ │ ├── review-actions.tsx
81│ │ │ ├── review-list.tsx
82│ │ │ └── transfer-ownership-dialog.tsx
83│ │ ├── blog/
84│ │ │ ├── blog-card.tsx
85│ │ │ └── templates/ # Blog templates
86│ │ ├── events/ # Event components
87│ │ │ ├── add-to-calendar.tsx
88│ │ │ ├── bookmark-button.tsx
89│ │ │ ├── calendar.tsx
90│ │ │ ├── event-card.tsx
91│ │ │ ├── event-photo-gallery.tsx
92│ │ │ ├── event-share-section.tsx
93│ │ │ ├── poster-extractor.tsx
94│ │ │ ├── quick-filters.tsx
95│ │ │ ├── recurrence-settings.tsx
96│ │ │ └── venue-selector.tsx
97│ │ ├── layout/ # Layout components
98│ │ │ ├── footer.tsx
99│ │ │ ├── header.tsx
100│ │ │ ├── language-switcher.tsx
101│ │ │ └── user-menu.tsx
102│ │ ├── organizers/
103│ │ │ ├── follow-button.tsx
104│ │ │ ├── organizer-faq.tsx
105│ │ │ ├── organizer-gallery.tsx
106│ │ │ └── organizer-testimonials.tsx
107│ │ ├── shared/ # Shared components
108│ │ │ ├── index.ts
109│ │ │ └── list-page.tsx
110│ │ ├── ui/ # UI primitives
111│ │ │ ├── alert-dialog.tsx
112│ │ │ ├── avatar.tsx
113│ │ │ ├── badge.tsx
114│ │ │ ├── button.tsx
115│ │ │ ├── card.tsx
116│ │ │ ├── checkbox.tsx
117│ │ │ ├── dialog.tsx
118│ │ │ ├── dropdown-menu.tsx
119│ │ │ ├── image-upload.tsx
120│ │ │ ├── input.tsx
121│ │ │ ├── label.tsx
122│ │ │ ├── rich-text-editor.tsx
123│ │ │ ├── select.tsx
124│ │ │ ├── skeleton.tsx
125│ │ │ ├── status-badge.tsx
126│ │ │ ├── switch.tsx
127│ │ │ ├── table.tsx
128│ │ │ ├── tabs.tsx
129│ │ │ ├── textarea.tsx
130│ │ │ └── toast.tsx
131│ │ └── venues/
132│ │ ├── follow-button.tsx
133│ │ └── venue-gallery.tsx
134│ ├── hooks/
135│ │ ├── index.ts # Re-exports all hooks
136│ │ ├── use-bilingual.ts # Bilingual content hook
137│ │ ├── use-list-data.ts # List data management
138│ │ └── use-toast.ts # Toast notifications
139│ └── lib/
140│ ├── analytics.ts # Analytics tracking
141│ ├── api-utils.ts # API handler wrapper
142│ ├── auth/
143│ │ └── session.ts # Session management
144│ ├── auth.ts # Authentication helpers
145│ ├── bilingual.ts # Bilingual utilities
146│ ├── calendar.ts # Calendar export
147│ ├── category-images.ts
148│ ├── cloudinary.ts # Image upload
149│ ├── db.ts # Prisma client
150│ ├── email.ts # Email sending
151│ ├── inngest/ # Background jobs
152│ │ ├── client.ts
153│ │ ├── functions.ts
154│ │ └── index.ts
155│ ├── languages.ts # Language utilities
156│ ├── prisma.ts # Prisma singleton
157│ ├── rate-limit.ts # Rate limiting
158│ ├── recurring-events.ts
159│ ├── sanitize.ts # HTML sanitization
160│ ├── seo-generate.ts # AI SEO generation
161│ ├── seo-landing.ts # SEO landing pages
162│ ├── seo.ts # SEO utilities
163│ ├── settings.ts # Site settings
164│ ├── track-activity.ts # Activity tracking
165│ ├── translate.ts # Translation service
166│ ├── utils.ts # Utility functions
167│ └── validations.ts # Zod schemas
168├── package.json
169├── tailwind.config.ts
170└── tsconfig.jsonWant something like this?
Your idea could be built just as fast. The clock starts when you say go.
Build My MVP