The full hiring funnel: post jobs, gigs, or contracts, review proposals through a five-stage pipeline, and hire into engagements with time cards and approvals. Configure it gig-first, contract-first, or job-first — one funnel, your vocabulary.
API workflow reference →Three concepts carry the whole module. A posting attracts bids, a bid moves through the pipeline, and an accepted bid becomes a live working relationship. Everything else — templates, time cards, approvals — hangs off one of these three.
A job, a gig, or a contract — with term type, exact compensation, location or remote, and public or private visibility.
One per party — individual or company — with amount, term, estimated hours, available start, and cover message.
Created Pending at acceptance; goes Active the moment its M20 contract is fully executed. Owns its own terms from day one.
The structural point: one opportunity spawns many engagements. Hiring ten people against one posting is one opportunity, ten proposals at Hired, and ten independent engagements — each with its own contract, terms, status, and time cards.
Every field in one pass: posting type, public or private visibility, remote or located, term type with an exact compensation amount, target start date, and a Markdown description with an ideal-candidate background. Save as a draft or publish on the spot.
Give the AI a rough description and get back a complete draft — title, description, ideal-candidate background, suggested skills. The draft round-trips through the API and lands in the normal posting form; nothing is persisted until you save.
Pick a future date, a time, and a timezone, and the posting sits at Publish On until the scheduled job fires. The stored UTC instant plus the poster's own timezone means an August 9:00 AM stays 9:00 AM — even across a daylight-saving boundary.
The most-reused lookup in the module: the same five terms price an engagement, frame a posting's compensation, type a time card, and set billing frequency. Learn it once, read it everywhere.
Proposals move New → Shortlisted → Advanced → Hired → Rejected — and back. Nothing enforces a direction; every transition records a reason, an actor, and an effective date, so the pipeline doubles as the audit trail.
Work owns the hiring funnel end to end. A posting — a job, a gig, or a contract — attracts proposals; proposals move through a bidirectional five-stage pipeline; an accepted proposal becomes a live engagement; and that engagement accrues approved time ready to bill. The module is deliberately flexible: the same schema and screens run a gig marketplace, a contractor bench, or a traditional job board, because posting type, term type, and visibility are data, not code paths. The structural point that makes it scale: one opportunity spawns many engagements. Hiring ten people against one posting produces one opportunity, ten proposals at Hired, and ten independent engagements — each with its own contract, terms, status, time card, and approval flow. Contract execution is handled by M20 Contracts (an engagement stays Pending until its contract is fully executed), proposal chat and video calls run through M07 Messaging, attachments live in shared blob storage alongside M16, and skills tagging rides the platform's shared label system.
Internal code areas in the licensed Full-Stack codebase that back this module.
ApiWorkOpportunity — posting CRUD, publish, archive, reopen, AI draftApiWorkOpportunityTemplate — prefill payload, defaults, usage countsApiWorkProposal — bids, flags, status changes, conversation joinApiWorkEngagement — lifecycle, status changes, notesApiWorkTimeCard — periods, entries, approval queueScheduled Publish On job + pending-expiry jobThe same schema, the same screens, the same 49 endpoints — these are configuration choices, not code forks. Every posting picks its own type, so a gig marketplace can still publish the occasional job, and a contractor bench can run one-off gigs alongside its retainers.
| Configuration | Gig-focused | Contract-focused | Job-focused |
|---|---|---|---|
| Posting type | Gig | Contract | Job |
| Typical term types | Fixed Bid · Hourly | Monthly · Weekly · Daily | Monthly, salary-style |
| Compensation reads as | Fixed amount, or per hour | Per month / week / day | Per month |
| Default visibility | Public — cast a wide net | Private — invited parties | Public or private |
| Proposal emphasis | Bid amount + portfolio samples | Rate + estimated hours + start date | Cover message + résumé |
| Pipeline usage | Fast — New straight to Hired | Full five stages | Full five stages, interviews via chat + video |
| Hires per posting | Many — one gig, many engagements | One to a few | Usually one per seat |
| Time card approval | Automatic | Manual review | Manual review |
| Engagement shape | Short, fixed-scope | Ongoing until terminated | Ongoing — pause and re-engage |
| M20 contract template | Lightweight gig agreement | Master services agreement | Employment-style agreement |
Accepting a proposal creates the engagement at Pending, not Active. The contract — resolved from the posting's template, cloned, pre-filled, and sent through M20 Contracts — has to come back fully executed before the engagement activates. Declined, expired, or 90-day-stale contracts terminate the engagement and put the proposal back in the pipeline.
A quick visual of how Work — Opportunities, Proposals & Engagements participates across the CleenUI stack, alongside the named operations it adds to the API surface.
Each operation maps to an endpoint in the licensed C# Web API surface.