Let Operations move a booking to another provider when the assigned one drops out, instead of cancelling it.
When a provider drops a booking they already accepted, the only action available is to cancel and refund. The customer has to start over, and the order is lost even when another provider in the same area is free at that time.
Figures are illustrative for this sample.
Save bookings that would otherwise be cancelled, without the customer doing anything and without hurting service quality.
| Metric | Type | Baseline | Target (90 days) |
|---|---|---|---|
| Eligible provider-side cancellations saved by reassignment | Primary | 0% | 40% |
| Provider-side cancellation rate (of all bookings) | Secondary | 3.5% | ≤ 2% |
| 60-day rebooking rate of affected customers | Secondary | Current | +15% |
| Complaints per 1,000 reassigned bookings | Guardrail | Same as normal bookings | No increase |
| In (phase 1) | Out (later or never) |
|---|---|
| Ops Admin reassigns a booking or a single service in it | Customer picks a new provider by themselves |
| List of eligible providers (same service, area, free at the slot) | Automatic matching without an agent |
| Updates in both providers' portals | Any change to price, slot or commission |
| One combined customer notification | Reassigning in-progress or completed services |
| Audit log and tracking events | Provider rating impact (separate ticket) |
Low-fidelity wireframe. Final UI follows the design file.
As an Ops agent, I want to move a service to another provider, so the customer is still served.
As a provider, I want my schedule to reflect bookings moved to or away from me.
As a customer, I want to know if my provider changed, so I'm not surprised on the day.
| To | Channel | English | Arabic |
|---|---|---|---|
| Customer | Push + in-app | Your provider has changed. Same date and time, your new provider is {name}. | تم تغيير مقدّم الخدمة. نفس الموعد، ومقدّم الخدمة الجديد هو {name}. |
| Provider B | Push | New booking assigned to you: {service}, {date} {time}. | تم إسناد حجز جديد لك: {service}، {date} {time}. |
| Provider A | In-app | {service} on {date} was moved to another provider. | تم نقل خدمة {service} بتاريخ {date} إلى مقدّم خدمة آخر. |
| Case | Expected behavior |
|---|---|
| Provider B becomes unavailable after reassignment | Normal provider cancellation flow (BR-2), full refund to customer. |
| Two agents reassign the same service at once | First save wins; second agent sees "Already reassigned". |
| Customer cancels while the agent is reassigning | Customer action wins; reassign fails with a clear message. |
| Booking has 3 services, only one dropped | Only that service moves (BR-3); one notification mentions that service only. |
| Slot is in under 2 hours | Action hidden (BR-5); agent uses cancellation flow. |
| Metric | Rules | Stories / AC | Event |
|---|---|---|---|
| Saved cancellations | BR-1, BR-4, BR-5 | AC-01.1, AC-01.3 | service_reassigned, reassign_no_provider |
| Provider-side cancellation rate | BR-2, BR-8 | AC-01.2 | service_cancelled (actor = provider) |
| Rebooking rate | BR-6, BR-7 | AC-02.1, AC-03.1 | booking_created (60-day window) |
| Complaints (guardrail) | BR-9, BR-10 | AC-01.1 | ticket_created (tag = reassigned) |
| Decision | Why |
|---|---|
| Auto-accept for Provider B | Ops already confirms by phone. An extra step adds delay and a second chance to drop. |
| Once per service | Avoids bookings bouncing between providers. Ops agreed after reviewing last quarter's cases. |
| Ops-only in phase 1 | Keeps quality under control while we learn. Customer self-service is phase 2 if the primary metric holds. |
| Penalty still applies to Provider A | Without it, providers could drop bookings knowing Ops will cover them. |
A sample of how I write PRDs. The feature, numbers and rules are fictional and don't describe any company's product.