{{ crumbRoot }} {{ crumbLeaf }}
{{ acctName }}
{{ acctMeta }}
Same account, same records — the role decides the interface
10:44
Ascend
{{ mWho }}
{{ mRoleNote }}
{{ mInit }}
{{ mJob }}
{{ mJobMeta }}
{{ mPhase }}
{{ ms }}
{{ mUndoText }}
Announcements
{{ man.title }}
{{ man.body }}
{{ man.by }} · {{ man.when }}
Today's scope
{{ mScopeLine }}
{{ mt.label }} {{ mt.sub }} {{ mt.chip }}
On this job
{{ mScopeLine }}
{{ mt2.label }} {{ mt2.sub }}
{{ mq }}
{{ mAnswer.q }}
{{ mAnswer.a }}
{{ mAnswer.src }}
{{ mAskNote }}
{{ ma.t }} {{ ma.s }}
{{ mSheetTitle }}
{{ mbr }}
No open RFIs on this job.
Attachments
{{ rf.label }}
Uploading…
Information
{{ rfiError }}
Loading plans…
No plans on this job yet. The office uploads them under Estimate → Plans.
{{ pl.label }}{{ pl.meta }} Open
{{ matError }}
{{ mSheetNote }} The office is alerted the moment you send it.
Requests on this job
{{ mrq.id }} · {{ mrq.title }}{{ mrq.status }}
{{ mHoursTotal }} · the office sees the same entries under Schedule → Time clock.
Loading…
No clock-ins yet. Tap Clock in on a job and it shows here with the time in and out.
{{ hr.day }} · {{ hr.job }}{{ hr.span }} {{ hr.hrs }}
Customer
Job · {{ mPropLinked }}
{{ mPropError }}
Saves a draft on the company account with your branding. Preview, print / PDF and send for signature from Proposals on the desk.
{{ mSheetNote }}
Speak or type what happened
Dictation only — it transcribes, it never interprets. Works with no signal.
Captured unpriced. Pricing and submission stay a deliberate act by someone who can price it.

{{ project.name }}

{{ project.meta }}
Current phase
{{ curPhaseName }}
{{ job.pct }}

Good morning, Jorge

{{ todayLong }} · Spring Creek, NV · {{ liveLine }}
{{ k.ring }}
{{ k.value }}
{{ k.note }}
{{ k.ringNote }}
Announcements
{{ da.title }}
{{ da.body }}
{{ da.by }} · {{ da.when }}
Continue working
same workspace, opened where you left it
{{ u.title }}
{{ u.meta }}
{{ u.age }}
Nothing urgent. Anything you or anyone on the account raises from Quick notes lands here — yours to answer, or theirs if you raise it for them.
{{ urgentMessage }}
My Day
{{ agendaDayLabel }}
{{ agendaCount }}
{{ agendaMessage }}
Nothing written down for this day yet. Type a line above -- anything still open at the end of the day moves onto tomorrow on its own.
{{ a.body }}
{{ a.meta }}
{{ a.carried }}
Ascend flagged · {{ todoCount }}
{{ t.title }}
{{ t.meta }}
{{ t.tag }}
Who's on what · {{ agendaDayShort }}
{{ o.crew }} — {{ o.job }}
{{ o.phase }} · {{ o.hrs }}
Nobody scheduled for this day yet.
Cash flow
All jobs · Aug
{{ m.label }} {{ m.value }}
Jobs
{{ dashActiveN }} active {{ dashBiddingN }} bidding
JobPhaseProgressNext milestoneContract
{{ dashJob.name }}
{{ dashJob.client }}
{{ dashJob.phase }}
{{ dashJob.pct }}
{{ dashJob.next }} {{ dashJob.value }} {{ dashJob.tag }}
Today on site
{{ dashCrewNote }}
{{ c.time }}
{{ c.title }}
{{ c.meta }}
Permits & inspections
{{ p.title }}
{{ p.meta }}
{{ p.tag }}
Quick notes
{{ noteCount }}
Marked urgent, it goes to Urgent matters at the top of the sidebar instead of the note list — on your board, or on theirs if you raise it for someone else. Anyone on the company account can raise one for you the same way.
{{ n.text }}
{{ n.when }}
{{ n.target }}
{{ dashCalTitle }}
All jobs · {{ dashCalMeta }}
{{ d }}
{{ d.num }}
{{ e.label }}
{{ estJobLabel }} {{ estJobMeta }} Preconstruction · this estimate belongs to the opportunity, not to a project
{{ g.client }} {{ g.count }}
{{ estStepLabel }} · the full workflow lives in Estimate Summary
Plan set Sheet Plan loaded
48.2 LF · 2" CW 62.0 LF · 4" SAN 38.3 LF · 15" RCP
{{ toZoomLabel }}
{{ toPageLabel }}
Drawings on this job · {{ planJobName }}
Uploading…
{{ planError }}
Open a job created in Ascend to upload its drawings. The crew sees them on their phone under Plans.
No drawings yet. Upload the plan set (PDF, images or DWG) — every sheet becomes viewable and downloadable for the crew on this job.
{{ pd.label }}{{ pd.meta }} View
Plan sets
SetContentsRevisionDepends on itState
{{ p.name }} {{ p.sheets }} {{ p.rev }} {{ p.lines }} {{ p.state }}
This screen manages sets and revisions. You switch between them inside Takeoff, where the viewer is the workspace — a superseded revision is kept, and any line taken off it is flagged rather than silently changed.
More on this estimate
Each opens as a drawer over the work you are doing and returns you to it. None is a tab, and none is a place to navigate to.
{{ g.client }} {{ g.count }}
{{ pick.takeoff }} {{ pick.state }}

