Lessons from My First Freelance Laravel Project
What I learned building and delivering a real client project — from scoping to deployment.
Scope in Writing, Not Conversation
The client wanted "a flight inquiry form." What they actually needed: airport autocomplete, country codes, email confirmations, admin notifications, reference numbers, spam protection, and an API for future mobile integration. We fixed this by writing a one-page spec document after the first call — features, non-goals, timeline, and acceptance criteria. Signed off before any code. Saved weeks of scope creep.
Charge for Discovery, Not Just Delivery
I initially quoted only for the build. The real work was understanding their workflow: how agents handle leads, what data they need, when they follow up. Next time: paid discovery phase (1–2 weeks) to map requirements, design data models, and agree on UX before quoting the build.
Security Is Not Optional for Client Work
The agency handles customer names, emails, phones, travel dates — PII. Even as a freelancer, you own the security of what you ship. I implemented: reCAPTCHA v3 + honeypot, encrypted casts for 7 PII fields, rate limiting, CSRF/XSS/SQLi protections via Laravel defaults. Documented all of it in a SECURITY.md for the handoff.
Deploy Early, Deploy Often
First deploy to Render was day 3. Every feature after: push to main → GitHub Actions tests → Docker build → Render auto-deploys. Client saw progress in staging every few days. No "big bang" release anxiety. Feedback loops were tight.
Documentation Is Part of the Deliverable
Handoff included: README (local setup, env vars, commands), SECURITY.md (threat model, encryption, rate limits), API.md (endpoints, auth, examples), Docker/Render deploy guide. Client's in-house dev could run it locally day one. That's the standard.
Set Boundaries on 'Quick Changes'
Post-launch: "Can we add a field?" "Can the email template change?" "Can we integrate with X?" First two free (under 30 min). After that: change request form, impact estimate, separate invoice. Protects both sides — client knows cost, you don't burn goodwill on unpaid work.
The Short Version
- ✓Write the spec. Get it signed.
- ✓Charge for discovery — it's the highest-leverage work.
- ✓Ship security by default, not by request.
- ✓Deploy to staging on day 3. Iterate in public.
- ✓Documentation is a deliverable, not an afterthought.
- ✓Boundaries protect the relationship.