SiteCap
Architecture.
SiteCap is an AI-native construction super app built on Pulse AI — combining the four workflows every mid-market GC actually uses (RFIs, submittals, change orders, daily logs) with real-time budget management, live bid management, and native LiDAR reality capture using the iPhone’s built-in LiDAR sensor. Seven modules. One platform. Built to replace Procore for every contractor doing $5M–$150M in annual volume.
SiteCap is a seven-module AI-native construction platform built to replace Procore for every mid-market GC doing $5M–$150M in annual volume. Four core workflows every contractor runs daily — RFIs, submittals, change orders, and daily logs — combined with budget management that updates in real time as bids and COs come in, on-platform bid management, and native LiDAR reality capture using the iPhone’s built-in sensor. Seven modules. One platform. Published flat pricing. No ACV calculation, no demo required to see a number.
Each module is a standalone workflow that also feeds data into every other module. An RFI resolved by a sub generates a potential change order. A change order approved updates the budget instantly. A budget line item triggers a bid request. A bid award closes that budget line. A daily log photo can be linked to a LiDAR scan of the same area. The modules are designed to talk to each other — not operate in silos.
- RFI → Change OrderAny RFI that results in a scope change can spawn a CO with one click. Pre-populated from the RFI data — no re-entry.
- Change Order → BudgetEvery approved CO hits the budget ledger automatically. Owner-approved COs update the contract value. Internal COs update cost-to-complete.
- Bid Award → Budget + POAwarding a bid closes the budget line, generates a purchase order, and creates a subcontractor record — all in one action.
- Scan → RFI / Daily LogLiDAR scan points can be linked to open RFIs or included in daily log entries. Field crew taps a scan location to attach documentation.
- Budget Alert → Bid RequestWhen a budget line is at risk (Pulse AI flags cost overrun trajectory), the platform can auto-generate a bid request for re-scoping that package.
- Daily Log → Progress Scan DeltaDaily log entries tied to scan locations create a visual progress timeline — what was documented vs. what was captured in the scan.
The most-used feature in every construction project. SiteCap's RFI engine is built around two principles: zero friction for the responder (architects and engineers reply from email — no account required) and AI-assisted drafting (upload a field photo, get a complete RFI draft in 15 seconds). Every RFI is logged, routed, tracked, and closed with a full audit trail.
- Manual creationTitle, description, spec section reference, drawing reference, discipline, priority, due date, and assignee. All fields pre-validated on save.
- Photo-to-RFI (Pulse AI)Field crew uploads a photo of the issue. Pulse AI identifies the spec section, drafts a description, suggests discipline routing, and proposes a due date based on project schedule. PM reviews and sends.
- Spawn from Change OrderA CO can generate an RFI to the design team requesting clarification before pricing. Pre-populated from the CO record.
- Spawn from LiDAR scanTap a location in a 3D scan to open a new RFI pre-tagged with that scan location, floor, and area. Photo from scan auto-attached.
- Email-native responseArchitect, engineer, or owner receives a formatted email with the RFI details. They reply in plain email — response is captured automatically. No login, no portal, no friction.
- Multi-party routingRoute to primary reviewer plus CC list. Responses from all parties tracked individually. Final disposition logged against the original RFI.
- Overdue escalationPulse AI sends reminder sequences at 24h before due, on due date, and 24h overdue. PM notified if no response after 48h past due.
- Closeout and audit trailPM marks RFI closed with disposition (approved, approved as noted, revise and resubmit, rejected). Full history immutable and exportable as PDF.
| Field | Type | Required | Description / Validation |
|---|---|---|---|
| RFI NumberAuto-assigned | Integer | Auto | Sequential per project. Format: RFI-001, RFI-002. Cannot be edited. Displayed on all exports. |
| Title | String | Required | Max 120 characters. Plain text. Shown in email subject line: "RFI-{n}: {title} — {project name}". |
| Description | Text | Required | Rich text. Min 20 characters. AI-drafted from photo upload. PM edits before send. Included in full in the routing email. |
| Spec Section | String | Recommended | CSI MasterFormat section reference (e.g., "03 30 00 Cast-in-Place Concrete"). AI suggests from description. Free-text entry also supported. |
| Drawing Reference | String | Optional | Drawing sheet number and detail reference (e.g., "S-201, Detail 4"). Free text. |
| Discipline | Enum | Required | Values: Architectural, Structural, Mechanical, Electrical, Plumbing, Civil, Landscape, Other. Routes to the correct reviewer by default. |
| Priority | Enum | Required | Values: Standard (7 business days), Urgent (3 business days), Critical (24 hours). Displayed on email with color coding. Affects Pulse AI escalation timing. |
| Assignee (Primary) | Required | Primary reviewer email. Receives the routing email. Must provide disposition to close. Can be internal or external — no account required for external. | |
| CC List | Email[] | Optional | Additional recipients who receive the routing email for visibility. Responses from CC list are captured and logged but do not constitute a disposition. |
| Due Date | Date | Required | Calculated automatically from Priority (Standard = today + 7 bd, Urgent = today + 3 bd, Critical = today + 1 bd). PM can override. Displayed prominently in routing email. |
| Attachments | File[] | Optional | Photos, PDFs, drawings. Stored in Supabase Storage. Max 25MB per file, max 10 files per RFI. Thumbnails displayed in UI. Included as attachments in routing email. |
| Scan Tag | UUID | Optional | Reference to a scan_tags record. Links this RFI to a specific 3D location in a LiDAR scan. Shown as a map pin in the scan viewer when viewing this RFI. |
| Status | Enum | Auto | Values: Draft, Open (sent), Under Review, Overdue, Closed. Status transitions: Draft → Open on send. Open → Under Review on any response received. → Overdue automatically after due date. → Closed on PM disposition. |
| Disposition | Enum | On close | Values: Approved, Approved as Noted, Revise and Resubmit, Rejected, For Information Only. Set by PM on closeout. Stored with timestamp and PM user ID. |
| CO Spawned | Boolean + UUID | Auto | True if a change order was spawned from this RFI. Stores the CO UUID. Displayed on the RFI record as a linked CO badge. PM can spawn CO from any open or closed RFI. |
Body structure:
1. Header — project name, RFI number, priority badge (color-coded)
2. RFI description — full text from the RFI record
3. Spec section and drawing reference if provided
4. Attachments as inline images (photos) + download links (PDFs)
5. LiDAR scan location link if scan tag is attached
6. Due date — prominent, bold, red if urgent/critical
7. Response instruction — plain English: "Reply to this email with your response"
8. Footer — project address, GC company name, SiteCap branding
- Resend inbound webhookResend captures inbound reply to the unique per-RFI reply-to address. Webhook fires to Vercel edge function on receipt. Response body parsed and stored in rfi_responses table within seconds.
- Unique reply-to per RFIEach routing email uses a unique reply-to address: rfi-{uuid}@reply.sitecap.io. This routes responses to the correct RFI record without any login or portal interaction from the respondent.
- Attachments in replies capturedIf the architect attaches a redlined drawing or supplemental sketch to their email reply, the attachment is captured and stored in Supabase Storage linked to the RFI response record.
- PM notification on responsePM receives a push notification and email summary when any response is received. Notification includes the responder name, first 200 characters of response, and a deep link to the RFI record in the app.
Submittal management is the second-most-used Procore feature — and the most painful to migrate off of because of the document volume. SiteCap's approach: upload the spec book, generate the submittal log in 60 seconds, then manage the full distribute-review-approve cycle with the same email-native routing as RFIs.
| Workflow Stage | Description | Pulse AI Role |
|---|---|---|
| Spec Book UploadLog generation | PM uploads the project spec book (PDF). Pulse AI parses each section, identifies submittable items, and generates a complete submittal log with section references, submittal types, and initial due dates based on the project schedule. | 60 secSpec book → full submittal log |
| Submittal CreationManual or AI-generated | Each submittal item is a record with spec section, description, required copies, action required, and assignee. Created from the log or manually. Shop drawings, product data, and samples each have type-specific fields. | Auto-tagSpec section + submittal type AI-identified |
| DistributionEmail-native | Submittals distributed to architect/engineer via email with document attached. Reviewer receives a structured email with action required, due date, and one-click response options (Approved / Approved as Noted / Revise and Resubmit / Rejected). | Zero loginReviewer responds from email |
| Review TrackingLive status | PM sees real-time status of every submittal: submitted, under review, overdue, returned, approved. Overdue items trigger reminder sequences. Returned submittals automatically generate a resubmittal record linked to the original. | EscalationOverdue reminders at 24h / 48h / 72h |
| Closeout PackageExport | At project completion, generate a full submittal closeout package: all approved submittals, review history, and audit trail. PDF export for owner turnover or archival. One click. | Auto-compileFull closeout package in one action |
Change orders are the financial heart of every construction project — and the source of most disputes. SiteCap tracks every CO from inception through approval and links each one directly to the project budget. Approved COs update the budget instantly. Pulse AI flags CO patterns that suggest scope creep before they compound.
- CO creation — four paths1) Manual from PM. 2) Spawned from RFI disposition. 3) Spawned from bid variance (bid comes in over budget). 4) Spawned from Pulse AI pattern detection (multiple RFIs on same spec section flagged as potential CO).
- Internal pricing workflowPM prices the CO with line items, labor rates, materials, and margin. Internal approval required before sending to owner. Audit trail on every edit.
- Owner approval — email or in-appOwner receives CO via email with scope description, pricing, and approval links. Can approve, reject, or request revision without logging into the platform.
- Budget update on approvalApproved CO immediately updates the project budget: contract value (owner-facing) and cost-to-complete (internal). Zero manual reconciliation required.
- Pattern detectionPulse AI monitors RFI volume by spec section and discipline. When a section generates more than 3 RFIs in 14 days, it flags a potential scope issue and suggests a CO before the PM has to figure it out manually.
- Bid variance alertsWhen a subcontractor bid exceeds the budget line by more than 10%, Pulse AI flags it, calculates the CO impact on the project total, and surfaces it for the PM before the bid is awarded.
- CO risk scoringEach open CO is scored for approval likelihood based on project type, owner history, and CO description. Low-likelihood COs are flagged so PMs can resolve them proactively before they age into disputes.
- Monthly CO reportPulse AI generates a monthly CO summary: total approved value, total pending, total rejected, average approval time. Delivered to PM inbox automatically.
Daily logs are the legal record of the project. Most PMs and superintendents spend 15–30 minutes per day writing them — or don't write them at all, which creates liability exposure. SiteCap reduces that to 30 seconds through voice-to-log on mobile, with Pulse AI generating the formatted entry from a spoken or typed note.
- Voice input (mobile)Superintendent speaks a 30–60 second summary of the day. Pulse AI converts to formatted daily log: crew count, weather, work completed, delays, visitors, safety observations. Reviewed and approved by PM before submission.
- Photo-first entryUpload photos from the field. Pulse AI generates a log entry from the photos, tagging each photo to the cost code and area where it was taken. Field crew adds notes to each photo.
- Scan-linked entryTap a LiDAR scan location on the mobile app and create a daily log entry linked to that exact location. Photo and voice note both attached to the scan point.
- Structured form (desktop)Full structured form for PM completion: crew by trade, equipment on site, work in place by cost code, material deliveries, inspections, weather, delays. Standard construction daily log format.
- Automatic field captureWeather auto-pulled from location data. Date, time, and crew count pre-populated. Superintendent only needs to describe what happened — the platform fills in the rest.
- Timestamped and immutableOnce submitted, daily log entries cannot be edited. Corrections are added as amendments to the original. Full timestamp and submitter identity logged for legal defensibility.
- Delay documentationDelays flagged in a daily log automatically generate a notification to the PM for review as a potential CO or schedule impact. Creates the documentation trail for delay claims.
- PDF export and owner sharingDaily logs exportable as formatted PDFs. Owner sharing can be configured — specific logs or all logs auto-shared with the owner's email on submission.
The budget module is the financial spine of the project — and the financial spine of every project. It starts with the original estimate, is structured by cost code, and updates automatically as bids are awarded, change orders are approved, and actual costs come in. The goal is a budget that is always current without any manual reconciliation.
| Layer | Description | Auto-Update Trigger |
|---|---|---|
| Original BudgetLocked on approval | PM enters the original budget by cost code (CSI MasterFormat or custom codes). Once owner-approved and locked, the original budget is immutable — all changes are tracked as variances against it. Budget can be imported from CSV or entered line by line. | Manual entryLocked on PM approval |
| Revised BudgetLive contract value | Original budget plus all approved change orders (owner-facing). This is the current contract value. Updates instantly when a CO is approved. Separate from cost-to-complete — this is what the owner owes, not what it will cost. | CO approvalInstant on owner sign-off |
| Projected CostCost-to-complete | Actual costs incurred + estimated cost to complete for each budget line. Updated by bid awards, purchase orders, and manual actual cost entries. Pulse AI projects cost-to-complete for open budget lines based on bid activity and historical patterns. | Bid award / PO+ manual actual entries |
| Variance TrackingBudget vs. projected | Every budget line shows: original, revised, projected, actual-to-date, and variance. Red/yellow/green coded. Lines over 10% variance flagged. Budget summary dashboard shows project-level exposure at a glance. | Real-timeDashboard always current |
| Draw ScheduleOwner billing | Schedule of values by cost code for monthly owner billing. AIA G702/G703 format generation. Percentage-complete tracking per line item. Retainage calculation and tracking. Applications for payment exportable as PDF or sent directly to owner from the platform. | PM inputMonthly billing cycle |
| Field | Type | Update Trigger | Description |
|---|---|---|---|
| Cost CodePrimary key per line | String | Manual entry | CSI MasterFormat division code or custom code. Examples: "03 30 00" (Concrete), "05 10 00" (Steel), "DIV-16" (Electrical). Used as the join key between budget, bids, and COs. |
| Description | String | Manual entry | Human-readable description of the scope covered by this budget line. E.g. "Cast-in-Place Concrete — All Structural Slabs". Max 200 characters. |
| Original BudgetLocked on PM approval | Decimal | Manual entry only Immutable after lock | The original estimated cost for this scope. Set at project initiation. Immutable once the project budget is locked by PM. Never changes — all future changes are recorded as variances against this value. |
| Approved COsOwner-signed COs only | Decimal | CO approval event | Sum of all owner-approved change order amounts that impact this cost code. Updated instantly when a CO is marked approved. Revised Budget = Original + Approved COs. |
| Revised BudgetCurrent contract value | Computed | Auto (CO approval) | = Original Budget + Approved COs. This is what the owner has agreed to pay for this scope. Displayed on the owner-facing budget summary. Never manually editable. |
| Awarded ContractBid award value | Decimal | Bid award event | The amount awarded to the winning subcontractor for this scope. Set when a bid is awarded in the Bid Management module. May differ from Original Budget — variance is flagged and must be reviewed. |
| Actual Cost to Date | Decimal | Manual entry / PO | Costs actually invoiced and approved against this line to date. Updated by PM manually or via purchase order records. Used in cost-to-complete calculation and draw schedule. |
| Projected Final CostPulse AI estimate | Computed | Pulse AI / manual | = Actual Cost to Date + Estimated Cost to Complete. Pulse AI calculates cost-to-complete from awarded contract, percentage complete, and pending COs. PM can override. Compared to Revised Budget to calculate variance. |
| Variance | Computed | Auto (real-time) | = Revised Budget − Projected Final Cost. Positive = under budget. Negative = over budget. Color coded: green (>0), yellow (0 to −10%), red (<−10%). Dashboard filters by worst variance lines. |
| % Complete | Decimal 0–100 | Manual entry | PM-entered percentage of this scope complete as of the most recent site observation. Used in draw schedule (Schedule of Values), cost-to-complete calculation, and AIA G702 generation. |
| Draw Amount (current) | Computed | Auto (% complete) | = (% Complete / 100) × Revised Budget − Previously Billed. The amount to bill the owner for this line in the current Application for Payment. Included in the AIA G702/G703 export. |
| Retainage % | Decimal | Project-level setting | Retainage percentage withheld from each draw (typically 5–10%). Set at project level, can be overridden per line. Retainage balance tracked separately and released on substantial completion per contract terms. |
- Project summary barTop of every project: Original Budget total / Approved COs total / Revised Budget total / Projected Final Cost / Overall Variance. Color-coded status indicator (green/yellow/red).
- Line-item tableAll budget lines with all columns visible. Sortable by any column. Filterable by cost code, variance status (over/under/at budget), and discipline. Export to CSV and PDF.
- Variance waterfallVisual waterfall chart showing the 10 worst-variance lines by dollar amount. Pulse AI flags lines where trajectory suggests they'll breach budget within 30 days.
- CO impact logChronological list of every approved CO and its dollar impact on each budget line. Running total of approved CO value vs. original budget. Owner-facing version available for sharing.
- G702 — Application for PaymentCover page with: project name/number, owner, architect, contractor, application number, period to, contract date. Dollar fields: original contract sum, net COs, adjusted contract sum, work completed to date, retainage, total earned less retainage, less previous certificates, current payment due. PM certifies and signs.
- G703 — Continuation SheetLine-by-line schedule of values: item number, description of work, scheduled value, work completed (previous / this period), materials stored, total completed + stored, % complete, balance to finish, retainage. All values pulled from budget_lines table. Each line = one cost code.
- PDF generationServer-side PDF generation via Puppeteer or equivalent. Official AIA format reproduced exactly. PM reviews in-app before finalizing. Finalized application locked and stored in Supabase Storage. Sent to owner via Resend with one click.
- Application numberingSequential per project (Application No. 1, 2, 3…). Each application stores the period it covers, the date submitted, and the date certified by architect. Full history of all applications accessible from the project.
Bid management closes the loop between the budget and the cost. GCs spend enormous time managing subcontractor bids through email chains, spreadsheets, and phone calls. SiteCap brings the entire bid process — invitation, document distribution, question and answer, bid receipt, comparison, and award — onto the platform. Bid award triggers an automatic budget update, PO generation, and subcontractor record creation.
- Scope of work definitionPM defines the bid package: scope description, CSI division, drawings included, specifications included, bid form, and bond requirements. All documents attached from the project document library.
- Sub invitationInvite from the platform's sub database or by email. Subs receive a formatted invitation with scope, due date, and secure document download link. No login required to download bid documents.
- Bid Q&ASubs submit questions through a structured form (or email, captured automatically). All questions and answers are logged and distributed to all bidders simultaneously to ensure equal access to information. Becomes the RFI log for pre-bid clarifications.
- Addenda managementPM issues addenda through the platform. All invited subs notified immediately. Addenda acknowledgment tracked — unacknowledged addenda flagged before bid due date.
- Online bid submissionSubs submit bids through a structured online form or by emailing a completed bid form. Bids received and logged with timestamp. All bids locked at the due date — no late submissions accepted without PM override.
- Bid comparison tableAll received bids displayed in a side-by-side comparison table with line-item breakdown. Budget line shown alongside bids. Pulse AI highlights the lowest compliant bid and flags bids that appear incomplete or non-responsive.
- Bid levelingPM can add leveling notes to each bid (inclusions, exclusions, clarifications, alternates). Leveled bids re-sorted by adjusted value. Leveling notes exported with the bid tabulation.
- Award — one action, four outcomesClick Award: (1) Budget line closes and updates, (2) Purchase order generated, (3) Subcontractor record created with contract amount, (4) Non-awarded subs notified. All in one action.
- id, project_id, budget_line_idUUID primary key. Foreign keys to projects and budget_lines tables. One package can span multiple budget lines (stored as budget_line_ids array).
- title, scope_descriptionPackage name (e.g., "Concrete Package — All Foundations") and full scope of work. Rich text. Distributed to all invited subs in the invitation email.
- csi_division, documents[]CSI division for routing defaults. Array of Supabase Storage file references for all bid documents (drawings, specs, bid form template).
- due_date, pre_bid_meetingBid submission deadline. Optional pre-bid meeting date, time, and location — included in invitation email if set.
- statusEnum: Draft, Open (invitations sent), Closed (past due date), Awarded, Cancelled. Transitions enforced — cannot award a Draft package.
- bond_required, insurance_requiredBoolean fields. If true, bid submission form includes bond amount field and insurance certificate upload requirement.
- bids: id, package_id, sub_idOne bid record per subcontractor per package. Links to bid_packages and subcontractors. Locked on submission — cannot be edited by sub after due date without PM override.
- bids: base_amount, line_items[]Total bid amount and optional line-item breakdown. Line items: description, quantity, unit, unit price, extension. Used for bid leveling in the comparison table.
- bids: alternates[], exclusions, inclusionsAlternates priced separately from base bid. Inclusions and exclusions as text — captured for leveling notes and bid tabulation export.
- bids: awarded, awarded_at, award_notesBoolean award flag. Timestamp and PM user ID on award. Award notes for internal record. Non-awarded subs automatically notified via Resend when any bid in the package is awarded.
- subcontractors: company, contact, email, phone, csi_divisions[], license_numberReusable sub database per GC account. CSI divisions indicate what packages to auto-invite them to. License number stored for compliance documentation.
- bid_qa: id, package_id, question, asker_email, answer, distributed_atQ&A thread per package. Each question from any sub is answered by PM and distributed to ALL invited subs simultaneously. Becomes the pre-bid clarification record.
- 01Budget Line UpdateThe budget_line record for the associated cost code is updated: awarded_contract = bid.base_amount. Variance is immediately calculated (Awarded Contract vs. Original Budget). If variance > 10%, a warning is shown to the PM before confirming the award but does not block it.UPDATE budget_lines SET awarded_contract = bid.base_amount WHERE id = package.budget_line_id
- 02Purchase Order GenerationA purchase order record is auto-created: PO number (sequential), sub company name, scope description from bid package, amount from bid, project reference, and budget line reference. PO exported as PDF and can be sent to sub via Resend. PM can edit PO terms before sending.INSERT INTO purchase_orders (project_id, sub_id, bid_id, amount, budget_line_id, status: 'pending_send')
- 03Subcontractor Record CreatedIf the sub is not already in the project's subcontractor list, a project_subcontractors record is created: sub company, contact, CSI division, contract amount. This feeds into the sub management view where PM tracks all subs on the project by trade, contract value, and percent complete.INSERT INTO project_subcontractors (project_id, sub_id, csi_division, contract_amount, status: 'under_contract')
- 04Non-Award NotificationsAll other subs who submitted bids on this package are notified via Resend that the package has been awarded. Email subject: "{Package title} — Award Notification". Body: "Thank you for submitting. This package has been awarded. We appreciate your participation and look forward to future opportunities." No pricing disclosed to non-awarded subs.Resend batch send to all bids WHERE package_id = X AND awarded = false AND submitted_at IS NOT NULL
SiteCap’s reality capture module uses the LiDAR scanner built directly into iPhone Pro models (iPhone 12 Pro and newer). There is no third-party scan service, no external SDK, and no hardware purchase required. Every iPhone Pro contractor already owns the capture device. SiteCap accesses the LiDAR sensor through iOS device APIs, generates a 3D point cloud of the scanned space, and saves it directly into the project record — all within the SiteCap PWA.
- Open camera in SiteCap mobile PWAContractor opens the scan module from any project page. The app requests camera and LiDAR permissions on first use. iPhone’s ARKit framework initializes the LiDAR sensor and depth camera simultaneously.
- Scan the room — guided captureOn-screen guide instructs the contractor to slowly pan the iPhone around the space. ARKit builds the 3D point cloud in real time. Scan completion detected automatically when sufficient coverage is achieved. Typical room scan: 60–90 seconds.
- Point cloud processed and savedScan data processed on-device via ARKit. Point cloud compressed and uploaded to Supabase Storage. A navigable 3D thumbnail renders in the project record within seconds of upload. Scan is automatically timestamped, labeled with floor and area, and linked to the project.
- Tag locations to project recordsContractor taps any point in the 3D scan to place a tag. Tag links to: an RFI, a daily log entry, a change order, or a punch list item. Tags visible in both the scan viewer and the linked record. Scan becomes living project documentation.
- RFI → scan locationEvery RFI can include a scan tag showing the exact 3D location of the issue. The architect’s routing email includes a rendered screenshot from the scan at that point. Eliminates the “where exactly?” back-and-forth that kills RFI response time.
- Daily log → scan pointSuperintendent taps a scan location, speaks a 30-second note. Daily log entry is linked to that exact location — timestamped, spatially referenced, immutable. Voice note transcribed via Anthropic API and attached as text.
- Punch list from scan deltaTwo scans of the same space compared. Pulse AI Scan Progress Agent identifies areas of change. PM taps changed areas to create punch list items linked to the exact 3D location. Punch list PDF exported with scan screenshots per item.
- Owner progress sharingOwner given a read-only link to view the latest scan for their project — a 3D walkthrough of progress without stepping on site. Configurable per project. No owner account required.
Processing: RealityKit on-device mesh generation from point cloud
Compression:USDZ format for 3D model · JPEG for scan screenshots
Upload: Supabase Storage /scan-captures/{project_id}/{scan_id}
Viewer: model-viewer web component (WebXR/WebGL) for browser 3D render
Tags: scan_tags table: {id, project_id, scan_id, x, y, z, linked_type, linked_id}
Delta: Pulse AI compares mesh snapshots between scans for progress detection
──────────────────────────────────────────────────────
Devices: iPhone 12 Pro+ · iPad Pro 2020+ (also has LiDAR)
Android: Phase 2 — Android depth API (Samsung S series, Pixel) planned post-MVP
Fallback: iPhone without LiDAR can still capture photos/video tagged to room — no 3D model
The single biggest objection every Procore customer has when evaluating a switch is: “All our project data is in there.” SiteCap eliminates that objection with the Procore Migration Agent — a Pulse AI agent that logs into Procore with the contractor’s credentials, extracts all live project data across four layers, and imports it directly into SiteCap. No API key. No Procore cooperation. No manual export. The contractor provides their login. Pulse AI does the extraction. SiteCap is fully populated in approximately 20 minutes.
- RFI extraction — all statusesPulse AI navigates to the RFI log in each active Procore project. Extracts: number, title, description, spec section, drawing reference, discipline, assigned reviewer, status, due date, all responses and reply text, and attached files. Creates matching RFI records in SiteCap with full history intact.
- Submittal log extractionReads the submittal log from each project. Extracts: submittal number, spec section, type, description, status, reviewer, due date, return date, and disposition. Resubmittals linked to originals. Full submittal history transferred to SiteCap’s tracker.
- File attachment migrationAttached PDFs, drawings, and photos on RFIs and submittals downloaded from Procore and re-uploaded to SiteCap’s Supabase Storage. Linked to the correct records. No document left behind — full attachment history migrates.
- Budget / Schedule of ValuesReads the project budget or SOV from Procore. Extracts: cost code, description, original budget, approved CO adjustments, revised budget, actual costs to date, and percentage complete per line. Populates SiteCap budget_lines table with the complete cost structure from day one.
- Change order historyAll approved COs extracted with number, description, amount, status, and budget line impact. Imported as approved COs in SiteCap — the revised budget immediately reflects all historical COs from Procore.
- Prior Applications for PaymentPast AIA G702/G703 applications imported with application number, period, amount billed, retainage, and certification status. SiteCap’s draw schedule starts from the correct billing position — not from zero.
- Active bid packagesAny open bid packages extracted: title, scope, invited bidders, received bids, and status. Migrated to SiteCap’s bid module so procurement continues without interruption during the switchover.
- Subcontractor databaseAll sub and vendor records: company, contact, email, phone, CSI divisions, contract amounts on active projects, payment status. Imported into SiteCap’s subcontractor database. Existing sub relationships preserved from day one.
- Daily log historyDaily logs for all active projects: date, crew count, weather, work description, delay notes, and photos. Imported as locked historical records — the complete daily log history comes over intact for claims defensibility.
- Ephemeral credential sessionProcore credentials entered in an encrypted session. Never written to any database, log file, or storage system. Exist only in memory for the duration of the extraction. Session terminated immediately on completion.
- Real-time progress notificationsContractor notified of extraction start, per-module progress, and completion in real time via push notification. Full audit log of what was extracted (not credentials) stored for the contractor’s records.
- Rollback on failureIf extraction fails mid-process (session timeout, Procore UI change, network issue), all partial imports roll back. SiteCap database remains clean. Contractor notified with specific failure point. Re-run is safe.
- Import summary reportOn completion: records migrated per module, files transferred, any items requiring manual review. Exported as PDF for contractor records. PM reviews before going live on SiteCap.
Session: Playwright headless browser launched in Vercel serverless function
Auth: Pulse AI navigates login.procore.com, enters credentials, captures session cookie
Extract: Per project: /rfis → /submittals → /budget → /change-orders → /bids → /daily-logs
Structure: Pulse AI parses rendered HTML/JSON, maps fields to SiteCap schema
Import: Supabase batch inserts with RLS enforced. Files uploaded to Storage.
Cleanup: Credentials purged from memory. Session terminated. Audit log written.
──────────────────────────────────────────────────────
Stack: Playwright + Anthropic API (computer use) + Supabase batch + Vercel
Error: Any failure triggers full rollback via Supabase transaction
Note: Procore UI changes may require agent prompt updates — monitor monthly
SiteCap runs 24 purpose-built Pulse AI agents across four pillars: platform intelligence (agents that make the product smarter), acquisition (agents that hunt Procore contractors), conversion (agents that turn trials into paying accounts), and retention (agents that keep accounts and grow revenue). The 17 acquisition agents run the full sales cycle from prospect identification through paid conversion. 7 new agents are added for budget, bid, and reality capture intelligence.
- Procore User DetectorAGC directories, ENR Top 400, LinkedIn. 88% success rate.
- Renewal Interception AgentMonitors renewal signals. 62% success rate.
- Complaint Signal AgentG2, Reddit, Capterra monitoring. 91% success rate.
- Contractor Cost ProfilerDecision-maker dossier + savings calc. 74% success rate.
- Market Intelligence AgentProcore earnings + pricing news. 85% success rate.
- Outreach Sequence Agent7-touch personalized email. 41% open rate.
- LinkedIn Outreach AgentVP Ops, PM, IT Director targeting. 55% success rate.
- Objection Handler AgentUnder-60-second response. 78% success rate.
- Demo Prep AgentPre-loads demo with prospect's project data. 82% success rate.
- Association Partnership AgentAGC/NAHB/ABC chapter channel. 38% success rate.
- Trial Activation AgentBehavior-triggered conversion. 84% success rate. Fires on second project, team invite, or drawing upload.
- Procore Cost Comparison AgentPersonalized savings calculation. 89% success rate. "$68K/year to SiteCap $X" closes deals.
- Onboarding AgentPlatform setup + first project live within 48h. 87% success rate.
- Follow-Up Cadence AgentRe-engages stalled trials. 66% success rate.
- Expansion AgentMonitors growth signals for tier upgrades. 58% success rate.
- Churn Prevention Agent30-day early warning on declining usage. 76% success rate.
- Content & SEO Agent5 posts/week + 2 press releases. Page 1 SEO by Month 12.
SiteCap is built on a modern, production-grade stack where every layer has a specific job. No unnecessary services. No vendor lock-in beyond the core three (Supabase, Vercel, Anthropic). Every component listed below is in active use — not aspirational.
project_users id, project_id, user_id, role (pm|super|estimator|viewer), invited_at, accepted_at
rfis id, project_id, number, title, description, spec_ref, drawing_ref, discipline, priority, assignee_email, cc_emails[], due_date, status, disposition, co_id, scan_tag_id, attachments[]
rfi_responses id, rfi_id, responder_email, body, attachments[], received_at
submittals id, project_id, number, spec_section, type, description, status, reviewer_email, due_date, returned_at, disposition
submittal_responses id, submittal_id, responder_email, disposition, notes, attachments[], received_at
change_orders id, project_id, number, rfi_id, bid_id, description, amount, status, budget_line_id, owner_email, approved_at
daily_logs id, project_id, date, super_id, crew_count, weather, entry_text, delay_flag, photos[], scan_tag_id, submitted_at, locked
budget_lines id, project_id, cost_code, description, original, approved_cos, revised, awarded_contract, actual_to_date, projected_final, pct_complete, variance, retainage_pct
budget_amendments id, project_id, reason_code, old_value, new_value, affected_line_id, approved_by, approved_at
draw_schedule id, project_id, application_number, period_start, period_end, status, submitted_at, certified_at, pdf_url
bid_packages id, project_id, title, scope_description, csi_division, budget_line_ids[], documents[], due_date, status, bond_required
bids id, package_id, sub_id, base_amount, line_items[], alternates[], submitted_at, awarded, awarded_at
bid_qa id, package_id, asker_email, question, answer, distributed_at
subcontractors id, account_id, company, contact_name, email, phone, csi_divisions[], license_number
purchase_orders id, project_id, sub_id, bid_id, budget_line_id, po_number, amount, status, pdf_url
lidar_scans id, project_id, usdz_url, thumbnail_url, label, floor, area, scan_date, is_latest
scan_tags id, project_id, scan_id, x, y, z, linked_type (rfi|log|co|punch), linked_id, label
migration_jobs id, account_id, procore_project_ids[], status, started_at, completed_at, records_imported, errors[]
notifications id, user_id, project_id, type, title, body, read, deep_link, created_at
────────────────────────────────────────────────────────────
RLS: Row-level security enforced on all tables at database layer
Realtime: budget_lines, rfis, change_orders, bids — live subscriptions for dashboard updates
Storage: /rfi-attachments · /submittal-docs · /daily-log-photos · /bid-documents · /scan-captures · /pdf-exports
Auth: Supabase Auth with JWT · Email invite flow · Row-level security tied to auth.uid()
| Route | Method | Purpose |
|---|---|---|
| /api/rfi/create | POST | Create RFI, assign number, send routing email via Resend with unique reply-to, create scan_tag if provided. |
| /api/rfi/reply-webhook | POST | Resend inbound webhook. Parse reply email, store rfi_responses record, update RFI status, notify PM. |
| /api/rfi/ai-draft | POST | Accept photo upload, Pulse AI identifies spec section and drafts RFI description from photo. Return draft JSON. |
| /api/submittal/spec-parse | POST | Accept spec book PDF, Pulse AI extracts all submittable items per section. Return submittal log array for PM review. |
| /api/co/approve | POST | Token-based owner approval. Atomic: update CO status + add amount to budget_line.approved_cos + recalculate revised + audit log. |
| /api/log/voice | POST | Accept audio file, Pulse AI transcribes and structures the entry, returns draft daily log for PM approval before submit. |
| /api/budget/csv-import | POST | Accept CSV, validate cost codes, preview before insert, batch create budget_lines records. |
| /api/budget/g702-export | POST | Generate AIA G702/G703 PDF via Puppeteer from budget_lines data. Store in Supabase Storage. Return PDF URL. |
| /api/bid/award | POST | Atomic award: update budget_line + create purchase_order + create project_sub + send non-award emails. Rollback on any failure. |
| /api/lidar/upload | POST | Accept USDZ + metadata from iOS PWA. Upload to Supabase Storage. Create lidar_scans record. Return scan_id and embed URL. |
| /api/lidar/tag | POST | Create scan_tags record linking x,y,z coordinates to an RFI, CO, daily log, or punch list item. |
| /api/migration/start | POST | Launch Playwright session with Procore credentials. Extract 4 layers. Import to Supabase. Purge credentials on complete. |
| /api/migration/status | GET | Poll migration job by job_id. Return module progress, records imported, estimated completion for real-time UI. |
| /api/stripe/webhook | POST | Handle Stripe events: checkout completed (activate), subscription updated (tier change), deleted (disable access). |
| /api/notify/push | POST | Send Web Push notification to user’s devices via VAPID. Called by Supabase database webhooks on key events. |
| /api/pdf/export | POST | Generic PDF export via Puppeteer. Accepts template type (rfi-log, submittal-log, bid-tab, daily-log, punch-list) + project_id. |
SiteCap’s 7 modules are built in dependency order — the four core modules (RFI, submittal, change orders, daily logs) ship first because budget and bid management reference their data. The Procore Migration Agent ships last because it needs all destination tables populated first. First beta contractors onboarded during Week 5 on real active projects. Full QA gate before June 1 launch.
-
WK 1–2
Apr 22–May 3Stack Lock + Full SchemaSupabase provisioned with all 9 core tables. Vercel project live. Resend domain verified. ARKit LiDAR integration scoped and tested on device. Stripe products and pricing configured ($299/$499/$799). Pulse AI workspace opened. Data model reviewed and locked before build begins. -
WK 3–4
May 4–17RFI Engine + Submittal TrackerFull RFI creation, routing, and closeout workflow. Email-native response via Resend. Pulse AI photo-to-RFI draft. Submittal log generation from spec book upload. Distribute-review-approve cycle. Overdue escalation sequences. Both workflows tested on real project data internally. -
WK 5
May 18–24Change Orders + Daily LogsCO creation (manual, from RFI, from bid variance). Owner approval workflow via email. Budget integration on approval (budget lines update). Daily log voice-to-text. Photo auto-tagging. Delay documentation and CO spawn from log. Mobile PWA tested on real devices. -
WK 6
May 25–31Budget Management ModuleOriginal budget entry by cost code. CSV import. Budget locked on PM approval. Revised budget auto-updates on CO approval. Cost-to-complete tracking. Variance calculation and dashboard. Schedule of values and draw schedule. AIA G702/G703 PDF export. Budget Watch Agent deployed. -
WK 7
Jun 1Bid Management ModuleBid package creation. Sub invitation and document distribution. Q&A workflow. Addenda management and acknowledgment tracking. Online bid submission. Side-by-side comparison table. Bid leveling. Award action (budget update + PO + sub record + notifications). Bid Intelligence Agent deployed. -
WK 8
MVP 🎯Reality Capture IntegrationARKit LiDAR capture workflow. Scan upload to Supabase Storage. 3D viewer embed with model-viewer. Location tag creation linked to RFIs, logs, COs, and punch list items. Progress delta comparison. Punch list from scan workflow. Owner scan sharing configuration. Scan Progress Agent deployed. Mobile scan tag interface tested on device. -
WK 9
Post-MVPAll 24 Pulse AI Agents DeployedAll 7 platform intelligence agents live. All 17 acquisition/conversion/retention agents deployed for SiteCap. Contractor database seeded: AGC directories, ENR Top 400, LinkedIn. First 1,000+ Procore contractors profiled. Outreach sequences running. Content engine publishing "Procore alternative" SEO content Week 1. -
WK 10–11
HardeningFull QA + Legal + PaymentsEnd-to-end QA on all 7 modules: RFI → submittal → CO → log → budget → bid → scan. Cross-module data flow verified (CO-to-budget, bid award-to-budget, scan-to-log). Stripe payment integration live. TOS and Privacy Policy. SiteCap trademark filing. Three beta GCs complete a full 3-week project cycle on real active jobs. Zero critical bugs gate before launch. -
WK 12
ScaleSoft Launch — First Paying AccountsFirst 20–30 GC accounts onboarded on live active projects through warm industry introductions. Real-world feedback loop open. Pulse AI agents tuned on live construction data. First paying contracts by end of Week 12. Renewal Interception Agent running at full volume targeting Procore contractors within 90 days of renewal. -
MO 4+
Full ThrottleFull Throttle — Swarm at Scale + Phase 2200+ Procore outreach sequences/day. SEO climbing for "Procore alternative" and "construction project management software" terms. AGC chapter partnerships generating referrals. Phase 2 roadmap: QuickBooks/Sage ERP integration, drawing version control, inspection module, owner portal with live budget dashboard.
All pricing published on sitecap.io before a prospect talks to anyone. No ACV calculation, no demo required to see a number. Three tiers based on project count and feature depth. Blended average approximately $499/mo.
| Tier | Price | Target | Includes | vs. Procore |
|---|---|---|---|---|
| StarterEntry tier | $299/mo$3,588/yr | GCs $5M–$25M annual volume. Up to 3 active projects. 1–3 users. | All 7 modules. Up to 3 named users. Pulse AI RFI drafting and log generation. Basic budget management. Bid management up to 3 active packages. LiDAR reality capture up to 5 scans per project. | Procore charges $30K–$50K/year here. SiteCap: $3,588. Annual savings: $26K–$46K. |
| ProExpected avg | $499/mo$5,988/yr | GCs $25M–$80M volume. Up to 10 active projects. Unlimited users. | Everything in Starter plus unlimited users, unlimited LiDAR scans, advanced budget analytics, full Pulse AI agent suite, priority support, AIA G702/G703 export, custom cost code structure, sub database. | Procore charges $60K–$100K/year here. SiteCap: $5,988. Annual savings: $54K–$94K. |
| TeamMulti-office | $799/mo$9,588/yr | GCs $80M–$150M volume. Unlimited projects. Multiple offices. | Everything in Pro plus multi-office management, advanced reporting, API access, dedicated onboarding, SLA, custom integrations, portfolio-level budget dashboard, white-label owner portal. | Procore charges $80K–$150K+ here. SiteCap: $9,588. Up to 15× savings. |
| Document / Deployment | URL | Access | Status |
|---|---|---|---|
| Marketing Site Pricing, features, Procore comparison, trial signup |
sitecap.io | Public | ● Planned — post-build |
| Platform Application Full SiteCap app — all 7 modules |
app.sitecap.io | Authenticated | ● Planned — Week 12 |
| JV Brief Full JV presentation, feasibility index, pricing & exit |
cleardeck.tfsfventures.com | Confidential | ● Live — SiteCap JV Brief |
| Platform Architecture Spec This document — full build specification |
sitestack.tfsfventures.com | Confidential | ● Build complete — deploy to subdomain |
| LiDAR Scan Demo Live demo of iPhone LiDAR scan → RFI/log linking workflow |
demo.sitecap.io | Invite only | ● Planned — Week 10 |
| Beta Contractor Portal First 20–30 beta accounts — live projects |
app.sitecap.io | Beta access | ● Planned — Week 11 |
cname.vercel-dns.com once Vercel project is live.
SiteCap is multi-tenant — each GC account is isolated. Within an account, projects have role-based access. Users are assigned roles per project, not per account. This means a PM can be admin on Project A and viewer on Project B. External parties (owners, architects, subs) interact via email — they never have platform accounts.
| Role | Assigned To | Can Do | Cannot Do |
|---|---|---|---|
| Account OwnerBilling admin | The GC who created the account. One per account. | All project permissions. Manage billing. Create/delete projects. Invite/remove users. Account analytics. | Nothing — full access. |
| Project ManagerDefault PM | Senior PMs. Assigned per project. | Create/edit/delete all records in assigned project. Lock budget. Approve COs and draw schedule. Award bids. Configure owner and architect routing. | Cannot access unassigned projects. Cannot manage billing. Cannot delete project. |
| SuperintendentField role | Field supers, foremen. Mobile-primary. | Create daily logs (voice, photo, structured). View open RFIs. Draft RFIs. Initiate LiDAR scans from mobile. Create scan tags. View budget summary. | Cannot send RFIs, approve COs, access bid management, edit budget, or see financial details. |
| EstimatorBid-focused | Preconstruction staff. | Full Bid Management access. Create/manage bid packages. View and edit budget lines. View RFIs and submittals (read only). | Cannot send RFIs, approve COs, or manage daily logs. |
| ViewerRead only | Executives, silent stakeholders. | Read-only on all project data. Budget summary, RFI log, submittal log, CO log, daily logs. | Cannot create, edit, send, or approve anything. |
| OwnerEmail only — no account | Property owner, developer. | Receives COs for approval via signed email token. Receives draw schedule for review. Optionally receives daily logs and scan link. | Cannot log into platform. No access to budget detail, bid management, or internal records. |
| Architect/EngineerEmail only — no account | Design team members. | Receives RFIs and submittals via email. Responds via email reply — no login, no portal. Attachments in replies captured automatically. | Cannot log into platform. No access to budget, bids, or internal project data. |
SiteCap is a platform where critical events happen outside the app — an architect replies to an RFI, an owner approves a CO, a sub submits a bid. Every external event must generate an in-app notification and, where needed, an email alert. This section defines every trigger, recipient, channel, and message content.
| Event Trigger | Recipient | Channel | Message Content & Deep Link |
|---|---|---|---|
| RFI response received | Assigned PM | Push + Email | "{Responder} replied to RFI-{n}: {title}." First 200 chars of response body. Deep link to RFI record. |
| RFI overdue | PM + Assignee (external) | Push + Email | "RFI-{n} is {x} days overdue." Pulse AI also sends reminder to external assignee at +24h, +48h past due date. |
| Submittal returned | PM | Push + Email | "Submittal {num} returned — {disposition} by {reviewer}." If Revise and Resubmit, PM prompted to create resubmittal. |
| CO approved by owner | PM + Account Owner | Push + Email | "CO-{n} approved — ${amount} added to contract." Budget update shown. Deep link to CO and updated budget line. |
| CO rejected by owner | PM | Push + Email | "CO-{n} rejected by owner." Owner rejection notes (if any) included. PM prompted to revise or close. |
| Budget line exceeds variance threshold | PM + Account Owner | Push + Email | "Budget alert: {cost_code} projecting ${amount} over budget." Pulse AI Budget Watch Agent trigger. Deep link to budget line. |
| Bid submitted by sub | PM + Estimator | Push | "{Company} bid ${amount} for {package}. {x} of {y} subs have responded." Deep link to bid package. |
| Bid due in 24h | PM + Estimator | Push + Email | "Bid deadline in 24h: {package}. {n} of {y} subs have responded." Lists non-responding subs for follow-up. |
| Daily log not submitted by 4pm | Superintendent | Push | "Reminder: Daily log for {date} not submitted for {project}." Configurable per project. Sent only on working days. |
| New LiDAR scan uploaded | PM | Push | "New scan: {label} — {date}." If delta detected vs. previous scan: "Changes detected in {n} areas." Deep link to scan viewer. |
| Punch list item completed by sub | PM | Push | "{Sub} marked punch item #{n} complete. {x}/{y} punch items resolved." Deep link to punch list. |
| New user joined project | PM | Push | "{Name} accepted their invitation and joined {project} as {role}." |
- Budget dashboard (budget_lines table)Any budget_line update (CO approval, bid award, actual cost) is reflected immediately on all connected PM sessions without page refresh. Variance calculations re-run client-side on the received payload.
- RFI list (rfis table)Status column changes (Open → Under Review on response received) update in real-time in the RFI list view. Red overdue indicator appears live when due_date passes.
- CO list (change_orders table)Owner approval via email token triggers CO status update. PM watching the CO list sees it flip to Approved instantly. Budget line variance indicator updates simultaneously.
- Bid count (bids table)When a sub submits via online form, bid count on the package increments in real-time. PM watching the bid package sees "3 of 7 bids received" update live without refresh.
- Web Push API with VAPID keysPWA uses Web Push API for iOS and Android push delivery. VAPID keys generated at app setup. Push subscriptions stored in push_subscriptions table keyed to user_id and device fingerprint.
- Permission request timingNotification permission prompt shown after first successful project action (e.g., after first RFI is sent), not on install. Context-aware prompt improves grant rate. Users who deny can re-enable in settings.
- Preference controlPer-user, per-project notification preferences stored in user_notification_prefs: all / critical_only / none per notification type. Super defaults: daily log reminders + RFI mentions only.
- Email fallback for critical eventsIf push delivery fails (browser closed, permissions revoked), CO approvals, budget alerts, and overdue RFIs fall back to email via Resend. Standard notifications are push-only.