Excellent — 1000+ customers with monthly billing puts us in a solid scale bracket. Grails will handle this beautifully, but this scale informs a few important decisions:
Scale Considerations (1000+ Customers)
1 Database Choice
Your current Northwind database is SQLite. For a production portal with 1000+ customers, monthly bills, and user accounts, I'd recommend PostgreSQL or MySQL instead. SQLite works fine for development but has limitations on:
- Concurrent write operations (multiple users accessing simultaneously)
- Database size limits (though you won't hit these for a while)
- Better security and backup options in production
Question: Are you open to moving to PostgreSQL or MySQL for the billing portal database?
2 Initial Customer Data
Are you:
- Starting fresh (customers will be auto-created as bills arrive)?
- Migrating existing customers (need a bulk import from your current system)?
This affects whether we need a one-time data migration script.
3 User Account Management
With 1000+ users, you'll want:
- Self-service password reset (users forgetting passwords = support tickets)
- Email-based account verification
- Proper session security
Question: Is this acceptable, or do you prefer a simpler approach (admin sets passwords manually)?
4 Email Infrastructure
1000+ bills monthly means reliable email delivery. We'll want:
- Proper SMTP configuration with authentication
- Email bounce handling (undeliverable emails need tracking)
- Rate limiting to avoid being flagged as spam
Question: Do you have a production SMTP server (Gmail Business, Office 365, or dedicated SMTP provider)?
5 Performance Gradients
Phase 1 (0–100 customers) Everything runs smooth
Phase 2 (100–500 customers) Need proper indexing, maybe DB optimization
Phase 3 (500–1000+ customers) Consider caching, connection pooling, maybe read replicas
Grails + PostgreSQL handles all of this — we just need to design for it upfront.
My Recommendation at This Scale
Backend: Grails (as you chose)
Database: PostgreSQL (production-grade)
Email: SMTP + bounce tracking
Auth: Spring Security + password reset