← Updates
Tour Dash · Whole app · User experience review

Where the app gets in the way

A walk through every screen on both sides of Tour Dash, as the person using it, looking for the moments where the app makes them wait, guess, scroll or repeat themselves. Fifty-one of those moments are listed at the bottom with the file and line each one lives in. The eight that matter most are drawn first, as proposals you can say yes or no to.

Sunday, October 4, 2026Read from the code, not from users Drawn, not built Light theme onlyEight proposals, one order

How the app was read

Every page, dialog and hook the agent and the contractor touch was read end to end: posting, hiring, the applicants dialog, the threads, the board, applying, countering, check-in, the wallet, settings, signup and onboarding. For each one the question was the same: what does the person see, what do they expect to happen next, and does the app tell them?

The findings sort into four kinds. Loops that don't close, like paying and returning from Stripe to a page that says nothing. Things that vanish, like a declined application or an expired post. Work the app could remember, like the price you always pay or the radius you always widen to. And signals in the wrong place, like applicant messages that never reach Messages or the phone's tab bar.

Nothing here changes the data model, the fee math or the price floor. Each proposal names the files it touches.

51
Findings, each with a file and line
26
On the agent side
25
On the contractor side and the shared shell
What already works, and isn't proposed again.
  • Deep links into Posted jobs that scroll to the row, ring it and open the right dialog.
  • The "what happens next" column on every job row, with the auto-release countdown.
  • Auto-release an hour after the job, with Pay now and It didn't happen.
  • The applicants dialog: sorted by fit, counter deltas, reject with a reason, one pane on a phone.
  • Address autocomplete with rooftop coordinates, and the scheduled-or-not fork.
  • Duplicate applies blocked, withdraw behind a confirm, and reapply allowed.
  • The empty board naming the nearest job beyond the radius with one-tap widening.
  • Check-in with location, a fallback when it's blocked, and device-specific steps.
  • Payout setup that turns Stripe's requirement codes into plain words.
  • Losing applicants told by email, with the reason. The 6pm day-before reminder.
A

Close the money loop

Paying for a booking sends the agent to Stripe and brings them back to Posted jobs, where nothing acknowledges what just happened. If the webhook is a few seconds behind, the job still reads "3 applied · Review", which invites a second booking. A cancelled checkout is just as silent. On the other end, signing off a finished job from the dashboard means opening the job, reading that Pay now lives under Posted jobs, going there, and finding the row.

The fix is two small things. Read the payment= parameter on return and show the result: a toast naming who was booked and what was charged, the row ringed and moved to Booked with a "Confirming payment" state that polls until the appointment exists. And put Pay now and It didn't happen on the dashboard's sign-off card and inside the appointment dialog, reusing the hooks Posted jobs already has.

why
Money is the one place a user will not tolerate guessing. This is also where a double charge could come from.
effort
Small. Two days. The hooks and dialogs exist; this is wiring and one new row state.
touches
MyListings.tsx:530-571 · ApplicationsDialog.tsx:209 · stripe-checkout/index.ts:222 · Index.tsx:726 · AppointmentDetailsDialog.tsx:555
agentphonedesktop
A · back from Stripe
Booked Rosa for Tue 10:00. $95 charged to your card.View
Booked
Showing · 12 Oak St
Rosa M. · Tue 10:00 · Confirming payment…
Open thread
Needs you
Open house · 41 Chapel Hill Rd
Finished 40 min ago · Paying Dana in 20 min
Pay nowIt didn't happen
if checkout was cancelled
Try again
B

Nobody yet

A showing tomorrow at ten with no applicants is the most urgent thing in an agent's day, and the dashboard does not show it. Needs you only knows about applicants, invites, sign-offs and holds. The calendar draws booked appointments only, so an unfilled Thursday looks like a free Thursday. And a post whose date has already passed reads "Nobody yet, and it's tomorrow" forever, because the delta check doesn't know about negative numbers.

