Hello!
I currently have a simple website without a CMS, but there is a need to scale it.
Below is the technical assignment:
Technical assignment for the development of a website with CRM for the PDR business
1. General Information
Project: CRM and website for a PDR service with a franchise model.
Goal: Automation of work with clients, orders, scheduling, financial accounting, interaction with franchisees, and online applications.
Target Audience:
- Franchise owners
- Central administrator (owner)
- Clients (website visitors)
2. Main Stack (optional)
Next.js / Nest.js / Laravel / PHP (alternatives are considered)
DB: PostgreSQL or MySQL
Integrations: Google Calendar API
3. Main Modules of the System
3.1. Website (public part)
- Main page (company info, advantages, application form, list of applications (e.g., latest 20), attention and retention magnets)
- Application submission page:
- Submission form (automatically creates a user profile after submission to allow approval of the performer. After submitting the form, a notification of successful placement and the ability to manage the application is sent to the email)
- After submission, the application is immediately published on the website (without contacts) and displayed in the CRM (post-moderation)
- Order exchange:
- View applications with filtering (city, type of work, date, etc.)
- Franchisee registration page (without automatic activation)
- Franchisee pages (with contacts, information, photos, etc.) – each franchisee will have a personal page. Possibly – a landing page with a third-level domain.
- Service pages
- Franchise advertising page
- Blog / Contacts (optional)
3.2. CRM System (private part)
3.2.1. User Accounting
- Roles: Administrator, Franchisee
- Moderation of franchisee registrations
- Ability to block/delete accounts
3.2.2. Orders
- Creating and editing orders
- Order statuses: New → On exchange → Assigned to franchisee → Completed
- Ability to add photos, descriptions, geolocation, price
- Comments, action history
3.2.3. Work Scheduling
- Task calendar for each franchisee
- Synchronization with Google Calendar (two-way)
3.2.4. Financial Module
- Revenue accounting for each order
- Financial statistics for franchisees and admin
- Accounting for commissions (if used)
- Ability to export to CSV/Excel
3.2.5. Order Exchange (within CRM)
- After the user submits an application, it immediately appears on the public part of the website (without contacts) and in the CRM.
- Franchisees see the applications and can respond by offering:
- price,
- deadlines,
- execution format (on-site or in the garage).
- The application has a list of responding performers with their offers.
- The client receives a notification with the offers. They choose the performer themselves.
- The client's contact details are revealed only to the selected performer.
- If the client does not choose a performer within 24 hours, the administrator can:
- assign a performer manually,
- extend the waiting period,
- decline the application.
- Option: "Let the system choose a performer for me" — the choice is made by the admin or algorithm.
- After completion, the client can leave feedback. A rating for the performer is generated.
4. Access Rights
Function | Admin | Franchisee
View all orders Yes | No
View own orders | Yes | Yes
Add orders | Yes | No
Work with calendar | Yes | Yes (only own)
Financial accounting | Yes | Only own
View exchange | Yes | Yes
Choose performer | Yes* | No
Manage users | Yes | No
* By default, the client makes the choice. The admin intervenes if necessary.
5. Admin Panel
- User management panel
- Application panel (new, active, completed)
- Statistics on orders, income, franchisee efficiency
- Notifications and system logs
- Event calendar
6. Integrations
- Google Calendar API – two-way synchronization of events (scheduling)
- Email notifications
7. Technical Requirements
- Adaptive interface (desktop/mobile)
- Ease of scaling the system
- Documented API (if applicable)
8. Wishes
- The possibility to later add a mobile application (based on API)
- The possibility to use multi-domain or subdomain models