{{ job.name }}

{{ job.phase }} {{ job.tag }}
Job {{ job.job }} · {{ jobAddress }} · {{ job.client }}
Delete this job and everything logged on it?
PO{{ job.po }} Contact{{ job.contactName }} {{ job.contactEmail }} {{ job.contactPhone }}
PM {{ jobPm }} Superintendent {{ jobSuper }} Foreman {{ jobForeman }} Crew {{ c.i }}
{{ s.label }}
{{ s.value }}
{{ s.sub }}
Progress {{ job.pct }}
Next: {{ job.next }}
Scope of work
everyone assigned to this job reads this in Crew View
{{ scopeError }}
{{ scopeHint }}
Project lifecycle
{{ lifeNote }}
Scope template
Phases are configurable per job. Any phase can be marked not applicable or performed by others — excluded from progress, budget and audit.
Click any phase to load it below — this never leaves the project.
{{ phTitle }}
{{ phSub }}
Proposal
{{ jobProp.id }} {{ jobProp.amount }} {{ jobPropStatus }} {{ jobPropRev }} · {{ jobProp.origin }}
{{ d.label }} {{ d.value }}
{{ l.label }}{{ l.value }}
Contracted — signed by {{ jobPropSigner }}. Original contract value set, this phase closed automatically, executed proposal archived to Groundwork.
This phase closes on signature, not on sending. Nothing to check off.
Previous revisions
{{ r.label }} {{ r.note }} {{ r.on }}
Proposal activity
{{ l.day }} {{ l.text }}
No proposal on this job yet
Create one and it attaches to this project automatically.
Today's scope {{ phScopeSetBy }}
{{ phCounts.total }} tasks · {{ phCounts.done }} complete · {{ phCounts.blocked }} blocked · {{ phCounts.left }} remaining {{ phCrewLine }}
{{ t.label }} {{ t.chip }}
No tasks assigned for today on this phase.
Needs attention
{{ n.label }}
{{ n.meta }}
Budget vs. actual — this phase
{{ phSpent }} {{ phOf }}
{{ b.label }}{{ b.value }}
Labor — {{ phLabor }}
{{ phLaborNames }}
{{ a.label }} {{ a.count }}
Phase activity
{{ a.when }} {{ a.text }}
Job records
Change orders, RFIs and back charges on this job — {{ recTotal }} logged {{ syncError }} Sample job — records here are not saved
{{ g.label }}{{ g.summary }}
Nothing logged yet.
{{ r.id }} {{ r.title }}{{ r.on }} · {{ r.detail }} {{ r.status }}{{ r.amount }}
How {{ pbClient }} works
{{ pbSummary }}
{{ f.label }}
{{ f.value }}
{{ f.hint }}
Bids & buyout
ScopeSubDueAmountvs. estimateStatus
{{ b.scope }} {{ b.sub }} {{ b.due }} {{ b.amount }} {{ b.delta }} {{ b.status }}

Projects

{{ projCount }} · {{ projSummary }}
Group by
No projects yet. Create the first one with New project, or push a contract through from the Pipeline.
{{ p.name }}
{{ p.job }} · {{ p.addr }}
{{ p.phase }}
{{ p.pct }}
{{ p.contract }} {{ p.billed }} billed {{ p.next }} {{ p.tag }} Delete this job?
Project Client Phase Progress Contract Billed Margin Next milestone Status
{{ p.name }}
{{ p.job }} · {{ p.addr }}
{{ p.client }} {{ p.phase }}
{{ p.pct }}
{{ p.contract }} {{ p.billed }} {{ p.margin }} {{ p.next }} {{ p.tag }}
{{ rangeTitle }}
{{ rangeMeta }}
{{ scheduleError }}
{{ d }}
{{ d.num }}
{{ e.label }}
{{ d.dow }}
{{ d.num }}
{{ d.count }}
{{ e.time }}
{{ e.name }}
{{ rangeMeta }}
Nothing scheduled this day. Tap Schedule work to assign a crew or a person to a job.
{{ h.hour }}
{{ e.time }} {{ e.name }}
Time clock
every clock-in and clock-out from the crew's phones · {{ tcSummary }}
When someone clocks in on Crew View it shows here with the job, the time in, the time out and hours worked.
EmployeeJobDayInOutHoursPhaseCost
{{ tr.init }}{{ tr.who }}{{ tr.task }}
{{ tr.job }} {{ tr.day }} {{ tr.inAt }} On the clock{{ tr.outAt }} {{ tr.hrs }}{{ tr.brk }} {{ tr.phase }} {{ tr.cost }}

