Inquiries and viewings
How the website's contact form and viewing requests reach the agency, how the team works them in the dashboard, and the limits that keep the forms clean.
For the Full Stack package
How a request reaches the agency
| On the website | In the dashboard |
|---|---|
| The contact form | An inquiry, marked as a contact, or as a question when it was sent about a property |
| A viewing request on a property page | A viewing request, with an inquiry behind it marked as a viewing |
- Each one notifies, live, every admin who can view inquiries or viewings, and lands in the dashboard's Leads or Viewings page.
- The visitor sees a confirmation on the page: a viewing request shows its reference and stays awaiting confirmation until the agency confirms it.
- Nothing is sent by email, to the visitor or to the agency: the template has no mail service. A developer can add one beside the notification.
Inquiries
| Status | Meaning |
|---|---|
| New | Just received. Every inquiry starts here. |
| Contacted | The agency has replied. |
| Qualified | A serious buyer or tenant. |
| Closed | Finished, whatever the outcome. |
- The Leads page filters by status and searches, ten a page, beside the selected inquiry: its property, the visitor's details and what they asked for (buy or rent, area, budget, message).
- The detail panel changes the status and keeps an internal note, up to 2000 characters, which the visitor never sees.
- Inquiries cannot be deleted: close the ones you are done with.
Viewings
| Status | Meaning | Next steps |
|---|---|---|
| Requested | Sent from the website, at the visitor's preferred time | Confirm, or cancel |
| Confirmed | The agency agreed a time | Confirm again at another time, complete, or cancel |
| Completed | The visit happened | None |
| Canceled | It will not happen | None |
- The Viewings page has a tab per status with its counts. Requested viewings list the earliest first, confirmed ones the next appointment first.
- Confirming keeps the visitor's preferred time, or sets another date and time in the agency's time zone, every half hour from 08:00 to 20:00.
- Each viewing keeps an internal note of up to 500 characters. Viewings cannot be deleted: cancel the ones that will not happen.
- Every time is shown and entered in agency time,
Asia/Dubai, whatever the computer's own clock. The website offers 09:00 to 18:00 and refuses a time less than an hour ahead.
Keeping the forms clean
- Each address may send five contact forms and five viewing requests in ten minutes; the next one is refused with a message to wait. The counts live in the API's memory.
- A hidden field catches bots: a submission that fills it is answered as usual and stored nowhere.
- Each submission carries a one-time token, so a double click or a resend stores one inquiry, not two.
- Behind a reverse proxy, set
TRUST_PROXY=1in the API's.env, or every visitor shares the proxy's allowance.
Who can do what
| Permission | Allows |
|---|---|
leads.view | Reading inquiries, and being notified of new ones |
leads.edit | Changing an inquiry's status and note |
viewings.view | Reading viewing requests, and being notified of new ones |
viewings.edit | Confirming, completing and cancelling viewings, and their note |
Both seeded roles, Super Admin and Agent, hold all four.
The routes behind them
POST /api/leads and POST /api/viewings are public, and answer 201 with a receipt: the inquiry's id and time, or the viewing's reference, status and preferred time with its time zone. The dashboard reads and updates them with GET and PATCH /api/leads/:id and /api/viewings/:id; a viewing moves with { "action": "confirm" }, complete or cancel, and an action from the wrong status is refused.