Give unfilled posts a presence everywhere. On the dashboard, a Needs-you kind called "Nobody yet" for open posts inside 48 hours, with Raise the pay and Send to agents on the row. On the calendar, a hollow dashed mark on the day, and "Post a job for this day" on an empty day. Past-dated posts move to Done as Expired with "Repost with a new date".

why
The product's promise is coverage. The failure case of that promise should be the loudest thing on the screen.
effort
Medium. Three or four days. New NeedsYou kind, calendar marks, the expiry rule, and the repost prefill.
touches
Index.tsx:678-739 · MyListings.tsx:768-786 · Calendar.tsx:97-104, 328 · CreateService.tsx:137-151
agentdesktopphone
B · dashboard and calendar
Needs you · 3
Showing · 12 Oak St
Tomorrow 10:00 · Nobody yet · $40, typical near you is $55
Raise the paySend to agents
Open house · 8 Linden Ave
Last Saturday · Date passed
Repost with a new date
Inspection · 41 Chapel Hill Rd
3 applied · Marcus can start at the posted price
Review
calendar · week of Oct 5
5
6
7
8
9
10
11
booked you're covering nobody yetPost a job for Oct 7
C

One inbox, and a badge on the phone

An applicant asks "Can I do 11 instead?" and the only place that message exists is inside the applicants dialog, two taps deep in Posted jobs. Messages says "No conversations yet." The unread count ignores it. On a phone the tab bar has no badges at all, so nothing on the bar changes when someone applies or writes. Meanwhile five applicants on one post produce five notification rows, and dismissing one deletes it for good with no undo.

Make Messages the one inbox: an Applicants group listing application threads where the applicant wrote last, each opening the dialog on that person. Count them in the unread badge. Put that count on More in the tab bar and repeat it on the rows inside the sheet. Group notifications by job and type, load fifty, and give dismiss a five-second undo.

why
Response time is what wins bookings. Agents answer what they can see.
effort
Medium. Three days. A second query in Messages, badge rendering in the tab bar, a grouping pass on notifications.
touches
Messages.tsx:50-93 · useJobThread.ts:219 · BottomNavigation.tsx:61 · AppSidebar.tsx:168 · useNotifications.ts:31 · NotificationsPopover.tsx:55
agentcontractorphone
C · phone
Messages
Applicants · 2 your turn
Rosa M. · Showing, 12 Oak St
"Can I do 11 instead?" · 4 min
1
Marcus T. · Inspection, Chapel Hill
"On my way, parking now" · 1h
1
Booked
Dana K. · Open house, Linden
You: "Lockbox code is 4471" · Fri
Notifications
3 people applied to Showing · 12 Oak St
Review them · 2h
Open
Dashboard
Find
Post
Calendar
More5
D

Jobs come to the contractor

The board's own empty state says agents post most work the same morning they need it. A contractor finds out only by reopening the app, because none of the thirty-five email types is "a new job near you". The board also forgets its sort, radius and scope on every visit, can't filter by day or minimum pay, and lists jobs beyond the radius without letting you open them.

Add a "New jobs near me" preference with instant or a morning digest, by email or text, with a minimum pay. Put "Alert me about jobs like this" in the board header so the current ZIP, radius and type become the alert with one tap. Keep the board's chips in the URL and in local storage, add When and Min pay chips, make the beyond-radius rows open the preview, and let "Search 25 miles" also become the default.

