Gigs, products, ensembles
Most systems revolve around the customer. Not here. Here the complexity starts, ends, and loops all around the gig.
The gig
A gig is one engagement: a date, a venue, a party name, a contract number, a status (inquiry, proposal, booked, completed, cancelled). Everything else hangs off it.
| Hangs off a gig | Route | What it is |
|---|---|---|
| Products | /gigs/{id}/products |
The segments contracted for this gig, e.g. Ceremony, Cocktail Hour, Reception. |
| Roles | /gigs/{id}/roles |
Every staffing slot on the gig, across all products. |
| Contacts | /gigs/{id}/contacts |
The people connected to it, with the role each plays (Bride, Planner, Photographer, …). |
Products
Ceremony, cocktail hour, reception. Those are your products — the catalog of what you sell (/products). Each has price tiers (/products/{id}/prices) and a list of the ensembles that can fulfil it (/products/{id}/ensembles). A production product (sound and lighting) can point at the entertainment product it supports.
When a gig is sold, a product is instantiated on it as a gig product: its start and end time, location, negotiated price, and, once staffed, the ensemble that plays it.
Ensembles
Your bands, from the 2-piece cocktail hour players to the 17-piece reception band. An ensemble is a reusable lineup (/ensembles) built from roles (/ensembles/{id}/roles): Drums, Bass, Lead Vocal, FOH Engineer. Roles come from a catalog (/roles) grouped into teams (/teams) — Rhythm Section, Horns, Vocals, Production.
You staff them, repeat them, make and re-make them each year. The ensemble is a template; a gig gets a copy.
Staffing a gig, end to end
# 1. put the Reception product on the gig
curl -X POST $BASE/gigs/$GIG/products -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"productId":"…","label":"Reception","status":"Confirmed","startTime":"20:00","endTime":"23:30"}'
# 2. apply the 10-piece: every role in the ensemble becomes a gig role on this product
curl -X POST $BASE/gig-products/$GIG_PRODUCT/apply-ensemble -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"ensembleId":"…"}'
# 3. invite a drummer to the Drums slot; rounds are numbered per role
curl -X POST $BASE/gig-roles/$ROLE/invite -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"staffMemberId":"…","notes":"Call 17:00"}'
# 4. record the answer; accepted assigns the person to the role
curl -X POST $BASE/gig-role-invitations/$INVITATION/respond -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"response":"accepted"}'
Applying an ensemble copies its roles into gig_roles; editing the ensemble later never rewrites a gig that has already been staffed. A gig role remembers its latest invitation, the assigned staff member, call time, and the computed pay lines once a rate is applied.
Staff
Staff members (/staff-members) are the people who work gigs. Their capabilities are staff_member_roles (which catalog roles they can fill, with a call order), their unavailability is staff_member_blockouts, and their pay structure per product is staff_member_product_rates. Each is reachable under the person: /staff-members/{id}/roles, /blockouts, /product-rates, /gig-roles.
Contacts
Contacts (/contacts) are the client side: couples, parents, planners, vendors. Identity only. The role a contact plays is a fact about the pairing with a gig and lives on the gig contact, never on the contact.