Proposal & Scope

{{ job.name }} · {{ job.job }} — the company proposal record, filtered to this job

{{ jobProp.id }}

{{ jobPropStatus }} {{ jobPropRev }} · created in {{ jobProp.origin }}
{{ jobProp.client }} Signs: {{ jobPropContact }} {{ jobProp.email }}
Amount
{{ jobProp.amount }}
Scope & pricing
{{ l.label }}{{ l.value }}
Total{{ jobProp.amount }}
Dates
{{ d.label }}{{ d.value }}
Signed & contracted
Signed by {{ jobPropSigner }}
{{ t }}
Previous revisions
{{ r.label }}{{ r.on }}
{{ r.note }}
Activity
{{ l.day }} {{ l.text }} {{ l.rel }}
No proposal on this job yet
A proposal created in the Estimator, here, or from the field attaches to this project on its own.
Quick proposals and estimator-generated proposals, in one place — shared across the whole company. Preview, print / PDF, send for signature and track every status.
{{ propNote }}

{{ prop.id }} · {{ propTitle }}

{{ propStatusLabel }}
{{ prop.client }} Signs: {{ propContact }} {{ prop.job }} {{ propRevLabel }} Created in {{ prop.origin }}
Amount
{{ prop.amount }}
Sending…
{{ propNote }}
Status
{{ s.label }}
{{ s.when }}
Sending does not complete the Proposal & Scope lifecycle phase. A valid signature does — it contracts the proposal and advances the job with no one clicking anything.
Scope & pricing
{{ propRevLabel }}
{{ l.label }}{{ l.value }}
Total{{ prop.amount }}
Client & project
{{ prop.client }}
{{ propContact }}
{{ prop.email }}
{{ prop.job }} · {{ prop.addr }}
Signed & contracted
Signed by {{ propSigner }} · {{ propSignedOn }}
Contracted on the same event · executed PDF and signature record immutable
{{ t }}
Activity
{{ l.day }} {{ l.text }} {{ l.rel }}
New proposal
Which job is this for? Pick one and Ascend fills in the client, address, contacts, job number and any estimate already on it.
or
A proposal with no project yet — signing it creates the job.
New proposal · {{ propDraft.name }}
Filled from the job — nothing retyped
Client / GC{{ propDraft.client }}
Job number{{ propDraft.job }}
Address{{ propDraft.addr }}
Branding{{ companyName }}
Scope of work
{{ g.phase }}
• {{ i }}
Pricing
Total{{ ppTotal }}
Terms, exclusions, validity and the letterhead come from Settings → Company → Proposal branding. Override them on this proposal only if you need to.
{{ ppError }}
Sent. Signing link (also emailed if mail is configured):
Saving…
Ask AscendReads your jobs, crew, schedule and records
Ask about anything on this company — a job, who is where, what is outstanding, hours, what the crew reported. It looks it up rather than guessing, and it will tell you when it finds nothing.
{{ am.content }}
{{ lk.label }}
{{ am.content }}
{{ pp.kind }} · draft, not sent
{{ pp.title }}
{{ pp.body }}
Looking it up…
{{ askError }}
It can draft, but it never sends or changes anything on its own.

Permits & Inspections

{{ pbSubtitle }}
{{ s.v }}
{{ s.k }}
{{ s.sub }}
{{ pbMessage }}
Loading…
New permit
It starts as not pulled yet. Everything else — fee, dates, what you are waiting on — goes in from the card.
{{ newPermitError }}
No jobs to show yet. Every job gets a permit row and its own inspection ladder — pick a job below and add its permit to start one.
{{ j.jobNumber }}
{{ j.permitPill }} Blocking work {{ j.attentionLabel }}
{{ j.permitTitle }}
{{ j.permitMeta }}
Waiting on: {{ j.waitingOn }}
{{ d.label }} {{ d.where }}
No permit on this job yet.
No inspections set up. Every job runs underground, rough-in and final — extras get added on top.
{{ n.title }}
{{ n.meta }}
{{ n.correctionLabel }} {{ n.pill }}
Result
{{ d.label }} {{ d.where }}
Correction list
{{ n.correctionSummary }}
{{ c.body }}

Inbox

Everything the field sent across every job — material requests, changes, back charges, RFIs, issues and end-of-day reports — with their photos and video. Approve, decline, or write back.
{{ inboxSummary }}
{{ inboxError }}
Loading the queue…
{{ inboxError }}
Nothing waiting on you. When the crew asks for material, raises a change, files a back charge or an RFI, reports an issue or sends an end-of-day report, it lands here with whatever they photographed.
Thread — the crew reads this on their phone
{{ tc.who }} · {{ tc.when }}
{{ tc.body }}
{{ inboxMediaLabel }}
{{ inboxMediaLabel }} · click anywhere to close

