Contractor registration, then a market-rate multifamily project
The contractor portal from the contractor's side. Steps 0 to 5 are registration, from sign-in to Submitted; households play no part in it. Steps 6 to 19 are a HOMES project for a market-rate building, one with no income approval: starting the project, the owner linking it, the HOMES sections, sharing and sending, then staff review, the final signing and payment. Market rate is decided in the staff portal with an internal HEA- code; the contractor portal sees it as a building with no income code. The dashed arrow from Submitted stands for the approvals in between, which are not drawn: the registration, and the HOMES assessment service.
Pick a step
Dashed: shown to the other person, the project stays put
Registration drawn 15 October 2026 from the contractor registration stories on staff portal #252, checked against IRA_Contractor_Portal main. Market-rate project added 16 October 2026 for staff portal #259, from #240/#241 on this portal's main and contractor portal #82 on its test branch ben_update_10/13. The numbers give the saved walkthrough order. Diamonds are decisions. Solid arrows are handoffs; dashed arrows share information.
The same chart as a list
Sign in and start registration — Sign in, then choose Start New Registration.
Sign-in happens on Focus on Energy's sign-in page; the portal itself shows no password error. Start also offers joining a colleague's registration with an invite code.
As an IRA contractor, I want to log into the portal and start a new registration so I can apply to participate in the program.
Contractor can access the portal login page.
Contractor can log in with valid credentials.
Contractor sees an error message for invalid credentials.
After logging in, contractor sees an option to Start New Registration.
Selecting it opens the registration form at Step 1.
A progress indicator shows all steps: Applicant Details → Company Details → Specialties & Certifications → Review & Submit.
Step 1: Applicant details — Who is applying for the business.
The portal does not ask for the applicant's email: it uses the signed-in account. Step 1 also asks for the company name, company email and acceptance of the End-User License Agreement.
As a contractor, I want to enter my personal information so the program knows who is applying on behalf of the business.
Contractor can enter first and last name.
Contractor can enter contact information (email, phone).
Contractor can enter their role or title at the company.
Required fields are clearly marked.
Contractor can't continue until required fields are complete and valid.
Missing today: the portal's step 4 is "Terms & Conditions", with no summary of steps 1–3 and no edit links; the Submit button is never disabled, and an unticked box is refused with an error after clicking.
As a contractor, I want to review my registration and agree to the terms so I can submit my application.
Contractor sees a summary of all information from Steps 1–3.
Contractor can edit any section from the summary.
Contractor must read and agree to the terms and conditions (checkbox).
The Submit button is disabled until the terms are accepted.
On submit, contractor sees a confirmation message.
Staff decide the building is market rate — Fewer than half the units are low or moderate income. An internal HEA- code.
On this portal's main (#241, qualification.decide_market_rate); on the test site, not yet in production.
One rule decides a building's tier from its unit results, in this order: Low when 50% or more of counted units are Low; Moderate when, otherwise, 50% or more are Low or Moderate together; market rate otherwise (#240).
"50% or more" rounds up: 5 counted units need 3. Only occupied units are counted (#240, question 1).
A tenant approved as High / market rate counts as market rate, not toward Low or Moderate (#240).
Staff must write a note. The decision is refused while the 50% rule is met at low or moderate income.
The building gets an HEA- code from the same number sequence as LEA- and MEA-. Only staff see it: it is kept out of property_ea_codes, the table the customer and contractor portals read.
Any LEA- or MEA- code the building still held is superseded.
A building can also be market rate simply because it never got an income approval. The contractor portal treats both the same way: no income code.
Start a project with no building code — Gets a PRJ- code and waits for the owner to link it.
On the contractor portal's test branch for #82 (app/project_links.py); not on its main.
A market-rate building has no LEA- or MEA- code to type, so the contractor starts the project with no building, or takes over an owner's project with its PRJ- code.
"+ Start a project" asks first for a code. It accepts LEA-/MEA- plus ten digits, and PRJ- codes, in any case, with or without dashes and spaces (#82 1.2).
A PRJ- code for a project the owner started opens that same project for the contractor. No second project is created (#82 1.7).
A project started with no building gets a PRJ- code and shows "Waiting for the owner to link this project". It can be filled in, but not shared or sent until the owner links it (#82 1.9).
The contractor can send the owner an invite by email. Its link works once (#82 1.10).
Owner links the project — From the contractor's invite, or by handing over the PRJ- code.
Missing: the customer portal's test site does not yet have the page an owner opens from an invite link, or the owner starting a project. Both are on its redesign branch (#233).
The owner opens the invite link (/link/<token>) and links the project to their building. The link works once; opening it again says it has already been used (#82 1.10).
When a contractor links a project, the owner gets an email naming the contractor and the building, with "Open the project" and "Disconnect" (#82 1.6).
Linking rechecks that the company is still approved and the project is still unlinked (#82 1.8).
Property and buildings — The building shows no income code and uses the market-rate row.
On the contractor portal's test branch for #82 (app/mf/sec_property.py).
A building with no LEA- or MEA- code shows "No income approval". It can go ahead at market rate (#82 3.2).
HOMES's sections are: 1 Property and buildings; 2 Energy assessment; 3 Energy model and savings; 4 Upgrades and rebate; 5 Paperwork; 6 Proposal and the owner's forms; 7 Send to the program (#82 3.1).
Energy assessment — Opens only with the approved HOMES assessment service.
On the contractor portal's test branch for #82 (app/mf/sec_assessment.py).
The contractor enters the assessment itself. The section opens only when the company's registration carries the approved "Home Energy Assessments (HOMES)" service, unexpired, and the company is a Focus insulation and air sealing Trade Ally or a Weatherization provider. Otherwise it says what's missing (#82 3.3).
Each person named on the assessment has a credential, number and expiry. Field-only credentials can't be the modeler (#82 3.4).
The $2,000 assessment incentive is for low-income buildings only, so a market-rate building has no assessment claim.
Energy model and savings — One model per building. At least 20% savings to send.
On the contractor portal's test branch for #82 (app/mf/sec_energy_model.py).
There's one model per building. Buildings of 5 or more units need an ASHRAE Level II audit, a tool on Focus's approved list and a BuildingSync file with Asset Score and Audit Template reports. Buildings of 2-4 units may use a BPI-2400 tool and an HPXML file (#82 3.6).
The model file fills in year built, floor area, floors and audit date. The contractor confirms them (#82 3.7).
19.5% savings counts as 20%. Below that, the project can't be sent (#82 3.8).
Upgrades and rebate — Market rate: 50% of cost, $1,500 or $3,000 per unit, capped.
On the contractor portal's test branch for #82 (app/mf/sec_upgrades.py, app/mf/homes.py, app/data/program_settings.json).
Measures come from Focus's approved HOMES list. Work that isn't eligible is listed and marked "not eligible" (#82 3.9).
Each building's rebate is the smallest of its share of cost, the per-unit amount x units, and the building cap (#82 3.10).
Market rate (no income approval): 50% of cost; $1,500 per unit, capped at $200,000, for 20-34% savings; $3,000 per unit, capped at $400,000, for 35% or more.
A market-rate building's rebate can be paid to the contractor as an instant discount, or to the owner (#82 3.11).
A building with $40,000 or more in rebates is inspected before payment (#82 3.12).
Still to confirm with Focus: which units earn the per-unit amount: all, occupied, or only those in the project (#82 3.14).
Share the proposal — Freezes the version the owner reads.
On the contractor portal's test branch for #82 (app/mf/sec_proposal.py). The owner's side of it is not built yet (card 14).
The portal makes the proposal from the contractor's lines as a PDF. A HOMES proposal includes the first-year energy cost estimate (#82 4.1).
"Share with the owner" opens when the project is linked and sections 1-5 are done. Sharing freezes that version and records its date and time: the "date proposal provided to customer" Focus asks for (#82 4.2).
A change after sharing is a new version, shared again. The proposal is never signed.
Owner reads the proposal — No before-work forms unless the job has heat pumps.
Missing: the customer portal does not yet show a shared proposal or record the owner's forms (#82 4.3, 4.4).
The owner reads the shared proposal in their portal, with no accept button, and gets an email that it's there (#82 4.3).
A market-rate building has no low-income building owner acknowledgment.
A project with no low-income building and no heat pumps has nothing for the owner to sign before the work (#82 4.5). Focus has paused multifamily heat pumps for now.
Send to the program — Opens once the project is linked and shared.
Missing: the section is on the contractor portal's test branch (app/mf/sec_send.py), but the button stays off until the program setting multifamily_sending_open is turned on. The staff portal can't take a multifamily project with several lines yet (#158), and the owner's signatures can't be recorded yet.
"Send to the program" opens only when the project is linked and shared, and every before-work form that applies is signed (#82 4.6).
The section lists each condition in plain words with where it stands.
Sign the completion papers — After the work, the contractor signs first.
Missing: the completion steps are not built in the contractor portal yet (#82 4.7-4.9).
After the work, the contractor records install dates, serial numbers, geotagged photos and safety tests on a sample of units: 5-9 units, 4; 10-29, 7; 30-49, 10; 50-99, 15; 100 or more, 20. A HOMES project adds its final model and report (#82 4.7).
The completion packet is one numbered, frozen packet with one signature page: the offer letter's completion pages, the final invoice and, where it applies, the combustion and ventilation notice (#82 4.8).
The contractor signs first, ticking that they've read the program terms and the Registered Contractor Participation Agreement. A change before the owner signs makes version 2, and both are asked again (#82 4.9).
Owner signs the completion papers — Online in their portal, or on paper sent back.
Missing: the customer portal can't record the owner's signature yet (#82 4.10-4.13).
The owner gets an email that the work is done and their signature is the last step before payment, with "Sign in to sign" and the packet attached (#82 4.10).
The owner signs in their portal: they agree to sign electronically, tick each completed line, confirm the statements, type their name and press Sign (#82 4.11).
Each signature records who signed, when, the packet version and a SHA-256 fingerprint of the packet (#82 4.12).
Signed paper also works: the owner uploads it, the contractor uploads pages both signed in person, or staff add pages mailed to Focus (#82 4.13).