why
Supply shows up when it hears about demand. This is the cheapest way to raise applications per post.
effort
Medium. A week. One new notification template and a trigger on listing insert, a preference row, and board state changes.
touches
notification-templates.js · EmailPreferenceSwitches.tsx:19 · FindOpportunities.tsx:108-136 · NoOpportunitiesNearby.tsx:78-111
contractorphonedesktop
D · board header
07078 · 15 miYour tradeTodayThis weekAny dayMin pay $50Nearest first ▾
12 jobs matchAlert me about jobs like this
settings · new jobs near me
Email me when a job in my trade is posted within 15 miText me too, if it's for today or tomorrowSend one morning digest instead
Only if it pays at least
$ 50
empty board · beyond your radius
Photos · Montclair
7.2 mi · Thu 2:00 · $85 to you
Open
Showing · Bloomfield
9.8 mi · Sat 11:00 · $48 to you
Open
Search 25 milesMake 25 mi my default
E

Apply with the facts in front of you

Applying is row, Open job, Apply now, Apply. The last screen shows the job's title and nothing else: no date, no distance, no pay, no agent. The app already knows when the contractor is booked (the dashboard detects overlaps and quietly skips them) but never says "this clashes with your 2pm". A contractor without payouts set up can apply freely; only the agent is told they can't be booked. And after applying, the toast says "You'll hear back soon" with nowhere to go.

Put a summary strip at the top of the apply dialog, a clash line when there is one, and a banner when payouts are off with a button that opens the setup in place. After applying: "Sent to Dana. We'll text you when she books you or passes", with View in My jobs. Once booked, flag other pending applications in the same slot with a one-tap withdraw.

why
Every unbookable or double-booked application costs an agent a day and a contractor a reputation.
effort
Small to medium. Three days. The overlap logic and the payout check both exist; they move into the dialog.
touches
ApplyDialog.tsx:95 · OpportunityPreviewDialog.tsx:146 · Index.tsx:883 · useApplications.ts:59-72, 209 · FindOpportunities.tsx:477
contractorphonedesktop
E · apply dialog
Apply for Showing · 12 Oak St
Tue Oct 7 · 10:00 to 11:00Clifton · 3.1 mi$48 to you after the feeDana K. · ★ 4.9 · usually decides in ~3h
a note for Dana (optional)
I've shown this street before, happy to arrive early.
Name my payApply at $48
Sent to Dana. We'll text you when she books you or passes. Agents usually decide same day.View in My jobs
F

Money that reads the same everywhere

Six places tell the contractor payment "comes when the agent marks it done". It doesn't; it releases an hour after the job ends unless the agent reports a problem. The wallet adds held money to available money, so "In your wallet" is a number nobody can withdraw. On the agent side, a booking whose price changed through a counter shows the posted price in the band and the charged price in the row, and the dashboard and calendar show the posted price too. An agent who only posts can see a negative wallet, because card charges are summed as outflows.

One sentence for payout timing, used everywhere, with the real release time shown on booked rows. A wallet split into Available, Pending with the job count, and Next deposit from Stripe. One helper for the agent's cost that reads the payment row, used by Posted jobs, the dashboard and the calendar. Card charges left out of an agent's balance, and a "Held for booked jobs" figure in their place.

why
Two numbers for the same job is the fastest way to lose trust in a marketplace.
effort
Small. Two days. Copy, one helper, and a wallet summary split.
touches
auto-release.ts:23 · MyOpportunities.tsx:324 · PayoutSetup.tsx:123 · MyWallet.tsx:35-47, 169 · MyListings.tsx:413, 755, 847 · Index.tsx:471 · Calendar.tsx:155
contractoragentdesktopphone
F · contractor wallet
$312
Available
$143
Pending · 3 jobs not finished yet
Oct 7
Next deposit, $312
Showing · 12 Oak St · $48
Releases Tue 12:00, an hour after it ends, unless Dana reports a problem
Pending
Photos · 8 Linden Ave · $85
Released Fri · in your Oct 7 deposit
Available
the one sentence

Released an hour after the job ends unless the agent reports a problem. Stripe deposits it in about two business days.

G

Nothing disappears without a word