Notifications

Everything submitted on the account that you asked to hear about, and the announcements everyone sees. Choose what alerts you in Settings → Alerts.
Alerts
newest first · click one to open the job
Nothing yet. When the crew asks an RFI, raises a change, requests material, uploads photos or plans — or someone is scheduled — it lands here for the people who asked to be alerted.
Announcements
everyone on the account sees these — desk and phone
{{ annError }}
{{ an.title }} Pinned
{{ an.body }}
{{ an.by }} · {{ an.when }}

Settings

Who can do what on this account, and how proposals are branded.
Team & permissions
Roles set the defaults · the account holder grants or withholds the rest per person
Desk PM — change orders, RFIs and their answers, proposals, scheduling, approvals
Superintendent — photos, potential changes, RFIs, scheduling
Foreman — photos, potential changes, RFIs
Field — photos and field notes
Alerts
What lands on your bell and in Notifications · each person sets their own
Alert me on everything
Every submission on the account — RFIs, changes, material requests, photos, plans, schedule changes, announcements, daily reports.
Alert settings need database migration 0019 — run it in Supabase and reload.
{{ ae.label }} {{ ae.state }}
The person a schedule entry is for, and the person who asked an RFI that gets answered, are always alerted regardless of these settings.

Company · Proposal branding

Set once. Every proposal, from any of the three entry points, is built with it.
Letterhead
Company logo
{{ b.label }}{{ b.value }}
Defaults applied to every proposal
{{ b.label }}
{{ b.value }}
Any of these can be overridden on a single proposal without changing the company default.
All projects · {{ finLabel }}
{{ t.k }}
{{ t.v }}
{{ t.sub }}
Nothing billed or spent in this period.
ProjectBilledLaborMaterial & subsCostGross
{{ r.name }}
{{ r.num }} · {{ r.phase }}
{{ r.billed }} {{ r.labor }} {{ r.other }} {{ r.cost }}
{{ r.gross }}
{{ r.pct }}
Billing comes from the invoices, labor from the clock, material and subs from the cost rows — all dated, so every period is the same query over a different range. Each project's own Financials is this filtered to one job.
Change orders submitted to you
{{ subReviewCount }} awaiting review
{{ q.id }} {{ q.desc }} {{ q.from }} · {{ q.job }} · {{ q.on }} {{ q.amount }} Reject Approve
A subcontractor with access to a job can submit a change order against it. Approving one adds it to that project's committed cost — it never touches your contract with the client, which only your own outbound change orders move.
{{ b.label }}
{{ b.value }}
{{ b.sub }} · {{ b.count }}
{{ b.delta }}
Billed by week
All jobs · last five weeks
{{ w.value }}
{{ w.label }}
Invoices
{{ invCaption }}
InvoiceJobDateAmountStatus
{{ i.num }}
{{ i.job }}
{{ i.client }}
{{ i.date }}
{{ i.rel }}
{{ i.amount }} {{ i.status }}

Team

Roster · schedule · job assignments · labor cost
{{ clashLine }} — the same person is booked on two jobs at overlapping times. Review
{{ e.init }}
{{ e.name }}
{{ e.role }} · {{ e.rateLabel }}
{{ e.todayLine }}
{{ e.certLine }}
{{ schedTitle }}
Worker {{ h.label }}
{{ l.init }} {{ l.name }} {{ l.role }}
Click to schedule
{{ b.job }}
{{ b.time }} · {{ b.label }}
{{ b.clashNote }}
{{ b.early }}, before this view
{{ b.late }}, past this view
Shown 6 AM to 8 PM. A shift outside that window is clamped to the edge and says so, rather than shrinking to an unreadable sliver.
{{ c.d }} {{ c.n }}
{{ c.hrs }}
{{ p.who }} {{ p.time }}
{{ d }}
{{ c.n }}
{{ p.who }} {{ c.more }}
Alerts to the crew
Raised by the change itself
{{ a.verb }} · {{ a.who }} {{ a.detail }} {{ a.at }} {{ a.state }}
Notifications
Per person
{{ n.init }} {{ n.name }} {{ n.note }}
Turning someone off suppresses delivery, not the record — the alert still exists and they see it when they next open Ascend. Cancellations and next-morning changes always push regardless.
What they see
Nothing scheduled for {{ crewPeekName }}.
{{ r.when }} · {{ r.time }} {{ r.badge }}
{{ r.job }} · {{ r.phase }}
{{ r.addr }} · {{ r.task }}
This is the crew's own schedule on their phone — the same assignment records, filtered to them. Nothing is copied anywhere.
Assignments carry a project and a phase, so scheduling a crew here is the same record Daily Scope and the crew's phone read. Dates are built locally — the day never rolls over early in the evening.
{{ s.label }}
{{ s.value }}
{{ s.sub }}
Roster
Pay rates are visible to owners and admins only
EmployeeRoleRateOnHours this weekLabor costStatus
{{ e.init }} {{ e.name }} {{ e.certLine }}
{{ e.role }}
{{ e.rateLabel }}
{{ e.rateSince }}
{{ e.onJob }}
{{ e.onJobSub }}
{{ e.hrsLabel }} {{ e.cost }} {{ e.status }}
Labor cost by job
JobPhaseCrewHoursCostAgainst allowance
{{ l.job }} {{ l.phase }} {{ l.crew }} {{ l.hrs }} {{ l.cost }}
{{ l.pct }}
{{ l.budget }}
Clock entries carry a project and a phase, so approved hours × the rate in force on that date become labor cost in that phase's Financials. A raise never rewrites a closed month.

