Docs.

Rental House — Open Questions

business/open-questions.md

Decisions we still need to make. Grouped by where the answer lives. Resolved items are kept (not deleted) with their decision, so the history of what we settled — and why — stays legible.

Pricing

  • Daily vs weekly multipliers — RESOLVED: 3-day week. Shipped. The quote engine charges week_multiplier days per week (default 3.00), weeks stack, and the per-week remainder is capped at one week's charge. A manual per-item weekly override replaces the derived week price.
  • Deposit % of replacement value — RESOLVED: 100%. Shipped. Gear deposit = deposit_percent (now 1.00, migration 0005) × cart replacement value. There's no gear-insurance market in Colombia, so a full-replacement hold is the protection; deposit_minimum_usd_cents ($500.00) is dormant at 100% and only bites if the percentage is ever lowered. Studio-space lines add their own flat damage deposit.
  • VAT/IVA — RESOLVED: 19% on the net total, added at checkout. Shipped. iva_rate (default 0.190) is applied to the net total (subtotal − discount + waiver), not to per-day rates. Day rates are quoted net of IVA; the engine returns net and gross.
  • Currency — RESOLVED: USD cents canonical, COP display-only. Shipped. Every stored amount is USD cents. COP is a display conversion at a snapshotted rate; each reservation freezes fx_rate_snapshot from the org cop_per_usd_snapshot setting at creation. Stripe handles USD; Wompi can present COP, but the ledger stays USD cents.
  • Weekend rate — RESOLVED: a weekend is 3 days at the day rate. A weekend = Friday + Saturday + Sunday = 3 calendar days, each billed at the normal day rate. No surcharge, no discount. The quote engine already bills calendar days, so this is current behavior — nothing new to compute. The weekend_multiplier setting is kept (default 1.00 = day rate) as a dormant, no-op lever for future weekend pricing, but it is NOT applied per-day today.
  • Damage waiver — RESOLVED: not offered. studio.chat does not offer a damage waiver. There's no gear-insurance market in Colombia, so the 100% replacement-value deposit is the sole damage and loss protection (there is no insurance or COI — see Vetting, below). The quote engine keeps a damage_waiver_usd_cents field as dormant plumbing, but no waiver is ever presented or sold to renters.
  • Late return feehalf decided. The daily overdue cron (shipped 2026-06-10) flags confirmed reservations past return_at + late_grace_minutes (60) and computes the per-day model (late_per_day_factor × per-day line total) into the audit payload as advisory numbers. Open: whether/when the desk actually charges it, and whether charging ever becomes automatic.
  • Half-day ratehalf_day_multiplier exists (default 0.60) but the engine floors every rental at 1 full day, so half-day is configured but not computed. Value + wiring open.
  • Cleaning / sanitization fee — RESOLVED: it's a condition penalty, not a flat fee. There is no standing cleaning/sanitization fee. Instead, a percentage charge is applied at return/inspection IF an item is not returned in the same condition it went out in. The percentage is still TBD, and this is NOT built yet — no charge surface exists. Documented as policy; the % and the wiring are both pending.
  • Multi-item discount tiers — RESOLVED: none (for now). No multi-item or volume discounts are offered. Carts are billed at the sum of their line items with no quantity break. (Bundles/kits as a priced unit are deferred — see Inventory below.)

Vetting

RESOLVED: there is no vetting and no insurance. The entire vetting/insurance concept is removed. The rental gate is simply: pay the 100% deposit, provide ID, and have a verified contact phone and email. Nothing else — no tiers, no COI, no proof of project, no first-time-renter limits, no student grades. The 100% replacement-value deposit (Pricing, above) is the only loss-and-damage protection.

Schema teardown: done — migration 0005 removed the vetting/insurance schema (rental_tier enum, items.tier, items.requires_coi, settings.tier_b/c_*) entirely.

  • Insurance threshold — RESOLVED: no insurance, no threshold. No COI is ever required, at any replacement value. The deposit is the protection.
  • Acceptable insurance providers — RESOLVED: n/a. We never receive COIs.
  • ID + proof of address — RESOLVED: ID only (no proof of address). A valid government-issued photo ID (cédula, passport, or equivalent) plus a verified contact phone and email. No proof of address is required.
  • First-time renter limits — RESOLVED: none. No cap by replacement value or category for first-time renters. The gate is the same for everyone: deposit, ID, and verified contact.
  • Student rate / discounts — RESOLVED: none. No student rate and no student gradation.
  • Outside Medellín — only pickup in MDE, or do we ship for a fee?

