When developing a wedding agency portal, we encountered situations where the site took over 5 seconds to load due to heavy photos in the portfolio — and couples simply left for competitors' sites. The issue isn't just LCP: overloaded galleries without lazy loading, no CDN, unoptimized images — all this kills conversion. Our approach: design the architecture from the start so that the portfolio loads asynchronously and Core Web Vitals are in the green zone. Plus, integrate a request form with online wedding date booking through a custom REST API — no bugs with the 'datepicker'. With 10+ years of web development experience and over 50 projects for the event industry, we guarantee stability and speed. Our optimization reduced monthly hosting costs by 40%, saving an average of $200/month for a site with 50,000 views; the Basic package starts at $2,500.
Avoiding performance problems on a wedding agency website
The main pain point is image optimization. We use srcset for responsive sizes, WebP with JPEG fallback, lazy loading with Intersection Observer. For the portfolio, dynamic preload of only visible slides. This reduces LCP by 40% — WebP is 1.5 times better than JPEG in terms of LCP — and improves INP by 2x compared to eager loading. For comparison: WebP reduces file size by 25–35% compared to JPEG, improving LCP by 1.5 times — the first contact with the site becomes faster.
Contents of the couple's personal cabinet
After signing the contract, the couple gets shared access to a personalized space. It includes:
- Preparation checklist with deadlines and role separation. Completed items can be marked — notifications to the partner.
- Moodboard for collecting references: upload photos from Pinterest or manually, the agency gets notified.
- Budget table with automatic remaining balance calculation. Actual expenses — planned — delta.
- Guest list with contacts, confirmation status, dietary preferences.
- Day timeline with drag-and-drop reordering.
All data is synchronized via WebSocket — changes are visible instantly.
Problems we solve
Slow portfolio. Heavy JPEGs without compression → slow loading → lost clients. Solution: WebP + adaptive images + CDN. After implementing these optimizations, average portfolio page load time decreased by 40% (data from the latest project). In a recent project, we reduced LCP from 4.2s to 2.5s, increased Lighthouse score from 60 to 95.
Booking form without date availability validation. Couples book an already taken date → then cancellation and negativity. We implement a custom REST endpoint with PostgreSQL check.
The personal cabinet as 'out-of-the-box' functionality. We customize it for the agency's processes: flexible status system, integration with Telegram bot for notifications.
How we do it
Stack: Next.js 14 for wedding portal frontend (SSR for SEO portfolio pages, ISR for blog), Laravel 11 for event industry backend (REST API, queues for image processing). Database — PostgreSQL, cache — Redis, search — Meilisearch. Deploy on Vercel + DigitalOcean. Example: recently developed a portal for an agency handling 1000+ couples per season — average API response time < 50 ms. Website performance optimization is critical; we also automate reminders and follow-ups, reducing manual work by 60% — true wedding agency automation.
Comparison of image format efficiency
| Format |
File size (relative) |
Quality |
Browser support |
| JPEG |
100% |
High |
All |
| WebP |
65–75% |
High |
96% |
| AVIF |
50–60% |
High |
90% |
Work process
- Analytics. Analyze current pains, metrics, content plan.
- Prototyping. Figma — agree on UX for the personal cabinet and portfolio.
- Backend. Develop API, integrate calendar, filter system.
- Frontend. Responsive layout, animations, image optimization.
- QA. Test for Core Web Vitals, usability tests with real couples.
- Deployment and support. CI/CD via GitHub Actions, Sentry monitoring.
Estimated timelines
Basic site (portfolio, packages, request form) — 2–3 weeks. With personal cabinet and moodboard — 6–10 weeks. Exact timeline assessed after the brief.
What's included in the work
- Design system development in Figma.
- Migration of existing data (photos, reviews).
- Admin panel setup for content management.
- SEO optimization: meta tags, microdata, sitemap.
- Training of the agency team on using the cabinets.
- Handover of accesses, source code, API documentation.
- 1 month of post-launch support.
Typical mistakes when creating a wedding website
- Ignoring the mobile version: 80% of couples view the portfolio from a smartphone.
- No filtering by style/location — clients waste time searching.
- Personal cabinet without deadlines — couples forget to mark stages.
Package comparison
| Package |
Portfolio + form |
Personal cabinet |
Moodboard + budget |
| Basic |
+ |
- |
- |
| Extended |
+ |
+ |
- |
| Premium |
+ |
+ |
+ |
Check how your current site handles the load — request a free Core Web Vitals audit. Get a consultation by phone or Telegram. Write to us to discuss details.
Development of Corporate Portals and Internal Systems
We specialize in developing corporate portals — CRM, ERP, LMS, and Intranet. Each project starts not with landing page layout, but with how business rules will be embedded into the architecture: who sees which data, how 1C and accounting systems sync, how 500 contacts turn into 500,000 without performance degradation. Over 7 years, we have delivered over 40 portals for companies with 50 to 5000 employees. We will evaluate your project in two business days — just contact us.
A public website can be launched without detailed design — iteratively improved based on feedback. With a corporate portal, this approach does not work: the cost of fixing architectural decisions after launch for 200 users is incomparably higher. Therefore, we spend 70% of our time on analysis and prototyping, and write code only after the role matrix and integration scheme are approved.
Three areas where bad decisions are often made: access rights model, performance on large data, and real-time updates.
How to build a role model for 30 departments?
Access rights model. "A manager sees only their own clients, a department head sees the entire department, a director sees the whole company, but financial data is visible only to the CFO and above." This is not three roles — it's a matrix of roles, permissions, organizational units, and record ownership. Implementing it with if ($user->role === 'manager') in controllers will make the code unmaintainable after six months.
The correct approach: Spatie Laravel Permission for basic role model + Policy classes for object-level permission (can('view', $deal) checks not only the role but also ownership). For complex hierarchical structures — ABAC (Attribute-Based Access Control) instead of RBAC.
Performance on large data. CRM with 500,000 contacts, filtering by 10 fields, sorting by activity — a naive implementation yields 15-second queries. Composite indexes, denormalization of aggregates (last_activity_at on the record itself instead of MAX over related table), Elasticsearch for full-text search on contacts.
Real-time updates. Multiple employees working on the same document or task. Without WebSocket — constant setInterval with polling every 5 seconds, extra server load, update delays. Laravel Broadcasting + Pusher/Soketi or a custom WebSocket server on Node.js — for notifications and real-time changes.
CRM Systems
Typical set: contacts, companies, deals, activities, sales funnel, reports. Technically straightforward. The complexity lies in the details.
Pipeline with custom stages. Every company wants its own funnel. Stages must be configurable without deployment. Table pipeline_stages with position, color, is_final, probability — and drag-and-drop for reordering on UI (React DnD or dnd-kit).
Change history. Who and when changed a deal status, reassigned a responsible person, added a note. Audit log via Observer or spatie/laravel-activitylog. On UI — timeline with filtering by activity type.
Email integration. IMAP/SMTP for connecting corporate mailbox, automatic linking of incoming emails to contacts by email address. This works reliably only with proper handling of bounces, spam, auto-replies — filtering is required.
Why is ERP not about code but about data?
ERP is when CRM, warehouse, production, accounting, and HR are unified into a single system. Full ERP from scratch is rare (usually integrating with existing systems), but modular systems for specific businesses are common.
Key principle: financial operations must be immutable. Not UPDATE orders SET status = 'cancelled' — but creating a new record order_cancellations with a reference to the original order. This is the immutable ledger principle, which simplifies auditing and reconciliation.
Integration with 1C is almost always part of an ERP project. Two-way synchronization: from 1C to portal (directories, balances, prices) and from portal to 1C (orders, documents). RabbitMQ as an event bus between systems is more reliable than direct HTTP interaction — if 1C is unavailable, messages wait in the queue.
How are LMS structured: learning platforms?
Learning Management System — courses, modules, lessons, tests, certificates, user progress.
Video content is the most demanding part of an LMS. Storing video on your own server and serving via Nginx is a bad idea: expensive, slow, no adaptive bitrate. Correct approach: upload to S3/Cloudflare R2, transcode via AWS Elemental MediaConvert or Mux, HLS playlist for adaptive streaming via Video.js or Plyr.
Viewing progress — periodic sending of watch_position from the frontend (every 10–30 seconds), storage in Redis with periodic synchronization to PostgreSQL. Do not save every second to the database — it will kill performance.
SCORM compatibility — if integration with corporate training materials is needed. Separate module, there are ready libraries (scorm-again).
Intranet and HR Portals
Corporate intranet: news, documents, organizational structure, HR processes (vacations, requests, KPIs).
Organizational structure in the database is a hierarchical structure. Adjacency list (parent_id on each record) is simple to implement but slow for recursive queries. Nested Sets or Closure Table are faster for reading hierarchies, more complex for changes. In PostgreSQL — recursive CTEs (WITH RECURSIVE) with adjacency list — a balance between simplicity and performance.
Document and request approval — workflow engine. Simple linear approvals (employee → manager → HR → accountant) can be done without a special engine. Non-linear (parallel branches, conditional transitions, delegation) — consider ready solutions: Temporal.io for workflow orchestration or a custom state machine based on the state-machine pattern.
What is included in the work
When ordering a corporate portal development, you receive:
- Architectural documentation (ER diagrams, integration scheme, role matrix)
- Full code in a Git repository with CI/CD
- Access to infrastructure (hosting, databases, storage)
- Training for administrators and key users (2–3 sessions)
- Warranty support for 3 months after launch
Our design principles rely on official Laravel documentation on authorization (Policies) and recommendations for working with queues.
Technical Stack for Portals
| Layer |
Tools |
| Backend |
Laravel + PostgreSQL |
| Frontend |
React + TypeScript (Inertia.js or separate SPA) |
| Real-time |
Laravel Echo + Soketi / Pusher |
| Search |
Meilisearch (quick start) or Elasticsearch (volume) |
| Queues |
Laravel Queue + Redis |
| Files |
S3-compatible (MinIO self-hosted or AWS S3) |
| Monitoring |
Sentry + Telescope (dev) |
Timeline Estimates
| Portal Type |
Timeline |
| CRM (basic) |
10–16 weeks |
| LMS (courses + video + tests) |
14–22 weeks |
| HR Portal (vacations, KPIs, org structure) |
12–20 weeks |
| Corporate ERP (modular) |
24–52 weeks |
The cost is calculated individually after a detailed analysis of requirements and role model. To get a preliminary estimate, contact us — we will analyze your task and offer an optimal turnkey solution.