Suppliers

Price lists on file, and plan sets matched against them
Quotes received
{{ quoteCount }} · {{ committedLine }}
QuoteSupplierProjectTotalReceivedStatus
{{ q.id }}
{{ q.docSub }}
{{ q.sup }}
{{ q.job }}
{{ q.phase }}
{{ q.totalLabel }} {{ q.on }} {{ q.status }}
A quote belongs to a project, not to a supplier folder — clicking one opens that job's Groundwork, where the PDF is filed under 12 Supplier Contracts.
SupplierTradeRepPrice itemsUpdatedTermsQuotes
{{ s.name }} {{ s.trade }} {{ s.rep }} {{ s.items }} {{ s.updated }} {{ s.terms }}
{{ s.quotes }}
{{ s.quoteSub }}
Quote from plans · Ferguson · 4440 Bonnie Loch Ct
Read from P2.1 & P3.1 · 6 lines extracted
{{ supReviewLine }}
A match below 85% confidence is not counted in the total. Confirm it, correct it, or price it by hand — the quote cannot be sent while anything is unresolved.
From the plansQtyMatched toConfidenceUnit priceLine totalState
{{ l.desc }}
{{ l.src }}
{{ l.qtyLabel }} {{ l.matchLabel }} {{ l.confLabel }} {{ l.priceLabel }} {{ l.total }} {{ l.state }}
{{ supPricedCount }}
Priced so far {{ supQuoteTotal }}
Quantities come from the plan set, not from a default of one — a quote without takeoff quantities cannot be sent to anybody. Accepting this quote writes the priced lines into the project's estimate against the same assemblies.
New opportunity
Reference {{ noRef }} · starts as a Lead. Move it along the board as the bid, proposal and contract come in; an executed contract becomes a project.
Contact
{{ noError }}
New project
Job number {{ npJob }} · next in sequence. The project opens in Estimating; start the takeoff from its overview.
Primary contact
Proposals and change orders on this job go to this contact.
{{ npError }}
Upload a supplier quote
Drop the quote PDF
Or photograph a printed quote from the field
Which job is this quote for?
The quote is attached by project id, so renaming the job later never orphans it.
Line items
Enter them by hand, or let Ascend read the PDF and match each line against this supplier's price list. Extracted lines always show a confidence score and a quantity from the document — nothing is priced at a quantity of one.
Read the PDF Enter by hand Total only, no lines
Saving this puts it on {{ quotePickedName }}
{{ t }}
Saving for review files the document and the record but leaves committed cost alone. Accepting commits the money.

Groundwork

{{ job.name }} · {{ auditFileLine }}
{{ auditBadge }}
{{ s.v }}
{{ s.k }}
{{ s.sub }}
Audit readiness
{{ auditReqLine }}
{{ c.label }} {{ c.note }}
The checklist reads the folders. There is no separate box to tick — a document in Permits is what satisfies the permit requirement, so the badge can never disagree with what is actually on file.
The job template · {{ folderCount }} folders
Drop a file on a folder, or open one to add a document
Drop photos here, or they arrive from the field
Tag the phase and what it shows — that is what makes it findable a year from now
{{ p.cap }}
{{ p.by }} · {{ p.when }}
{{ p.phase }} {{ p.tag }}
{{ photoNote }}
{{ d.name }} {{ d.who }} {{ d.when }} · {{ d.size }}
Nothing on file yet — drop a document here, or add one below.
The same template on every job, so an auditor asks once and you look in one place. Folders fill themselves — a signed proposal, a change order, a supplier quote, an inspection result and a service work order all file here the moment they exist.
Recent job activity
Nothing filed on this job yet.
{{ f.name }} {{ f.folder }} {{ f.when }} {{ f.size }}
{{ a.t }} {{ a.what }} {{ a.who }} · {{ a.src }}
Written by the work itself — clock-ins, task completions, signatures and connected inspection results all land here without anybody keeping a log.

Contracts & Change Orders