Operations

  • Hours of pickup/return — RESOLVED and shipped (2026-06-10): office-configurable weekly schedule. /office/schedules defines per-day windows marked open (walk-in) or by reservation (staff present for scheduled handoffs); the reservation form offers pickup/return only as one-hour blocks inside those windows. Defaults: Tue–Fri open 9–12 + 13–17 and by-reservation 17–21; weekends by-reservation 9–21; Mondays closed. (This superseded the earlier "return by 11:00, pickup at 14:00" interim defaults.)
  • Who runs the desk — RESOLVED: Karen. The desk is run by Karen. Inquiry notifications reach the desk over Slack (the decided inquiry channel — no longer email-or-Slack-TBD).
  • Inspection checklist — RESOLVED (2026-06-11): both directions, with hard blocks. Pickup and return each get a signed per-line condition report (the §6 category checklists in processes.md); gear can't scan out until the pickup report is signed, and a reservation can't settle until the return report is signed. Signatures are captured in-house at the counter (drawn canvas + evidence record). The UI build is queued; until it ships, inspections run on paper.
  • Where do rentals physically live — same room as production gear or a separate cage / shelf?
  • Production lock-out + lead-time window — RESOLVED: confirmed-reservation-wins, no recalls, no configurable window. Once a reservation is confirmed (confirmed) by any party, its gear is unavailable to everyone, including internal studio.chat productions — gear is never recalled from a renter. Internal needs are expressed as blackouts (asset_blackouts / space_blackouts) entered before a conflicting booking confirms; whoever confirms first holds the dates. studio.chat may cancel its own unpaid internal plans (an admin does this in the system) to free dates for a paying client; that's the only override, and no special system accommodation is built for it. There is no lead-time "window" to set: blackout_default_days was dropped in migration 0002, so blackouts are explicit date ranges, not an implicit buffer. See processes.md §1, §3.8, §8.
  • Reservation hold window — RESOLVED: 1 week, enforced (2026-06-10). The hourly expire-holds cron cancels held reservations a week after held_at (cancel_reason='hold_expired', audited as system). The window is a documented constant; an office-configurable settings field remains a small follow-up.

Tech

  • Where does the inventory live — RESOLVED: Supabase Postgres (DB-canonical). Shipped. The catalog lives in Postgres (items / assets / spaces). A Google Sheet was the original authoring source, but the sheet-sync subsystem (the importer, sync_events, and the inventory_canonical_source switch) was removed in migration 0005; the DB is now canonical. See ../architecture/inventory-provenance.md for the emergency re-import.
  • Where do reservations live — RESOLVED: same Supabase DB. Shipped. reservations and children (reservation_items, payments, claims, audit_log) sit in the same Postgres database as inventory.
  • Payments — RESOLVED: Stripe for USD, Wompi for COP. The split is decided: Stripe collects USD, Wompi collects COP, and the two coexist per row (the payment_provider enum carries both). The ledger stays USD cents either way. Still deferred / not wired live — the provider split is settled, but live collection isn't built yet.
  • Contract generation — RESOLVED and shipped (2026-06-11): in-office templates. /office/contracts holds markdown templates with merge fields, rendered per-reservation with a live preview and a print-to-PDF page; executed PDFs upload to a private bucket and are searchable in the archive. (Google Drive was deliberately not used — rendering control was the requirement.)
  • E-signature — RESOLVED in three stages (2026-06-11). (1) Counter signatures (condition reports) will be captured in-house — drawn canvas + evidence record — with the inspection UI; no vendor at the counter. (2) Remote contract signing stays manual Google Docs for now (low volume). (3) When volume justifies automation, the penciled-in vendor is an API-first service (Documenso or similar) firing envelopes from the reservation flow. Slack notifications remain unwired.
  • Contract template wording — draft from scratch, adapt an industry-standard rental MSA (e.g. PRO-T-ON, Camera Rental Agreement), or have a lawyer draft one? (Delivery and execution are decided above; the actual clause text is still open — see Legal.)
  • Soft-delete / archival — RESOLVED: shipped (migration 0004). reservations, clients, and short_links carry a deleted_at marker; archiving from the /office/data console hides the row from every normal view while keeping it restorable or purgeable. Catalog tables (items / assets / spaces) are intentionally excluded for now because archiving one must also hide it from the public catalog and pickers — tracked separately. Reservation state changes are written to an append-only audit_log (source user | api).
  • Admin UI — RESOLVED: in-Next.js /office, all the way. The office covers the full operation (reservations, inventory, kits, contracts, clients, finances, settings, team, audit); no Retool/ Airtable/external tooling, and nothing suggests changing that.
  • Photo/file storage — RESOLVED: Supabase Storage. Public media bucket for catalog imagery; private contracts bucket (signed URLs) for executed PDFs; condition-report photos will use a private bucket the same way when the inspection UI ships.