A declined or withdrawn application vanishes from My jobs; the reason lives only in an email. An application for a date that has passed stays "waiting" and inflates "$X if they all say yes". The invite's Decline button opens a preview instead of declining. Going quiet rows have no action. On the agent side, cancelling an unbooked post leaves applicants to discover it gone, and marking a job Filled by hand leaves it in the wrong band with applicants unanswered.

Add "Not this time" rows to Done for thirty days, with the reason and a See similar jobs link. Label past-dated applications and leave them out of the sum. Make Decline decline, with undo. Give quiet rows Message and Withdraw. In the cancel dialog, a checkbox "Tell the 3 applicants", on by default, that rejects them with "Job cancelled". Replace the Filled select with "Covered outside Tour Dash", which moves the job to Done and tells the applicants.

why
Silence reads as rudeness. Each of these is a person left wondering.
effort
Small. Two to three days, mostly reuse of reject and withdraw hooks.
touches
MyOpportunities.tsx:94, 162, 413, 421-458, 437, 484 · MyListings.tsx:1006 · EditListingDialog.tsx:457 · CounterPriceDialog.tsx:41
contractoragent
G · both sides
Done
Photos · 8 Linden Ave
Completed Fri · $85
Paid
Showing · 3 Elm Ct
Not this time · "Went with someone closer" · Thu
See similar jobs
Open house · 22 Park Pl
Date passed, not booked · not counted in your expected pay
Clear
Cancel this post?

It comes off the board right away. Nobody was booked, so there's nothing to refund.

Tell the 3 applicants it's cancelled
Keep itCancel the post
H

A form that remembers

Press Post with three things missing and you get three toasts, one per press, and nothing on the form stays marked. The form starts blank every time: who sees it, what to pay, nothing is remembered, and leaving the page loses the draft. Tapping a preferred vendor's "Hire again" chip picks their trade and then makes you find them again on step three. The vendor form has no photo uploader, so stagers and cleaners quote blind. There is no repost, no share link on an open post, and no review prompt after a job completes.

Collect every missing field on submit and mark them inline; the footer becomes "3 things left: Date, Price, Who sees it", each a link. Default the audience and price to last time, show the typical price near you, keep the draft in session storage. Make the Hire-again chip carry the person. Add photos to the vendor form, Copy link to open public rows, Leave a review on Done rows for fourteen days, and Post again, which the post-a-job report already recommends as its direction G.

why
Heavy posters post the same job weekly. Every field they retype is a reason to text a colleague instead.
effort
Medium. A week across the two forms. No schema change.
touches
CreateService.tsx:126, 169, 248-336, 888 · SchemaForm.tsx:60 · HireProvider.tsx:185, 297, 564, 796 · MyListings.tsx:789, 820
agentdesktopphone
H · post form footer
date
Required
time
3:00 pm
price
$ 55 same as last time · typical near you $55
who sees it
Everyone nearby last time
1 thing left: DatePost it
Done
Showing · 12 Oak St
Completed by Rosa M. · Tue
Leave a reviewPost again
Out for applications
Open house · 8 Linden Ave
Sat 1:00 · public
Copy linkEdit

The full list

Everything found, including the pieces folded into the eight proposals above. The letter in the first column is the proposal it belongs to; a dash means it stands alone. Effort is S for under a day, M for a few days, L for a week or more.