{{ job.name }} · {{ job.job }}
Contract
the signed agreement for this job, and who on the crew can open it
Uploading…
{{ ctError }}
{{ cd.label }}Uploaded {{ cd.when }} Crew View:PM Open
No contract file on this job yet. Upload the signed PDF, or create one for signature — an executed proposal below is the contract.
Proposals & contracts sent for signature on this job
Crew View shows contracts only to the roles you tick — the PM always sees them. Plans uploaded on this job are visible to everyone scheduled on it.
{{ c.k }}
{{ c.v }}
{{ c.sub }}
Your change orders to the client
Nothing raised against this contract.
#DescriptionAmountStatusRaisedSource
{{ c.id }} {{ c.desc }} {{ c.amountLabel }} {{ c.status }} {{ c.on }} {{ c.src }}
Only an approved change order moves the contract value. A potential change from the field sits here unpriced until someone who can price it does.
Change orders submitted to you
{{ inSummary }}
No subcontractor has billed extra work on this job.
#FromDescriptionAmountStatusReceived
{{ c.id }} {{ c.from }} {{ c.desc }} {{ c.amountLabel }} {{ c.status }} {{ c.on }}
Anyone you give access to this job can submit a change order against it. Approving one raises committed cost, not the contract — if it should be passed on to the client, raise your own change order above and the two stay linked.
Subcontractor work orders
{{ subWoSummary }}
No subcontracted work on this job.
#ScopeToBasisValueStatus
{{ w.id }}
{{ w.title }}
{{ w.phase }} · {{ w.dates }}
{{ w.who }} {{ w.basis }} {{ w.totalLabel }} {{ w.status }}
A work order is what gives a sub access to this job — and the only thing it lets them do is submit a change order against it. Accepting one moves committed cost; it never touches your contract.
Service work orders
No service calls on this job.
#Work performedByOn siteBillableStatus
{{ w.id }}
{{ w.title }}
{{ w.reported }}
{{ w.who }}
{{ w.window }}
{{ w.hrsLabel }} · {{ w.parts }}
{{ w.totalLabel }} {{ w.status }}
{{ w.signer }}
Time and material work with no contract behind it. The customer signs on the phone before the tech leaves, and that signature is what makes it billable — hours and parts become an invoice line without anybody retyping them.
Signed paperwork
Nothing executed on this job yet.
{{ f.name }} {{ f.folder }} · {{ f.who }} {{ f.when }}

Financials

