External storefronts

Give an LLM the Construction storefront skill to adapt the built-in public website, customer account, and project portal or create a separate client.

To create a custom Construction storefront, copy the skill and give it to your LLM. The skill will explain how features/storefront implements the public contractor website and customer account, and how features/portal implements the client and trade partner project portal.

After that source orientation, it will ask what you dislike, what should stay, what workflows and users matter, and what the replacement should look and feel like. It then traces the exact routes, feature slices, GraphQL calls, schema, access rules, sessions, and provider boundaries in the supplied Construction codebase before proposing work.

Skill file: /skills/openfront-construction-custom-storefront/SKILL.md

Storefront routes

Routes live directly under app/ (there is no route group). Screens live in features/storefront/screens, features/storefront/account, and features/portal. The website shows the PublicSiteProfile selected by PUBLIC_SITE_KEY, and only when that profile is published and its company is active.

Public website

RouteCustomer journey
/Home: brand, services, past projects, start-a-project call to action
/servicesPublished services
/services/[slug]Service detail with a link to request a quote
/projectsPublished portfolio projects, filterable by market
/projects/[slug]Project case study
/start-a-project, /client-intakeProject inquiry form (project_inquiry)
/estimateEstimate request form (estimate_request)
/rfpRFP invitation form (rfp_invitation)
/trade-partners, /bidTrade partner interest form (trade_partner_interest)
/contactGeneral contact form (general_contact)
/requests/[publicReference]/confirmationInquiry receipt (publicIntakeReceipt)
/privacyPrivacy notice from the site profile

All inquiry forms call submitPublicIntake. It creates an IntakeSubmission and links a lead and opportunity for staff.

Customer account

RouteCustomer journey
/accountSign in, sign up (registerConstructionCustomer, needs a published site), profile, quote request form, request history
/account/requests/[id]One quote request: status, quote version, amount, terms, expiry; accept or cancel
/account/requests/[id]/paymentPay the deposit on an accepted quote through Stripe Checkout (card or US bank account). Returns with ?session_id= and reconcileCustomerPayment settles it; ?cancelled=1 shows that no payment was taken
/account/resetPassword reset (needs SMTP)

Quote requests use commandConstructionRequest with request, accept, or cancel. Staff use quote and cancel. States are requested, quoted, accepted (stored as payment_pending), and cancelled.

Project portal

RouteParticipant journey
/accept-invitation?token=…Accept a one-time project invitation (acceptProjectInvitation)
/portalProjects the participant belongs to
/portal/projects/[projectId]Project overview and inbox (constructionPortalInbox)
/portal/projects/[projectId]/[tool]Tools: preconstruction (Bids), execution (RFIs & submittals), documents, billing (Billing & waivers), schedule, field (Field updates), quality-safety

Owners also see Pay approved claims in the portal project page (createClaimPayment, checkPaymentStatus). Portal actions call submitPortalBid, respondPortalRfi, reviewPortalSubmittal, submitPortalProgressClaim, submitPortalLienWaiver, decideConstructionApproval (owner approvals, after constructionPortalApprovalSnapshot), and acknowledgeDocumentDistribution. Unknown tool slugs fall back to the overview.

Journey rules

  • Website inquiries are anonymous. They are not linked to a customer and do not appear in /account.
  • An accepted quote is stored as payment_pending. The customer pays the deposit with createCustomerPayment when the company has Stripe set up. Otherwise the payment page shows that online payment is not set up for the contractor.
  • Portal users see only items for their own project membership and portal organization. Financials, contracts, procurement, reports, team, and audit are not available in the portal.
  • Invitation links are shown once to the operator, who shares them with the invitee.

On this page