Inventory

  • Replacement value ≠ purchase cost — RESOLVED (no rename). items.replacement_value_usd_cents is now an admin-maintained real replacement value (not the purchase price); the importer no longer writes it, and "Approximate Value" feeds only assets.acquired_cost_usd_cents. A replacement_value_updated_at stamp tracks freshness. Populate/refresh via the runbook: ../operations/replacement-prices.md.
  • Public visibility — RESOLVED: no public prices. Prices are not shown publicly. The catalog is "contact us / request a quote"; rates live only in the quote.
  • Item bundles / kits — half shipped (2026-06-11). /office/inventory/kits manages kits and the reservation picker expands one into its member item lines at normal per-item pricing (a shortcut, not a priced product). Still open: whether a kit ever becomes a priced unit with its own bundled rate.
  • Serial-numbered vs fungible — RESOLVED: both layers. Shipped. items are models; assets are individual serial-tracked units of a model. Reservation lines reference an item + qty and bind to specific assets at pickup (per-unit check-out/check-in), so we get model-level catalog plus unit-level tracking.
  • Items we don't own but can broker (sub-rentals) — RESOLVED: not policed. studio.chat doesn't care if a renter sub-rents the gear. The only requirements are that the rental is paid for and returned on time in the same condition. This is a contract term, not an operational gate, so there's no brokering workflow to build.
  • Consumables (gels, tape, batteries) — RESOLVED: out of scope. Not sold or rented today. A consumables store is a possible future add-on; for now renters buy these at a camera store.

Brand

  • Naming: keep as "studio.chat rentals" or a sub-brand?
  • Lead from production or rentals on a returning visitor? Cookie / preference?
  • Do we publish prices publicly — RESOLVED: no. Prices are not public; the catalog is "request a quote" only (see Inventory → Public visibility).
  • Social proof on rental page — list productions that have used the gear, or stay quiet about specifics?

Model: deposit-only. The 100% replacement-value deposit covers loss and damage. Sub-rental and cross-border are not policed beyond "paid + returned on time in the same condition." The contract is generated via Google Docs and emailed for e-signature, with execution tracked and Slack notifications on contract events (designed, not yet built — see Tech). Frame the contract around this deposit-only model.

  • Loss vs damage — RESOLVED: combined under one deposit. Both loss and damage are covered by the single 100% replacement-value deposit; there is no separate loss instrument or insurance.
  • Sub-rental / re-rental — RESOLVED: not policed. The renter may let someone else use the gear; studio.chat doesn't gate on it. The only obligation is paid + returned on time in the same condition — a contract term, not an operational restriction.
  • Customs / cross-border — RESOLVED: not policed. Same as sub-rental: cross-border use isn't restricted beyond paid + returned on time in the same condition. No customs workflow.
  • Liability cap — whether the contract caps the renter's liability (and at what), and the exact clause wording, remain open for counsel. The deposit is the practical ceiling on what studio.chat holds, but the contractual cap is genuinely unaddressed.

What we need from Brandon to unblock

Resolved since this list was written: the rate model (3-day week), the weekend rate (3 day-rate days, no surcharge), the currency model (USD cents canonical, COP display-only), the inventory home (Supabase Postgres; the sheet importer was removed in 0005 — the DB is canonical), the payment-provider split (Stripe for USD, Wompi for COP — though not wired live yet), the production lock-out rule (confirmed-reservation-wins, no recalls, no configurable window), the damage-waiver question (not offered), the vetting/insurance concept (removed entirely — gate is deposit + ID + verified contact), the cleaning fee (a condition penalty, %-TBD, not built), pickup/return hours (the office-configurable weekly schedule, shipped), public price visibility (no — quote only), kits (shipped as unpriced shortcuts), sub-rentals and cross-border (not policed), consumables (out of scope), contract generation (in-office templates, shipped) and signing (in-house at the counter; Google Docs manual remotely for now), the desk operator (Karen), and the hold window (1 week, cron-enforced) are all decided.

The inventory sheet is no longer needed: production already holds the real catalog, and new items are added one at a time via the office (or an agent) later — there is no bulk import step.

Still genuinely needed:

  1. The cleaning-fee percentage (the condition-penalty rate applied at return when an item isn't returned in the same condition). Policy is decided; the number is not, and no charge surface is built yet.
  2. The rental-contract clause wording, including any liability cap, to be finalized with counsel.