{{ job.name }} · every figure below is the sum of this job's own records
{{ s.label }}
{{ s.value }}
{{ s.sub }}
Cost by phase
PhaseLaborMaterial & subsTotal
{{ p.phase }} {{ p.labor }} {{ p.other }} {{ p.spend }}
What is committed
Subcontracts and material POs
ScopeToKindAmount
{{ c.what }} {{ c.to }} {{ c.kind }} {{ c.amount }}
Billing on this job
Nothing billed on this job yet.
InvoiceRaisedDateAmountStatus
{{ i.num }} {{ i.rel }} {{ i.date }} {{ i.amount }} {{ i.status }}
Client preview · {{ coDoc.no }}
what {{ coOnJob.who }} opens · nothing internal is on it
{{ companyName }} sent you a change order to review and sign · {{ coDoc.job }} Review & sign
YOUR LOGO
from Settings → Company
Contract modification document
Change Order
{{ coDoc.no }} · {{ coDoc.date }}
{{ m.k }}
{{ m.v }}
1 — Description of change
{{ coDoc.desc }}
2 — Cost breakdown
Item
Labor
Material
Total
{{ l.item }}
{{ l.labor }}
{{ l.material }}
{{ l.total }}
Total — this change order {{ coTotal }}
Labor at contract rates; material at supplier cost plus standard markup unless noted.
3 — Contract summary
{{ r.k }} {{ r.v }}
Schedule impact None Add ___ days Deduct ___ days
4 — Approval
This change order becomes part of and is subject to all terms of the original contract; work shall not proceed until signed by all parties.
Jorge A. Ontiveros
Ascend Mechanical — authorized signature
Jorge A. OntiverosPrinted name {{ coDoc.date }}Date
Owner / general contractor
{{ coSigned.who }}
{{ coSigned.who }}Printed name {{ coSigned.on }}Date
Fully executed — no action needed
Owner / general contractor
Sign here
Printed name Date
Sign & accept Request a change
This change has no cost breakdown yet, so it cannot be sent for signature. A client never sees an unpriced change order.
{{ coFooter }}
{{ n }}
Change order sheet · {{ coDoc.no }}
Executed
Signed by {{ coSigned.who }} · {{ coSigned.on }} {{ coExecutedStamp }}
An executed change order is not editable and is not sent again. To change what it covers, raise a new change order against the contract it created.
Out for signature
Sent to {{ coOnJob.who }} · {{ coOnJob.email }}
Locked while it is out — a client cannot be signing one version while you edit another. Withdraw it to make changes.
Send to
{{ coOnJob.co }} · {{ coOnJob.who }} {{ coOnJob.email }} · on file for this job
Or look up a builder
{{ r.co }} · {{ r.who }} {{ r.email }} {{ r.role }}
Or a one-off address
A one-off address is recorded on the change order as who it went to, so the audit trail does not lose it. Sending does not approve anything — the contract moves when it comes back signed.
The sheet
{{ coStatusNote }}
Drop your logo
Settings → Company
Contract modification document
Change Order
{{ m.k }}
{{ m.v }}
1 — Description of change
{{ coDoc.desc }}
Raised from {{ coDoc.src }} · dictate or type. Photos attached to the change travel with the sheet.
An unpriced potential change from the field. Add the labor and material below and the sheet completes itself — it cannot be sent until it has a price.
2 — Cost breakdown
Item
Labor
Material
Total
{{ l.item }}
{{ l.labor }}
{{ l.material }}
{{ l.total }}
Add line
Total — this change order {{ coTotal }}
Labor at your master pricing rates; material at supplier cost plus standard markup unless noted. The total is the sum of these lines — it is not entered.
3 — Contract summary
{{ r.k }} {{ r.v }}
Schedule impact None Add ___ days Deduct ___ days
Every figure here reads the job — the original contract, the changes already approved, and this one. Nothing on the sheet is typed twice.
4 — Approval
This change order becomes part of and is subject to all terms of the original contract; work shall not proceed until signed by all parties.
{{ g.label }}
Printed name Date
{{ coFooter }}
{{ pipeSel.id }} · {{ pipeSel.stageLabel }}
{{ pipeSel.name }}
{{ pipeSel.client }} · {{ pipeSel.contact }} · {{ pipeSel.addr }}
Value
{{ pipeSel.valueLabel }}
{{ pipeSel.valueSrc }}
Bid due
{{ pipeSel.dueLabel }}
{{ pipeSel.src }}
Proposal
{{ pipeSel.propLabel }}
{{ pipeSel.trade }}
Estimator
{{ pipeSel.estimator }}
Chasing it
{{ pipeSel.owner }}
Last contact
{{ pipeSel.contactLabel }}
Next action · follow up {{ pipeSel.followLabel }}
{{ pipeSel.next }}
Converted
Became project {{ pipeSel.pid }} — operations owns it now
An opportunity converts once and is then read-only. A scope change after this is a change order against the contract, not an edit to the pursuit that won it. Re-bidding the same building next year is a new opportunity linked to this one.
Contract and project handoff
Conditions this company requires
{{ p.k }} {{ p.v }}
The new job
{{ n.k }} {{ n.v }}
Carried, not copied
{{ c }}
{{ selContractLine }} — a project is created only after the contract is executed by both parties. An award without a signed contract is not ready to schedule.
A condition is outstanding. Converting anyway needs a reason, which is recorded on the job — real work does start before the paperwork lands, and the record should say so rather than pretend.
Every condition this company requires is met. Creating the job assigns the next job number, sets the original contract from the executed contract, and moves the estimate, proposals, contract and files onto it — nothing is copied.

Pipeline

Every pursuit from lead through contract, then into a project
{{ s.v }}
{{ s.k }}
{{ s.sub }}
Needs attention
{{ a.what }} {{ a.who }} {{ a.rule }} {{ a.act }}
Each is a rule over dated fields — bid due, sent, awarded, contract received, follow-up — so an item raises and clears itself. Follow-up is an activity at any stage, never a stage of its own.
{{ g.stage }}
{{ g.count }} · {{ g.value }}
{{ g.emptyNote }}
Dragging a card sets its stage and asks for whatever that gate needs — an award date, a contract, a no-bid reason. A stage cannot be skipped silently, and an empty stage does not show a column.
OpportunityBid dueTakeoffEstimateApprovalValueNext action
{{ opp.name }}
{{ opp.who }}
{{ opp.stage }} {{ opp.substate }}
{{ opp.dueLabel }}
{{ opp.overdue }}
{{ opp.takeoff }} {{ opp.estStep }} {{ opp.approval }}
{{ opp.valueLabel }}
{{ opp.valueSrc }}
{{ opp.next }}
{{ opp.estimator }}
This is the whole estimating workload — takeoff, estimate step and approval on the row, so there is no second dashboard. Clicking a row opens that opportunity's workspace where you left it. Sorted by bid due date — the only unforgiving deadline in bidding is the one you miss. Value reads what we bid where a proposal exists and the GC's own number before that, labelled so the two are never confused.

Leads

Everything before it is an opportunity — a call, a bid invite, a referral
{{ s.v }}
{{ s.k }}
{{ s.sub }}
All leads
WhoWhat they wantPossibleNext actionStatus
{{ l.who }}
{{ l.co }}
{{ l.what }}
{{ l.id }} · {{ l.src }} · {{ l.when }}
{{ l.valueLabel }}
{{ l.next }}
{{ l.owner }}
{{ l.state }}
Qualifying a lead creates its Pipeline opportunity — the same thread, moved on. Nothing is retyped between the phone call and the proposal.
Where a lead goes
StageWhat happensWho owns it
{{ f.step }} {{ f.what }} {{ f.owns }}
{{ r.head }}
{{ r.body }}

