Sign in with Firebase Auth account that has custom claim admin=true.
Access denied
This account is authenticated but is missing the required admin custom claim.
Command
Command Center
Marketplace health, throughput, and reliability at a glance.
Not signed in
Command Center
Command Center help
Plain-English operating guide
What this does
This is the safest first screen for daily operations. It summarizes marketplace health, active demand, technician availability, dispatch risk, payments risk, support risk, and shortcuts to the deeper tools.
How to use it
Start here at the beginning of an admin session and press Refresh once.
Read the red or yellow priority cards first. They tell you what needs attention before normal browsing.
Use Common Admin Workflows to jump to the correct section instead of guessing which tab contains an action.
If counts look wrong, open the matching tab before taking action so you can inspect the real records behind the number.
Safety notes
This screen is read-only except for Refresh and shortcuts. It should not change real clients, technicians, requests, payments, or dispatch state.
Live means the value came from current Firestore/admin data. Manual refresh only means the page does not poll in the background, which keeps costs controlled.
Marketplace Intelligence
Track the quote outcomes, market aggregates, and operational signals that help CrewHook get smarter with every job.
This dashboard uses aggregate marketplace data for internal operations. It does not expose individual competitor quotes to clients or technicians.
Collection control
Marketplace Intelligence collection
Pause this before fake marketplace QA so test quotes do not contaminate future quote guidance.
Loading
Loading current collection settings...
Use this before running fake marketplace tests so test quotes do not contaminate future quote guidance.
Accepted quote intelligence
Aggregate accepted quote outcomes by market, service, flow, and quote type.
Recent marketplace events
Sanitized operational event stream for quote activity, reevaluations, issues, and completions.
ML readiness
Operational risk signals
Stuck States Monitor
Read-only monitor for risky request, quote, payment, reevaluation, and marketplace states.
Read-only operations monitor. This page does not repair records, capture payments, refund payments, retry
dispatch, or write Firestore data.
Load stuck states to inspect current risks.
Selected stuck state
Use these details to decide where to inspect next. This panel is read-only.
System Health
Admin-only backend health, latency, error, and load-test impact view.
System Health uses sanitized operational events only. It does not store customer addresses, payment
details, AI prompts, or full request bodies.
Load system health to inspect backend telemetry.
Function breakdown
Latency and status counts grouped by Cloud Function.
Recent errors
Latest sanitized failures in the selected window.
Slowest events
Highest latency operational events in the selected window.
Recent operational events
Filtered sanitized telemetry stream for operator review.
Cost & Usage
Admin-only operating-cost estimates and usage pressure from sanitized backend cost events.
Cost & Usage is an internal estimate, not billing reconciliation. It uses sanitized aggregate units and
does not store customer addresses, payment details, AI prompts, AI responses, or full request bodies.
Load cost and usage estimates to inspect operating pressure.
Cost by source
Estimated cost and counted units grouped by source.
Cost by function
Function-level usage pressure from cost events.
Load-test run cost
Estimated usage grouped by individual scalability test run.
Highest estimated events
Events with the largest internal estimated cost.
Recent cost events
Filtered sanitized cost-event stream for operator review.
Load Test Control Panel
Create safe test-mode request and quote data to verify CrewHook scalability without charging customers or polluting Marketplace Intelligence.
Load tests create test-mode records only. They do not call Stripe, do not capture payments, and do not send real customer or technician notifications.
Safe simulation
Create load-test run
Dry run is enabled by default and creates no Firestore request docs.
Marketplace status loading
Cleanup load-test data
Archive or delete a test run
Cleanup only affects records marked isLoadTest/testMode with the matching loadTestRunId. Real customer, technician, payment, and notification records are never modified by this tool.
Baseline report
Open a load-test run report
Correlates the run record, generated projections, cleanup status, operational events, and estimated cost events.
Recent load-test runs
Last 25 admin-triggered runs. Preview cleanup before archiving or deleting test-mode request records.
Safety checklist
Stripe is never called by this tool.
Generated records use fake client and technician IDs.
Notifications are suppressed on generated records.
Marketplace Intelligence skips load-test records.
Cleanup refuses records that are not clearly marked for the selected load-test run.
Issues & Disputes
Issues & Disputes help
Plain-English operating guide
What this does
This page collects operational problems that may need a human decision: stuck dispatches, manual review requests, failed refunds, stale technician locations, failed notifications, techs busy too long, and requests waiting too long.
How to use it
Set the filters only if you want a different threshold. The defaults are the normal production review windows.
Press Refresh for a normal check. Use Force Refresh only when you suspect cached summary data is stale.
Open the table for the issue type that has a non-zero count, then inspect request IDs or technician IDs before acting.
Use the linked action buttons only after you understand whether the issue is real, test data, or already resolved.
Safety notes
Do not cancel, retry, or force status changes from an issue row just because it appears in the list. The page shows candidates for review, not automatic proof of a failure.
Stuck broadcast means dispatch did not finish cleanly. Manual review means the backend intentionally stopped and wants operator input. Reconciliation means payment state needs comparison before refunds or captures.
Completion issues / disputes
Clients reported a problem before confirming completion. Review these requests before payment is captured or the client is allowed to confirm again.
Requests in Manual Review
Stuck Broadcasts
Payments Needing Reconciliation
Failed Refunds
Stale Tech Locations
Failed Notifications
Techs Busy Too Long
Requests Active Too Long Without Acceptance
Requests
Requests help
Plain-English operating guide
What this does
This page lists customer service requests by status. Use it to inspect a request lifecycle, confirm who owns it, see dispatch/payment state, and take request-level admin actions when necessary.
How to use it
Choose a status filter if you know what stage the request is in. Leave it on All statuses when searching broadly.
Press Refresh, then open the row for the request you need to inspect.
Check status, client ID, assigned technician, payment state, and cancellation/completion fields before acting.
Use Next page only when the request is not visible in the first page or use the global lookup if you know the exact ID.
Safety notes
Request actions can affect real users. Do not complete, cancel, reopen, or retry a request unless you have confirmed the request ID and the user-facing outcome.
Pending means still open for dispatch or scheduling. Assigned/accepted means a technician is attached. In progress means the job has started. Completed/cancelled should no longer appear as active work.
Dispatch
Dispatch help
Plain-English operating guide
What this does
This page monitors dispatch waves and broadcast state. It helps admins see whether requests are being sent to eligible technicians and whether a wave is active, stopped, or waiting for manual review.
How to use it
Filter by active when checking live dispatches. Filter by manual_review when investigating stuck matching.
Open the relevant dispatch row and compare request ID, wave number, notified count, and skipped reasons.
If a broadcast is stuck, inspect the request first, then use Ops Tools only if a retry is appropriate.
After any retry or cancellation, refresh this page and the request page to confirm the state changed as expected.
Safety notes
Do not retry broadcasts repeatedly. Retrying can notify technicians again. Use a single retry only after confirming the request is still open and eligible.
A wave is one dispatch attempt to eligible technicians. Skipped reasons explain why a technician did not receive the request.
Technicians
Technicians help
Plain-English operating guide
What this does
This page lets admins inspect technician accounts, availability, dispatch eligibility, location freshness, service profile, and expertise used for matching.
How to use it
Filter by online, busy, or offline only when checking availability. Otherwise leave All availability selected.
Click a technician row to load details. Review availability, status, location, active job, and service profile.
Use Show full Firestore profile only when needed because it may show sensitive account fields.
Change expertise only when you know the technician should match one service category. This affects future dispatch matching.
Safety notes
Changing expertise or account status can remove a technician from matching or route wrong work to them. Confirm the technician ID and business reason before saving.
Accepting jobs means the technician can receive work. Busy does not automatically block broadcasts; if the technician is actively online and has no schedule or current-work conflict, they can still receive eligible jobs in their service line. Stale location means dispatch distance may be unreliable.
Click a row to load technician details. Saving expertise updates Firestore and limits broadcast matching to that
service only (other trade/specialty fields are cleared).
Selected technician
Area of expertise (broadcast)
Sets expertise to a single value and removes trades, specialties,
trade, and specialty so only this category matches new requests.
Clients
Clients help
Plain-English operating guide
What this does
This page lets admins inspect client accounts and linked request history. It is mainly for support, identity checks, and troubleshooting customer-side issues.
How to use it
Press Refresh and click the client row you need to inspect.
Use exact global lookup if you have a client ID from logs, support, or a request record.
Review account fields and linked requests before contacting the client or changing any related request state.
Use Show full Firestore profile only if the summary does not contain enough information.
Safety notes
Client profile data can include sensitive fields. Avoid copying full profile data into screenshots or external messages.
Client ID is the Firebase UID for the account. It is more reliable than name or email when searching logs and requests.
Click a row to load client details.
Selected client
Payments
Find, inspect, and act on payment records safely.
Payments help
Plain-English operating guide
What this does
This page helps admins find payment records, inspect Stripe/payment state, review refund status, and hide test payment records from the admin list without deleting financial history.
How to use it
Search by payment ID or request ID when possible. Exact IDs are safer than browsing long lists.
Use payment status and refund status filters to narrow the list before opening a payment detail drawer.
Open a row, compare CrewHook payment state with Stripe state when needed, then review refund history before issuing a refund.
Hide selected test payments only for confirmed test records. Hiding does not delete Stripe records.
Safety notes
Refunds and payment actions affect real money. Confirm the request ID, payment ID, amount, client, technician, and reason before pressing Confirm Refund.
Authorized means funds are reserved but not fully captured. Captured means funds were charged. Refunded/partially refunded means money was returned through the refund flow.
No selected payments.
Manual Review
Manual Review help
Plain-English operating guide
What this does
This page shows requests that the backend has intentionally held for admin review instead of continuing automatically. It is for ambiguous or risky situations that should not be auto-resolved.
How to use it
Press Refresh and open the oldest or highest priority manual-review request first.
Inspect the request status, dispatch state, payment state, client, technician, and latest notes.
Decide whether the request should be retried, cancelled, reopened, or left for support follow-up.
After taking action, refresh the list and confirm the request disappeared or changed to the expected status.
Safety notes
Manual review exists to prevent accidental automation. Do not bulk-clear these records without checking the underlying request.
Operator intervention means the system needs a human decision before continuing.
Support
In-app issue reports from technicians and clients (stored in supportCases).
Support help
Plain-English operating guide
What this does
This page collects in-app issue reports from clients and technicians. Admins can review the report, send an outreach message, load the linked request, and mark the support case resolved.
How to use it
Filter by open to work the active support queue. Use resolved only for history checks.
Select a support case and read the issue details before sending any message.
Choose the recipient and template, edit the message only if the template is not specific enough, then send.
Load the linked request when the issue involves scheduling, payment, dispatch, cancellation, or job status.
Safety notes
Support messages may trigger push notifications. Avoid sending duplicate messages and avoid promising refunds, technician changes, or timing before verifying the request record.
Outreach log is admin-only history of messages sent from this page.
Selected case
Send support message
Sends a push notification when the recipient has a registered device. Messages are appended to the
outreach log below (admin only).
Outreach log (admin)
Growth
Growth help
Plain-English operating guide
What this does
This page manages out-of-market waitlist contacts and launch outreach. It is for future-market growth, not active Miami dispatch operations.
How to use it
Filter by role, status, city, date range, or radius to find the exact waitlist audience.
Use Select visible only after confirming the current filters match the audience you want.
Export CSV for planning or review. Notify selected only when the message is appropriate for every selected contact.
Update statuses after outreach so the same people are not contacted repeatedly.
Safety notes
Do not notify selected contacts from an unfiltered broad list. Marketing outreach affects trust and can look like spam if sent to the wrong group.
Waitlist means a user expressed interest outside the current service area or before launch in that location.
Manage out-of-market waitlist contacts for launch outreach by role, status, geography, and signup date.
Selected: 0
Ops Tools
Ops Tools help
Plain-English operating guide
What this does
This page contains high-impact operational controls for requests, technicians, safety switches, stuck broadcasts, and dispatch tests. It is powerful and should be used deliberately.
How to use it
Use exact IDs. Do not guess request IDs or technician IDs from names.
Inspect the request or technician in the safer read-only tabs first.
Take the smallest action that solves the problem, then refresh the matching read-only tab to confirm the result.
For dispatch tests, use test technician accounts and always clean up pending requests and restore tech states after the test.
Safety notes
Ops Tools can change real production behavior. If you are unsure, stop and inspect in Command Center, Requests, Dispatch, or Technicians before pressing an action button.
Safety controls are emergency switches. Dispatch tests create real backend objects and can notify accounts unless isolated to test users.
Request Controls
What each request action does
Request controls change one request at a time. Use them only after inspecting the request record and confirming the customer-facing outcome.
Assign to Tech attaches the request to a specific technician ID.
Retry Broadcast sends the still-open request back through dispatch matching.
Cancel closes the request and should remove active/pending refs.
Complete marks the request finished. Use only when the job is actually done.
Reopen moves a request back into an active state when a prior close was wrong.
Never use Retry Broadcast on an already accepted, scheduled, in-progress, completed, or cancelled request unless the backend state clearly supports it.
Technician Controls
How technician controls affect dispatch
These controls change whether a technician can receive or continue work. They are for urgent operational corrections, account issues, or safety responses.
Force Offline stops the technician from receiving new dispatches.
Suspend disables the technician account for operational or safety reasons.
Activate restores the account when the issue is resolved.
Confirm the technician ID first. These buttons can immediately affect their access and job flow.
Safety Controls
Emergency switch guide
Safety controls temporarily disable broad categories of automation. They are intended for incident response, not routine operations.
Disable Broadcasts stops new request fanout to technicians.
Disable Notifications stops push notification delivery paths controlled by these switches.
Turn off the smallest switch needed, write down why it was changed, and turn it back on only after verifying the incident is resolved.
Stuck Broadcast Requests
Non-Responsive Techs
Priority Dispatch Test (Real Backend)
Warning: this creates a real dispatch request and can notify technicians. Use test technician accounts only.
Dispatch test checklist
The dispatch test is useful for validating matching, fanout, and acceptance behavior without using a real customer booking.
Generate or choose test technicians only. Do not select real production technicians.
Pick a service key and Miami test location that matches the scenario.
Confirm the checkbox only when the selected accounts are safe to notify.
After the test, use the monitor to cancel the test request, clean pending requests, and restore technician states.
This tool uses real backend functions. Treat every test as production unless the selected accounts are confirmed test accounts.
Virtual Tech Generator (for this dispatch test)
Button status: pending
Test-only score fields. Real technician ratings cannot be edited here.
Select a preset or radius helper, or enter manual coordinates.
Selected technicians: 0 (pick 2-5)
Dispatch Test Monitor
Dispatch monitor action guide
Use this monitor immediately after creating a dispatch test to verify whether matching, pending docs, acceptance, cleanup, and state restoration worked.
Refresh monitor to load the test run and pending docs.
Wait/check fallback verifies delayed or retry behavior.
Mark selected tech accepted simulates a winning technician only in the test flow.
Cancel test request and Cleanup pending requests remove test leftovers.
Restore previous tech states returns test technicians to their earlier online/offline/account state.
Do cleanup before leaving the page. Leftover test pending docs can confuse mobile testing.
System Control
Last updated: —
System Control help
Plain-English operating guide
What this does
This page controls system-wide operating modes, cost/safety settings, test sandbox behavior, and advanced tuning. It is the highest-impact admin area.
How to use it
Start by reading Recommended Mode and Current Warnings before changing anything.
Use Quick Modes for normal changes. Use Basic Controls only when you understand the specific switch.
Use the Test Sandbox for fake test data. It should not affect real clients or technicians.
Before saving, read the preview, then save only intentional changes. Use Revert or Discard if anything looks unexpected.
Safety notes
System changes can affect dispatch, notifications, cost, safety behavior, or testing. Do not change advanced tuning unless you have a specific reason and a rollback plan.
Mode means the system-wide operating posture. Advanced tuning changes thresholds and behavior that can affect many users at once.
Recommended Mode
Quick Modes
Quick Actions
Test Sandbox Dashboard
Sandbox guide
The sandbox runs fake service-flow tests using isolated test collections. It is designed to exercise the system without touching real client or technician records.
Refresh Sandbox to see current fake test state.
Set up 1-5 virtual technicians and save them.
Pick a playbook, stage the recommended setup, then run the guided test.
Read Current Test Logs to see what passed or failed.
Reset Test Environment when done.
Sandbox is low cost, but repeated full test runs still create reads and writes. Use it intentionally.
This is fake test data only. Cost impact: very low. It uses isolated docs:
testRequests, testUsers, testSandboxTechs, and testPayments.
It does not affect real clients or technicians.
Virtual Technicians (1-5 max)
Test Playbooks
Step-by-Step Test Flow
Guided Test Runner
Current Test Logs
Basic Controls
Basic controls guide
Basic controls expose common system mode switches in a safer format than raw backend configuration.
Read Recommended Mode first.
Change only the control you need.
Review the Before You Save preview.
Save, then refresh Command Center to confirm the system state.
If a control changes dispatch, notifications, chat, or payments, test the affected flow after saving.
Advanced tuning — only change if you understand the impactAdvanced tuning guide
Advanced tuning changes thresholds and backend behavior that may affect cost, dispatch speed, abuse limits, or incident response.
Open this section only for a specific operational reason.
Change one setting at a time so the effect can be measured.
Record the old value before saving.
Monitor logs and user behavior after the change.
Do not use advanced tuning for experimentation during live traffic unless the change has a rollback plan.
Before You Save
Save and rollback guide
This section shows pending system-control changes before they are written. It is the final checkpoint before production behavior changes.
Read every changed field in the preview.
Use Discard Changes if the preview is wrong.
Use Revert to Previous Settings if you want the last known saved state.
Use Save Changes only when the preview matches the intended operational change.
After saving, monitor the affected function logs and mobile flow before making more changes.
Live Cost Drivers
Current Warnings
Help & Glossary
Developer details
Issue Refund
Refund confirmation guide
Refunds return money to the client through the payment provider and create financial history that should not be deleted.
Enter only the amount that should be returned.
Choose the reason that best matches the support/payment decision.
Write internal notes explaining why the refund is being issued.
Press Confirm Refund once. Wait for the result before retrying.
Repeated refund attempts can create reconciliation work. If the first attempt fails, inspect the error before trying again.
Hide selected test payments
Hide test payments guide
Hiding removes confirmed test records from the admin payment list. It does not delete payment records, request records, or Stripe history.
Verify every selected row is a test record.
Keep or edit the reason so future admins know why it was hidden.
Add notes if the test was part of a named QA or dispatch run.
Confirm Hide, then refresh the payments table.
Never hide a real client payment just to clean the screen. Use filters instead.
This hides selected test payments from the admin list. It does not delete Stripe records or financial history.