#Finding and fixSideEffortIn
Fix first: a trust hole
1Anyone can review anyone. "Leave review" shows on every other profile and the database only checks the reviewer is signed in. The dialog also toasts success before the save and a second toast follows from the page. Show the button only when a completed, unreviewed job exists between the two, require the appointment on the row, mark job-linked reviews "Verified job", and let the reviewee reply.Profile.tsx:281 · ReviewDialog.tsx:50-59 · schema.sql:229-233BothM—
Money and payment
2Returning from Stripe shows nothing. Read payment=success and payment=cancelled, toast the result, ring the row, poll until the appointment exists.MyListings.tsx:530-571 · ApplicationsDialog.tsx:209AgentSA
3Signing off takes two hops and lands on instructions. Pay now and It didn't happen on the dashboard card and in the appointment dialog.Index.tsx:726 · AppointmentDetailsDialog.tsx:555-566AgentSA
4Payout timing copy is wrong in six places. One sentence everywhere, and the real release time on booked rows.auto-release.ts:23 · MyOpportunities.tsx:324 · PayoutSetup.tsx:123 · OpportunityRow.tsx:158 · OnboardingDeck.tsx:105 · MyWallet.tsx:205ContractorSF
5Wallet mixes held and available money. Available, Pending with job count, Next deposit from Stripe. Pending out of Earned.MyWallet.tsx:35-47, 169-184ContractorSF
6Agent cost disagrees after a counter. Band and headline use the posted price, the row uses the charged one; the dashboard and calendar use the posted one; one total is unformatted. One helper that reads the payment row.MyListings.tsx:413-423, 755, 847, 877 · Index.tsx:471-480 · Calendar.tsx:155, 173AgentSF
7Agent wallet can go negative. Card charges are summed as outflows. Leave them out, add "Held for booked jobs", link each line to its job.MyWallet.tsx:37, 170-178, 334-359 · statements.ts:13-17AgentSF
8Cancellation policy contradicts the Withdraw button. Settings tells contractors to ask the agent; the dialog offers self-withdraw with the $20 rule. Rewrite the settings copy to match.Settings.tsx:354-363 · AppointmentDetailsDialog.tsx:373-378ContractorS—
9Unbookable applicant can be auto-selected first. Sort payable applicants first, chip the row "Can't be booked yet", add a quick reply asking them to finish payouts.ApplicationsDialog.tsx:262-273, 317, 353AgentSE
10Contractor can apply with payouts off and isn't told. Banner in the apply dialog with setup in place; repeat in the toast.useApplications.ts:59-72 · FindOpportunities.tsx:464-493ContractorSE
11"Verified" without payouts, then the nudge disappears. Persistent banner and a dot on Wallet whenever payouts are off, independent of verification. Hide MLS and eKey from the vendor checklist.onboarding.ts:76-108 · Index.tsx:575 · MyWallet.tsx:120ContractorS—
Unfilled posts
12Past-dated open posts never expire and read "it's tomorrow". Label Date passed, offer Repost with a new date, move to Done as Expired.MyListings.tsx:768-786AgentSB
13Dashboard never shows the agent's own unfilled posts. New Needs-you kind "Nobody yet" inside 48h with Raise the pay and Send to agents.Index.tsx:176-186, 678-739AgentMB
14Calendar hides unbooked posts and has no actions. Dashed marks for Nobody yet, Post a job for this day on empty days, count completed only against past jobs.Calendar.tsx:97-104, 278-282, 328-331AgentMB
15Needs-you count is wrong and items are dropped. Each kind slices to four and the heading counts the slices. Count the totals, add "+2 more in Posted jobs".Index.tsx:679-728 · NeedsYou.tsx:54-56AgentSB
16No repost or duplicate. Post again on Done, cancelled and expired rows, prefilled with everything except the date. Direction G in the post-a-job report.MyListings.tsx:798-831 · CreateService.tsx:137-151AgentMH
Messages and notifications
17Applicant threads missing from Messages and the unread badge. An Applicants group, counted in the badge, each opening the dialog on that person.Messages.tsx:50, 93 · useJobThread.ts:219-222 · ApplicationsDialog.tsx:338-341AgentMC
18Phone tab bar has no badges, Posted jobs is buried. Count on More and on the rows in the sheet; consider giving the Find slot to Posted jobs for agents who post more than they take.mobile-nav.ts:31-37 · BottomNavigation.tsx:61-71 · AppSidebar.tsx:168-175AgentSC
19Notifications: no grouping, no limit, no undo, odd fallback. Group by job and type, load fifty, undo for five seconds, unknown types fall back to home not the wallet. Count on the bell, Jobs / Money / Messages tabs.useNotifications.ts:31-35 · notifications.ts:23-24 · NotificationsPopover.tsx:55-57BothMC
20Two composers, two send rules, lost drafts. Enter sends and Shift+Enter breaks in both; drafts kept per applicant; booking threads open scrolled to the newest message.ApplicationThread.tsx:84, 185-190 · JobThread.tsx:30-45, 121-123BothS—
21No control over applicant and message email, no urgent text. Instant or daily digest for applicants and messages; opt-in SMS when someone applies to a job inside 24h.EmailPreferenceSwitches.tsx:19-40 · Settings.tsx:195-207AgentM—
22No alerts for new jobs in my trade. "New jobs near me" preference, instant or morning digest, with a minimum pay. "Alert me about jobs like this" on the board.notification-templates.js · account.ts:107ContractorLD
The board and applying
23Board filters reset, no date or pay filter. Chips in the URL and local storage; When and Min pay chips.FindOpportunities.tsx:108-136ContractorSD
24Beyond-radius jobs can't be opened, widening doesn't stick. Rows open the preview; "Make 25 mi my default".NoOpportunitiesNearby.tsx:78-111ContractorSD
25Applying is four clicks and the last screen has no facts. Summary strip in the apply dialog, autofocus Apply, keep the preview under it.OpportunityRow.tsx:107-171 · OpportunityPreviewDialog.tsx:146 · ApplyDialog.tsx:95ContractorSE
26After applying, no next step. Name the agent, say how you'll hear, link to My jobs.FindOpportunities.tsx:477-484 · MyOpportunities.tsx:257-262ContractorSE
27Clashes never shown, double-booking possible. Reuse the dashboard overlap check in the row and the dialog; after booking, flag pending applications in the same slot with one-tap withdraw.Index.tsx:883 · OpportunityRow.tsx:68-76 · useApplications.ts:209-229ContractorME
28No availability setting. Hours and blackout dates on the profile, a "Fits my availability" board filter, "Available then" on applicants.AvailabilityPicker.tsx · EditProfileDialog.tsxContractorL—
29Can't judge the agent or the competition. "Usually decides in ~3h", "Books 80% of posts", and "N applied" on rows and previews.OpportunityRow.tsx:125-140 · OpportunityPreviewDialog.tsx:296-325ContractorM—
30No keyword search on a phone. Search icon in the sheet header that sets ?q=.AppHeader.tsx:63 · FindOpportunities.tsx:751-754ContractorS—
31One trade per contractor. Primary plus up to three more, and the board returns all of them.Signup.tsx:351-370 · account.ts:23-24ContractorM—
32Shared job link loses the job through sign-in and offers a waitlist. Carry next= through login and signup; replace the waitlist button with Create a vendor account.Job.tsx:132-138 · Login.tsx:172 · Signup.tsx:176ContractorS—
Things that vanish
33Declined or withdrawn applications vanish. "Not this time" rows in Done for thirty days with the reason.MyOpportunities.tsx:94, 149, 162ContractorSG
34Past-dated applications stay "waiting" and inflate expected pay. Label, exclude, one-tap Clear.MyOpportunities.tsx:421-458, 484-487ContractorSG
35Going quiet has no action. Message and Withdraw on the row.MyOpportunities.tsx:437-438ContractorSG
36Invite Decline doesn't decline. Call declineInvite directly, with undo.MyOpportunities.tsx:413ContractorSG
37Countering back starts blank, no way to say no. Prefill the previous ask, show both numbers, add Pass.CounterPriceDialog.tsx:41-79 · MyOpportunities.tsx:909-916ContractorSG
38Cancelling an unbooked post leaves applicants hanging. "Tell the N applicants" checkbox, on by default.MyListings.tsx:1006-1016AgentSG
39Manual "Filled" lands in the wrong band. Replace with "Covered outside Tour Dash", which moves to Done and rejects applicants.EditListingDialog.tsx:457-464 · MyListings.tsx:390-392AgentSG
40Property hub rows don't open, delete has no confirm. Link rows to the job, undo toast on delete.Property.tsx:262-290, 383AgentS—
Forms
41Validation is toast-only, one field at a time. Mark every missing field inline; "3 things left" footer with links.CreateService.tsx:248-336, 888-896 · SchemaForm.tsx:60-105 · HireProvider.tsx:191-214AgentSH
42The post form remembers nothing. Last audience, last price per type, typical near you, draft in session storage.CreateService.tsx:126, 169 · create-service-schema.ts:159-178AgentMH
43"Hire again" forgets the person. The chip should carry the provider, like the ?provider= deep link does.HireProvider.tsx:103-105, 185-189, 564AgentSH
44Hire flow on a phone: action at the bottom of the page. Sticky bar with the summary and the primary action below xl.HireProvider.tsx:796AgentSH
45Vendor form can't take photos. Reuse the uploader from the showing form.HireProvider.tsx:297 · CreateService.tsx:852-884AgentSH
46Posted jobs has no search or sort, Done grows forever. Search box, type filter, last ten Done rows with Show older.MyListings.tsx:798-831, 884-890AgentS—
47No share link on an open public post. Copy link, or the share sheet on a phone.MyListings.tsx:789-792 · Job.tsx:40-53AgentSH
48No review prompt after a job. Leave a review on Done rows for fourteen days, and in the Job complete toast.MyListings.tsx:458-465, 820AgentSH
49Signup gaps. Generic "fill in all fields", the licence agreement isn't linked, the typical rate doesn't say before or after the fee.Signup.tsx:121, 464-471, 549-552ContractorS—
50Onboarding ends at the dashboard, not the work. Vendor's last card becomes "See N jobs near you", with a text-me toggle and a radius check. The deck only runs on mobile.OnboardingDeck.tsx:214, 386-460ContractorSD
51Dead component. OpportunityCard is imported only for its type and never rendered. Move the type and delete it.OpportunityCard.tsx · OpportunityRow.tsx:14—S—