QuickBooks

An integration that feeds Financials — not a second set of books
{{ s.k }}
{{ s.v }}
{{ s.sub }}
Needs a decision before it posts
{{ q.what }} {{ q.why }} · {{ q.job }} {{ q.act }}
A wrong post is far more expensive to unwind than an unposted record is to approve.
What syncs, and which way
DirectionRecordHow it postsState
{{ f.dir }} {{ f.what }} {{ f.detail }} {{ f.state }}
Account mapping
Ascend recordQuickBooks accountClass
{{ m.rec }} {{ m.qb }} {{ m.cls }}
{{ r.head }}
{{ r.body }}

Materials

{{ job.name }} · what the job needs, what is on order, what the supplier billed
{{ s.v }}
{{ s.k }}
{{ s.sub }}
Requests from the field
{{ matOpenCount }} waiting on the office
Super, foreman and crew ask from their phone · you order, they see the status
{{ mq.id }} · {{ mq.title }}{{ mq.status }}Urgent
{{ mq.items }}
{{ mq.when }} · {{ mq.needed }} · deliver to {{ mq.deliverTo }} · {{ mq.notes }}
No requests on this job yet. When the crew taps “Ask for material” on their phone it shows here and alerts the office.
Material list
Nothing on the list for this job yet.
ItemQtyPhaseNeededUnitTotalStatus
{{ m.item }}
{{ m.fromLabel }}
{{ m.qtyLabel }} {{ m.phase }} {{ m.needLabel }} {{ m.costLabel }} {{ m.totalLabel }} {{ m.state }}
{{ m.poLabel }}
One list, three sources: the takeoff, the field's requests, and what a crew flagged on a walkthrough. Nothing is retyped — a request from a phone lands here with who asked and when it is needed.
Supplier invoices
{{ matInvTotal }}
{{ matUnassigned }} Assign
Drop a supplier invoice or price sheet
PDF or photo · Ascend reads the line items and prices off it
{{ d }}
No supplier invoices on this job yet.
InvoiceSupplierReceivedLinesAmountAgainst quote
{{ i.num }} {{ i.sup }} {{ i.when }} {{ i.lines }} {{ i.amountLabel }} {{ i.poLabel }}
{{ i.varLabel }}
An invoice is checked against the quote it came from, so a price that moved between quoting and billing is caught rather than absorbed. An invoice with no quote behind it is flagged, never posted silently.

Schedule & Crew

{{ job.name }} · who has worked this job and when
{{ pTitle }}
Nobody scheduled on this job that day.
{{ r.init }} {{ r.who }} {{ r.task }} {{ r.time }} {{ r.hrs }} {{ r.phase }}
{{ c.d }} {{ c.n }}
{{ c.hrs }}
{{ p.who }} {{ p.time }}
{{ d }}
{{ c.n }}
{{ p.who }} {{ c.more }}
Crew sign-ins
{{ signInTotal }}
Nobody has clocked into this job yet.
EmployeeDayInOutHoursPhaseCost
{{ r.init }} {{ r.who }} {{ r.task }}
{{ r.day }} {{ r.inAt }} {{ r.outAt }} {{ r.hrs }} {{ r.phase }} {{ r.cost }}
Each row is one clock entry — the same record the crew created on their phone, the company Team schedule shows, and this job's labor cost is summed from.
{{ rvKind }} {{ rvId }} · {{ job.name }}
{{ rvBy }}
Email draft
The document prints with your company branding. Send for signature freezes this change order as it stands, hashes it, and issues one signing link — the signature is bound to those exact words and that exact amount.
Frozen and ready to sign. This link is unique to this document.
{{ rvError }}
{{ rvNote }}
Add {{ recTypeLabel }} · {{ job.name }}
Record type
How {{ recClient }} handles this
{{ recPlaybook }}
Attachments
{{ rf.label }}
Uploading…
Information
{{ rfiError }}
Status
{{ recError }}
Logged records stay on this job and count toward its open items. A priced, approved change order also moves the contract value.
Change order · {{ job.name }}
Price it
Change order total {{ coTotal }}
{{ coMathLine }}
Sending this does
{{ t }}
{{ coError }}
Saving unpriced leaves it on the job for whoever prices it. Only the client’s signature moves the contract value.
Service work order
On site
Hours come from the clock if the tech clocked in, so nobody types them twice.
Customer signs here
Signed on the phone before the tech leaves — that signature is what makes it billable
Closing this does
{{ t }}
Subcontractor work order · {{ job.name }}
Issuing this does
{{ t }}
Committed cost moves when the sub accepts, not when you issue.
{{ crumbLeaf }}

Reorganized into the new IA — screen not drawn in this mockup.