const PLANDATA = { contractor: { name: 'Labour Contractors', per: 'Platform subscription', unit: 'Annual subscription', lead: 'You supply labour — so you buy the platform, not the department. Pool access, requirement discovery and bidding, plus an optional compliance back-office for your own workers.', tiers: [ ['Starter', ['25 worker contact reveals a month', 'Bid on 10 requirements a month', 'One location in the Pune Metropolitan Region', 'Verified business profile', 'Requirement discovery in that location']], ['Growth', ['75 worker contact reveals a month', 'Unlimited bidding', 'Verified badge and priority placement in bid lists', 'Discovery across the whole Pune Metropolitan Region', 'Lead and connection management']], ], }, epc: { name: 'EPC / general contractor', per: 'Managed labour retainer', managed: true, unit: 'Per project site', lead: 'One retainer per project site. Verified workers deployed at the seat count you scope, and your entire labour compliance function run by our team from the platform.', }, builder: { name: 'Builder / developer', per: 'Managed labour retainer', managed: true, unit: 'Per project site', lead: 'One retainer per project site. Verified workers deployed at the seat count you scope, statutory records maintained end to end, and a portfolio view across every site you run.', }, }; const GROUPS = [ ['users', 'Verified labour supply', ['Seat count scoped with you — 50, 75 or 100 on one site, and any figure above that scoped in a requirement consultation', 'Every worker verified before deployment — ID, bank, trade and skill grade', 'Replacement mobilised within 72 hours of a worker leaving', 'Returning workers re-deployed the same day — their records already exist', 'Seat board showing who is on site, days held and where you are short']], ['shield', 'Compliance, run by our team', ['Forms 9, 10, 12, 13, 14, 15, 16, 17, 18, 19 and Form D generated every month', 'CLRA Form XII and XIII prepared for your principal-employer file', 'PF, ESIC, PT and TDS bifurcation per worker per cycle', 'Returns filing support on every payroll cycle', 'BOCW registration and cess return support', 'Minimum wage and VDA revision alerts, with arrears exposure flagged per site']], ['layout-dashboard', 'Dashboard and records', ['Attendance marked at site on mobile — works offline, syncs when there is signal', 'Wage sheet and bank-ready payout file each cycle', 'Advance and recovery ledger', 'Inspection-ready audit pack — one download per site per month', 'Safety induction, PPE issue and incident registers', 'Multi-site view across every project on retainer']], ]; const REPLACES = [ ['Labour officer / site compliance staff', '₹35,000 – 45,000'], ['Payroll executive', '₹25,000 – 30,000'], ['Compliance consultant retainer', '₹15,000'], ['Sourcing and verifying the workers yourself', 'Your own time'], ]; const ADDONS = [ ['Moving up a seat band mid-term — 50 to 75, or 75 to 100', 'Re-banded from the next cycle'], ['Sites needing more than 100 workers', 'Scoped in a requirement consultation, then quoted'], ['Worker onboarding — KYC, e-Shram and BOCW enrolment', 'One time, per worker'], ['Replacements beyond 12 in a month', 'Per worker'], ['Historical clean-up — prior months’ registers reconstructed', 'One time, per site'], ['Each additional project site', 'A retainer of its own'], ]; const MSEATS = [['Up to 50 workers', 'One tower, one package or a finishing crew'], ['Up to 75 workers', 'A site running two or three trades at once'], ['Up to 100 workers', 'Structure and finishing together, or a long package'], ['More than 100 workers', 'Scoped with you before it is quoted']]; const CSEATS = [['Up to 25 workers', 'A single crew you place at a time'], ['Up to 50 workers', 'Two or three crews across sites'], ['Up to 75 workers', 'Regular multi-trade supply'], ['Up to 100 workers', 'Sustained supply across several buyers'], ['More than 100 workers', 'Scoped with you before it is quoted']]; const ROLE_LABELS = [['contractor', 'Labour Contractors', 'hard-hat'], ['epc', 'EPC / general contractor', 'building-2'], ['builder', 'Builder / developer', 'landmark']]; const COMMON = [ ['file-signature', 'How quoting works', 'Tell us the requirement — workers, trades, location and start date. We come back with a written quote and scope. Nothing is payable before you accept it.'], ['receipt', 'GST invoicing', 'Every payment generates a GST invoice against your registered business details. All quoted amounts are exclusive of GST.'], ['wallet', 'Wages stay with you', 'You pay your workers directly from your own account. We prepare the payout file and hold the record — we never hold or disburse wages.'], ]; function PricingPage() { const [role, setRole] = useState(() => { try { return localStorage.getItem('lt_role'); } catch (e) { return null; } }); const [open, setOpen] = useState(false); const [tier, setTier] = useState(0); const [seatIx, setSeatIx] = useState(0); const signIn = r => { try { localStorage.setItem('lt_role', r); } catch (e) {} setRole(r); setOpen(false); setSeatIx(0); }; const signOut = () => { try { localStorage.removeItem('lt_role'); } catch (e) {} setRole(null); setOpen(false); }; const p = role ? PLANDATA[role] : null; const managed = !!(p && p.managed); const seatList = managed ? MSEATS : CSEATS; const quoteHref = 'subscribe.html?seats=' + seatIx + (managed ? '' : '&tier=' + tier); return (
{!role && (
Log in to continue

Which account are you signing in to?

Plans are shown per business type once you are signed in. Not registered yet? Register your business →

{ROLE_LABELS.map(([k, t, ic]) => ( ))}
Demo sign-in. In the live platform this screen sits behind authentication and reads your business type from your account.
)} {role && !open && (
Signed in

{p.name}

{p.lead}

Go to dashboard

Signed in as the wrong business type? { e.preventDefault(); signOut(); }}>Switch account

)} {role && open && ( {!managed && (
{p.tiers.map((t, i) => )}
)}
{managed ? p.per : p.per + ' — ' + p.tiers[tier][0]}

{p.name}

{managed ? 'Quoted per project site.' : 'Quoted on your annual subscription.'}

{managed ? 'Pick the number of workers the site needs below and send it to us. You get a written quote covering supply, day-to-day management and the full statutory function for that site — with the rate per worker falling at each block of 25.' : 'The platform is sold as an annual subscription. Pick the tier and the volume of workers you need to reach, send it to us, and we will come back with your quote and terms.'}

Request a quote
{!managed &&
{p.tiers[tier][0]} — what is included

Every month, for the year.

}
Your requirement

How many workers?

{managed ? 'Seats are scoped per site in blocks of 25, and the rate per worker falls with every block. Above 100 on one site we visit, scope the deployment and then quote it.' : 'This sets the pool access and bidding volume we quote against. Above 100 we scope it with you first.'}

{seatList.map(([t, b], i) => ( ))}
{managed && (
{GROUPS.map(([ic, t, items]) => (

{t}

))}
What the retainer replaces

A labour department costs ₹75,000 – 90,000 a month to staff.

And it still leaves you to find the workers yourself.

{REPLACES.map(r => )}
What you staff todayMonthly cost
{r[0]}{r[1]}
Labour Tech, per siteQuoted to your requirement
Comparison figures are indicative market salary ranges, not a quotation. Your own costs will differ.
Add-ons

Beyond the retainer.

{ADDONS.map(r => )}
{r[0]}{r[1]}
Replacements up to 12 workers a month are included in the retainer. Add-on rates are stated in your quote.
)} {!managed && (
Optional add-on

Compliance back-office for your own workers

You are the employer of your own workers, which means the same statutory registers and returns a builder needs. Our team runs them for you from the same platform, billed on the headcount actually administered each month. Ask for it when you need it and we will quote it with your subscription.

Available from your dashboard once your platform subscription is active.
)}

No commission on hires. Plans for other business types are shown in their own accounts. { e.preventDefault(); signOut(); }}>Switch account

{COMMON.map(([ic, t, b]) =>

{t}

{b}

)}
)}
); } LTMount('pricing', );