Two provider types, one marketplace. π΅ Blue Team = Individual Provider β bids and gets paid directly. π’ Green Team = Team Provider β belongs to a B2B company, dispatched through their admin. Both visible in the same bid pool. Client always tracks a real person.
PRICING TIERS (separate from provider types):Plan A β $1,500/mo flatPlan B β 15% per completed jobThese are B2B subscription pricing plans β NOT provider categories
π Provider Model β Two Types, One Marketplace
π΅
Blue Team β Individual Provider
Solo operator. Independent contractor. No company above them. Bids directly on marketplace jobs. Gets paid directly via their own Stripe Connect account. Client tracks them immediately after bid is accepted.
DB:providers.provider_type = 'individual'
π’
Green Team β Team Provider
Employee or member of a B2B company account. Their company may bid on their behalf (admin dispatches), or they can bid directly under the company umbrella. Payment goes to company Stripe Connect. Client tracks the person, not the company.
DB:providers.provider_type = 'team' + account_providers link
Plan A ($1,500/mo) and Plan B (15%/job) are pricing tiers for B2B accounts β they are NOT provider types. A Green Team company can be on Plan A or Plan B. Blue Team individuals always pay 15%/job (no flat rate option at launch).
End-to-End Flow β Master Overview
π€
Client Logs In
Searches available services in their city/ZIP
π
Submits Service Request
Category, location, description β open bid
π₯οΈ
Master Admin Panel Receives Request
Routing engine: trade + ZIP + account_providers lookup
π£
Open Bid Broadcast
All B2B companies + their employees in this trade/ZIP receive the job
π’ Green Team β Via Company
π’
B2B Company Admin Bids
Reviews request, submits company bid
β
Client Accepts Company Bid
Job assigned to company account
π₯
Company Dispatches Employee
Admin assigns specific employee from their roster
π
Client Tracks Employee
GPS + status β the worker, not the company brand
π
Job Complete
Sign-off β payout release β review
π΅ Blue Team β Direct Individual
π§βπ§
Employee Bids Directly
Individual provider (company employee) bids under company umbrella
β
Client Accepts Employee Bid
Provider profile shown to client immediately
π
Client Tracks Employee
Same GPS tracking β direct from accepted bid
π
Job Complete
Sign-off β payout release β review
β‘ Key Architecture Point for Grigori
In both bid routes, the client always tracks the individual worker β not a company brand. Whether a company dispatches the employee (Company Bid Route) or the employee wins the bid directly (Employee Direct Bid), the tracking object is the same: a provider record with GPS, trust score, and job status. The only difference is whether the dispatch decision was made by the company admin or by the employee themselves.
Every provider in the US B2B build is linked to a B2B account via the account_providers join table. There are no unaffiliated standalone freelancers in this model.
Client Journey β Step by Step
1
Client creates account and logs in to Varpet app or web
Profile: name, city/ZIP, service preferences, payment method on file (Stripe)
2
Client browses service categories available in their ZIP code
Filters: trade/category, date/time preference, budget range. Only shows services where active B2B companies operate in their ZIP.
3
Client submits a service request β open bid model
Fields: description, preferred date/time, location, photos (optional), budget (optional). Request is visible to all qualified providers in that trade/ZIP.
4
Platform routing engine broadcasts the open bid
Admin panel queries account_providers: finds all B2B companies + employees with matching trade and ZIP. Notification sent to company admins AND eligible employees. Client waits for bids β they do NOT see internal routing.
5
Client receives one or more bids β reviews and selects
Each bid shows: provider name, trade, trust score, price, ETA, verification badges. Could be a company bid (admin submitted) or an employee direct bid. Client cannot see the difference β they just see a named, rated provider.
6
Client accepts bid β job is created and locked in the system
If company bid was accepted: company admin receives notification β assigns specific employee from roster β employee profile is revealed to client. If employee direct bid was accepted: that provider's profile is already revealed β no extra dispatch step needed.
7
Client tracks the assigned provider in real-time
GPS tracking shows the actual worker. Status updates: Confirmed β On the Way β Arrived β Working β Done. The client always tracks a person, never just a company name.
8
Job completed β digital sign-off β payment released β review prompt
Client signs off digitally (mobile). Approved payout releases through Stripe Connect. Review is tied to the individual worker's trust score profile. Rating affects their composite score.
β οΈ Grigori β Bid Presentation Note
Whether the bid comes from a company admin or an employee directly, the client-facing bid card must look identical β a named, rated person with a trust score. The internal routing difference is transparent to the client. This keeps the UX clean and consistent regardless of which bid route wins.
Admin Routing Engine β How Jobs Are Broadcast
π Routing Principle
The routing engine does not prioritize individual providers over companies (or vice versa). All providers affiliated with B2B accounts in the matching trade/ZIP are notified simultaneously. The open bid model lets the market decide who wins β fastest/best bid from any eligible source.
Routing query: find all active providers in trade + ZIP
SELECT p.* FROM providers p JOIN account_providers ap ON ap.provider_id = p.id WHERE p.trade = :trade AND :zip = ANY(p.zip_codes) AND ap.status = 'active' AND p.active = true
R3
Bid broadcast β two channels fire simultaneously
Channel A: Notify b2b_admin users of each matched account (company-level bid opportunity). Channel B: Notify individual provider users (employees) whose ZIP + trade match (employee direct bid opportunity).
R4
Bid window open β multiple bids can arrive
Platform collects bids. Each bid contains: provider_id (or company account + proposed employee), price, ETA, message. Ranked by trust score + ETA for client presentation.
R5
Client selects winning bid
Job status updates to assigned. All other bidders are notified the job is closed. Stripe payment workflow begins.
R6
Post-assignment routing branch
If company bid won: company admin must assign a specific employee within [X minutes] or job escalates back to admin. If employee direct bid won: no further assignment step. Provider is already confirmed. Client tracking activates immediately.
R7
No-bid escalation (fallback)
If bid window closes with no bids received: job escalates to Varpet admin for manual handling. Client is notified of delay. Job stays open until assigned.
β οΈ Company Dispatch SLA
After a company bid is accepted, the company admin must assign an employee within the SLA window (recommend 15 min). If they don't, the job should auto-escalate. Build a countdown timer in the company admin view.
β Trust Score in Routing
When presenting bids to the client, sort by: (1) trust score, (2) ETA, (3) price. High trust score providers surface first β this is the platform's quality signal and moat.
π’ Green Team β B2B Company Bids, Then Dispatches Their Provider
Green TeamProvider belongs to a B2B company. Company admin receives the job, submits the bid, then assigns the specific team member. provider_type = 'team'
1
B2B company admin sees the open bid in their dashboard
Company admin reviews their available employees for this job
Admin sees their roster (account_providers β providers). Filters: trade, ZIP coverage, current availability, trust score. Admin mentally pre-selects the employee before bidding.
3
Company admin submits company bid
Bid fields: price, ETA, brief message. The company's name + aggregate trust score is shown to the client. The specific employee is NOT revealed at this stage.
4
Client accepts company bid β job locked to this account
Job status: assigned_to_account. Payment workflow begins. Company receives immediate notification to dispatch.
5
Company admin assigns a specific employee to the job
Admin opens job β selects employee from their roster β confirms dispatch. Employee must be an active provider in account_providers with matching trade. Job status β dispatched.
SMS + in-app push. Shows: client address, job description, ETA expectation, and payment amount. Employee must acknowledge acceptance.
7
Employee's provider profile is revealed to the client
Client now sees: employee name, photo, trust score, verification badges, GPS location. Client tracking activates. This is the same profile view as an employee direct bid β the handoff is invisible to the client.
8
Employee arrives, performs service, requests digital sign-off
Client signs via mobile. Photos uploaded (before/after). Job status β complete.
9
Approved payout releases to company's Stripe Connect account
Company is the payment recipient (not the employee directly). Company handles their own payroll to the employee. Review triggers β tied to the employee's trust score, not the company account.
ποΈ DB Objects Involved
b2b_accounts (company entity) β
account_providers (join: which employees belong to this company) β
providers (the employee record: GPS, trust_score, trade, zip_codes) β
jobs (b2b_account_id + provider_id + client_id + payment_status)
β οΈ Important β Commission Rules
Jobs dispatched through the marketplace (client submitted β company bid β won) are subject to Varpet commission per the B2B account's pricing plan: Plan A accounts pay $1,500/mo flat (no per-job fee). Plan B accounts pay 15% deducted from each completed paid job through the Stripe Connect payment flow. The job source field determines this: jobs.job_source = 'marketplace'.
π΅ Blue Team β Individual Provider Bids Directly
Blue TeamSolo operator. No company above them. Bids directly, gets paid directly. provider_type = 'individual'
π How Blue Team Differs from Green Team
A Blue Team provider is a solo operator β a single person running their own trade business. They have no company admin dispatching them. They see the open bid, submit their own bid with their own price and ETA, and if accepted, the client tracks them directly. Their Stripe Connect account receives payment minus Varpet's 15%. No middleman, no dispatch step, no company layer. Simple and fast.
1
Employee (provider user) receives open bid notification
Same notification channel as company admins. Employee's app shows available jobs matching their trade + ZIP. Role: provider with company_id pointing to their B2B account.
2
Employee reviews the job request and decides to bid
Employee sees: description, location, budget range, preferred timing. They set their own price + ETA in the bid. Their personal trust score is attached to the bid automatically.
3
Employee submits bid β their provider profile is shown to the client
Client sees: employee name, trade, trust score, verification badges (ID verified, background check, insurance), price, ETA. The company name may or may not be shown (UI decision) β but the client evaluates the individual worker.
4
Client accepts the employee's bid
Job status β assigned. Provider ID is written directly to jobs.provider_id. No intermediate company dispatch step. Payment workflow begins immediately.
5
Employee confirms the job and GPS tracking activates
Client sees employee location in real-time. Status flow: confirmed β on_the_way β arrived β working β complete. Employee updates status from their mobile app.
6
Service performed β employee requests digital sign-off
Photos uploaded. Client signs off. Job status β complete.
7
Approved payout releases to the provider's Stripe Connect account
Same payment flow as company route β the B2B account receives the funds. Internal employee payroll is managed by the company outside Varpet. Review is tied to the employee's personal trust score.
β Client Experience β Identical
From the client's perspective, an employee direct bid looks exactly the same as a company bid that was dispatched to a worker. They always see a named, rated, GPS-trackable individual. The route taken is invisible.
β οΈ Grigori β Company Awareness
When an employee bids directly, should the company admin see this in their dashboard? Recommend yes β the company admin should have a log of all bids submitted by their employees, even if they didn't initiate the dispatch. Visibility without blocking.
B2B Own-Customer Panel β Zero Commission Track
Own CustomerB2B company adds their existing customers to the platform and manages jobs internally. No Varpet commission applies.
π Purpose β Why This Exists
Many local service companies already have an existing customer base they service directly. Forcing them to run these jobs through the Varpet marketplace (and pay commission) would be a deal-breaker. The Own-Customer Panel lets them use Varpet's dispatch, tracking, and payment tools for their existing relationships β at no extra cost. This is a value add that drives stickiness, not a revenue source. It also naturally expands the platform's job volume and trust score data.
Flow β Own-Customer Job
1
B2B company admin adds their existing customer to the platform
Admin creates a client record: name, address, contact, service history (optional). clients.b2b_account_id = this_company. Client is tagged as client_source = 'own_customer'.
2
Company admin creates a job directly β no open bid
Job is created with job_source = 'own_customer'. This flag bypasses the marketplace routing engine. No broadcast. No competing bids. Direct assignment only.
3
Company admin assigns the job to one of their employees
Same assignment UI as the company bid route β select from roster. Employee receives notification and confirms.
4
Employee performs service β client tracks via Varpet app
If the own-customer has the Varpet app, they get GPS tracking + status updates. If not, the company admin can share a tracking link manually.
5
Job complete β payment handled directly by the company
Varpet takes zero commission on own-customer jobs. Payment may go through Stripe (if configured) or be handled outside the platform. Payout-release rules are optional for own-customer jobs.
β Benefits to the Company
Full dispatch and tracking tools at no extra cost. All jobs β marketplace AND own-customer β visible in one dashboard. Trust score data accrues across both job types, strengthening the employee's profile over time.
β οΈ DB Flag Required
The jobs.job_source field is critical. It must be enforced at the DB level to prevent billing logic from applying commission to own-customer jobs. Recommend: ENUM('marketplace', 'own_customer', 'manual'). Commission triggers only on 'marketplace'.
Future: Own-Customer β Marketplace Conversion
When an own-customer later searches Varpet for a service that the company doesn't offer, the platform can surface other B2B providers β naturally converting an own-customer into a marketplace transaction. This is a growth flywheel: companies bring their customers in, and Varpet earns commission when those customers go outside the company's service scope.
Three Provider Tracks β Side-by-Side Comparison
Dimension
π’ Green Team (B2B Company)
π΅ Blue Team (Individual)
B2B Own-Customer Panel
Job origin
Client submits via marketplace
Client submits via marketplace
Company admin creates directly
Who bids
Company admin (on behalf of company)
Individual employee (under company umbrella)
No bid β direct assignment
Dispatch step after bid wins
β Admin must assign employee
β Employee already confirmed
β Admin assigns employee
Client tracking object
Employee (after company assigns)
Employee (immediately)
Employee (after assignment)
Client sees company name
Yes β company bid card shown
Optional β employee shown primarily
N/A β direct company relationship
Trust score used
Company aggregate + employee after assign
Employee personal trust score
Employee personal trust score
Varpet commission
Yes β per Plan A/B pricing
Yes β per Plan A/B pricing
β Zero commission
Stripe payment + payout release
Yes β required
Yes β required
Optional (company handles payment)
Review tied to
Employee trust score profile
Employee trust score profile
Employee trust score profile
DB job_source value
'marketplace'
'marketplace'
'own_customer'
Open bid broadcast
β Yes
β Yes
β No β internal only
Who can initiate
Company admin (b2b_admin role)
Employee (provider role)
Company admin (b2b_admin role)
Plan A/B pricing applies
β Yes
β Yes
β No
Pricing Plans β Plan A vs Plan B (for reference)
Plan A
$1,500/mo
Flat monthly subscription β best for accounts ready to scale
Managed Google Ads integration
CallRail tracking number per account
Website lead webhook to jobs table
Metricool social feed
Unlimited marketplace jobs β no per-job fee
Full dispatch + payment protection + trust score
B2B own-customer panel included
Plan B
15% per completed job
Zero upfront β 15% deducted from each completed paid job via Stripe Connect
No monthly commitment
Dispatch + payment protection + trust score included
B2B own-customer panel included
Natural upsell: once job volume makes $1,500/mo the cheaper option, upgrade to Plan A
15% deducted automatically at job completion (Stripe Connect)
β οΈ Plan A/B = Pricing Only β Not Provider Types
Plan A and Plan B describe the B2B account's subscription pricing tier β not the type of provider or the routing path. Any B2B account on any pricing plan can use Company Bid, Employee Direct Bid, or the Own-Customer Panel. The plan determines how Varpet bills the account, nothing else.
Varpet entity or independent licensed territory operator
platform_royalty_pct
NUMERIC
7% proposed only for licensed_operator; NULL for company-owned markets
royalty_base
TEXT
Defined local platform gross revenue; exclusions set by agreement
currency
TEXT
Local currency code: 'USD', 'EUR', 'AMD'
payment_provider
TEXT
Local payment rail (Stripe, IDram, etc.)
status
TEXT
'active' | 'pending' | 'suspended'. Active: AM, BE. Launching: US.
admin_user_id
UUID
FK β user_profiles. Independent country_admin for either operation model.
Country operations:π¦π² Armenia β ACTIVE, model to confirm Β·
π§πͺ Belgium β ACTIVE, model to confirm Β·
πΊπΈ USA β COMPANY-OWNED PILOT
π₯ user_profiles β Roles (RLS Gate)
Role
Who
What they see
global_admin
Captain (Varpet Global)
Permitted oversight across country operations, accounts, providers, jobs, and licensed-market royalty reports.
country_admin
Country Operation Admin
Their country only β whether Varpet-owned or licensed. Manages local B2B accounts, providers, jobs, and compliance.
b2b_admin
Company corporate admin
Their account's providers (via account_providers), their jobs, their marketing dashboard. Scoped by country.
b2b_user
Business location user
Same as b2b_admin but limited to one location. Read-only on provider verification.
provider
π΅ Blue or π’ Green Team worker
Their assigned jobs only. No marketing data. Mobile-first job card view.
π Two Separate Money Rules β Do Not Combine Them
15%
B2B Plan B charge for completed marketplace jobs inside a country
7%
Licensed country operator royalty to Varpet Global on defined local platform revenue
0%
Royalty between Varpet Global and a company-owned country such as the US pilot
Plan A/B pricing governs what a local B2B customer pays. Country licensing governs what an independent licensed territory operator owes Varpet Global. The 7% royalty is not a provider payout split and must be applied only when country_operations.operation_type = 'licensed_operator'.
Client pays 100% β payment collected through Stripe
Digital sign-off β provider payout follows the local job agreement
Plan B β 15% platform fee on completed marketplace jobs
Plan A β $1,500/mo local B2B fee; no per-job platform fee
Plan B β Per Job
15%
Local platform fee
B2B
local pricing
+
Job
marketplace
Licensed Country Operator
7%
royalty to Varpet Global
Calculated on defined local platform gross revenue Does not apply to company-owned US pilot
Do not combine fee layers: Plan A/B governs local B2B customer pricing. A country royalty exists only for an independent licensed operator and is stored in country_operations.platform_royalty_pct. Royalty base and exclusions must be written in the licensing agreement.
π€ PHASE 2 β AI LAYER
3-Agent AI Architecture
Customer Agent Β· Provider Agent Β· Admin Orchestrator β each owns its lane, talks to each other
Claude Haiku 4.5
~$0.002 / interaction Β· Zero new vendors
"Three AI agents working in parallel β one handles your clients, one handles your workers, one manages everything in between. From first call to five-star review, fully automated."
π§βπΌ
Customer Agent
Talks to: End Client
What it handles
π Inbound lead β qualify β create job
π΅ Missed call β auto SMS in 60s
π "Marcus assigned. ETA 45 min."
π "Your provider is on the way."
β "Job done. Sign off: [link]"
β Rating collection + Google review
π +7 day rebooking SMS
Does NOT
Contact providers Β· Dispatch jobs Β· See other clients
customer-agent
Triggered by: Twilio Β· CallRail Β· Form POST Β· Supabase Realtime
π§
Provider Agent
Talks to: π΅ Blue + π’ Green Team
What it handles
π€ "New job: [trade] [ZIP]. Accept?"
β Confirm: client details + address
β° 60-min arrival reminder
π· Photo upload prompts (before/after)
π "Mark complete to release payment."
π° "$X released to your Stripe."
π― Trust score change notification
Does NOT
Contact clients directly Β· Dispatch jobs Β· See other providers