What I'd run with

Fix the review hole first, then ship A, F and G in one week. Those three are small, touch money and trust, and need no new tables. Together they make the app stop lying about numbers and stop going silent on people.

B and C are the second week. They put the two most urgent facts, an unfilled job and a waiting applicant, where the agent actually looks: the dashboard, the calendar, Messages and the phone's tab bar.

E, then D, then H. E makes applying safer on the contractor side. D is the one with a backend piece, the new-job trigger, and it's the one most likely to move applications per post. H is the week of form work, and it folds in the repost the post-a-job report already asked for.

  1. Week one. Finding 1, then A, F, G. Twelve findings closed.
  2. Week two. B and C. Seven more.
  3. Week three. E and the small singles: 8, 11, 20, 30, 32, 40, 46, 51.
  4. Week four. D, with the trigger and the preference row.
  5. Week five. H. Then the two larger singles, availability (28) and multiple trades (31), as their own decisions.

What stays the same

  • The data model, the cents invariant, the fee math, the $25 floor and the auto-release hour.
  • The band structure on Posted jobs and My jobs. New rows join existing bands.
  • Design tokens. Every mock here uses the app's light tokens and the hollow-ring shape for contractor work.

Open questions for you

  • Should "Tell the applicants" on cancel be on by default, or always on with no checkbox?
  • For the phone tab bar, does an agent who never takes jobs still need Find in a top slot?
  • New-job alerts by text: is the 10DLC registration done, or is this email only for now?
  • Multiple trades per contractor changes who sees what on the board. Worth it now, or after launch?

Not in this report

The Shelf marketplace, the admin page, the lead board and the landing page. The Shelf is mid-build in a separate session and the other three each have a directions report already.