Date: 2026-06-14
Reference site: https://dev.studio.chat/ — intended live-site reference, but this environment could not fetch it during this run. Claude Code should compare the implementation below against the live /office/pricing behavior before merging.
Currency convention: engine storage remains USD cents. COP is display/billing conversion using pricing.cop_per_usd_snapshot. Recommended launch snapshot below: 4,000 COP/USD unless the admin user updates it.
0. Executive decision
STUDIO.CHAT should compete on price at launch, but not look cheap.
My recommendation is:
- Podcast production should be the commercial lead. Price it as a production package, not as a public rental checkout cart.
- Gear rentals should stay relationship-gated. Public rental pricing can exist, but quote flow should emphasize vetting, full replacement deposit, and pickup/return rules.
- The pricing engine should keep replacement-cost rental pricing, but remove insurance from the cost-recovery formula because there is no practical insurance product available to cover this risk in Colombia.
- The deposit should be 100% of true replacement cost for every item leaving STUDIO.CHAT custody.
- Service pricing must absorb baseline fixed costs: four minimum-wage employees plus rent/utilities create a fixed monthly floor of approximately 17,048,848 COP / month.
The brand can credibly say “higher quality,” but until there are enough case studies, proof, testimonials, recognizable clients, and before/after clips, the safest market position is:
Premium-looking output at an aggressively accessible launch price.
Do not position as the cheapest vendor. Position as the most organized, technical, and modern option at a price that makes the first booking easy.
1. Research notes and market interpretation
1.1 What I could verify
Public Colombian podcast and audiovisual competitors frequently do not expose complete rate cards. The search pattern is quote-led: “cotiza,” “agenda,” “contact us,” or bespoke production scoping. That means the user is usually comparing perceived quality, convenience, trust, and friction before they ever compare exact prices.
For Colombian labor inputs, 2026 public reporting shows the minimum wage at 1,750,905 COP and the transport allowance at 249,095 COP, totaling 2,000,000 COP/month for minimum-wage compensation. Sources also report that the government reissued the decree keeping those figures after the Council of State suspension episode. See sources:
- https://www.tropicanafm.com/2026/gobierno-firmo-nuevo-decreto-del-salario-minimo-tras-suspension-del-consejo-de-estado-asi-quedo-459172.html
- https://www.tropicanafm.com/2025/auxilio-de-transporte-para-2026-quedo-en-249-095-a-quienes-no-les-aplica-el-aumento-456002.html
- https://www.tropicanafm.com/2026/asi-quedo-el-salario-minimo-de-una-empleada-domestica-en-colombia-en-2026-con-el-nuevo-salario-minimo-456317.html
For podcast strategy, the strongest current research-backed insight is not “record long-form only.” Short vertical clips and teasers matter because they are the discoverability layer. Academic work on podcast teasers frames teaser creation as a real workflow burden and a key way to reach new audiences, which supports STUDIO.CHAT bundling social clips into podcast packages rather than treating clips as an afterthought.
1.2 What this means commercially
Because transparent Colombian rate cards are sparse, the competitive edge is not only the number. It is the pricing UX:
- Client sees a clear base package.
- Client sees what is included.
- Client sees what costs extra.
- Client sees why the deposit exists.
- Client sees a price fast enough to book.
That gives STUDIO.CHAT an edge even if another vendor can undercut.
2. Baseline fixed-cost model
Inputs
| Input | Value |
|---|---|
| Minimum-wage employee fully loaded monthly cost | 2,762,212 COP |
| Employees assumed | 4 |
| Staff cost / month | 11,048,848 COP |
| Rent + utilities / month | 6,000,000 COP |
| Total fixed cost / month | 17,048,848 COP |
| Total fixed cost / year | 204,586,174 COP |
| COP/USD snapshot | 4,000 |
| Fixed cost / month in USD | $4,262 USD |

Working hourly cost floor
Assume 4 employees × 176 paid hours/month = 704 paid hours/month.
But not every paid hour is billable. Use 50% productive/billable utilization as the launch planning assumption.
| Metric | Value |
|---|---|
| Paid staff hours/month | 704 |
| Assumed billable/productive utilization | 50% |
| Billable-equivalent hours/month | 352 |
| Fixed-cost floor/hour | 48,434 COP/hour |
| Fixed-cost floor/hour | $48,434_usd USD/hour |
Pricing implication: if STUDIO.CHAT bills labor below 50k COP/hour, it is not recovering fixed costs. Launch sell rates should usually be 80k–120k COP/hour net of IVA, depending on role and deliverable.
3. Recommended pricing architecture
3.1 Two engines, not one
Claude Code should separate the commercial model into two related engines:
-
Rental engine
Replacement-cost-driven day rates + 100% refundable replacement deposit. -
Production/package engine
Service packages that combine room time, crew time, post time, producer time, equipment recovery, and margin.
Current docs focus heavily on rental math. That is fine for gear, but podcast production needs package math because the customer is not buying “an FX6 day + two microphones.” The customer is buying a usable episode and distribution assets.
4. Rental pricing engine recommendation
4.1 Deposit rule
Set:
pricing.deposit_percent = 1.0
pricing.deposit_minimum_usd_cents = 0
Formula:
depositUsdCents = sum(line.replacementValueUsdCents * quantity)
or, more explicitly:
depositUsdCents = cartLines.reduce(
(sum, line) => sum + line.replacementValueUsdCents * line.quantity,
0
)
Do not apply IVA to deposit. It is refundable security, not rental revenue.
4.2 True replacement cost definition
The admin UI should stop using ambiguous language like “approximate value” in quote-facing places. Internally the value may still come from the inventory field, but the pricing system should treat it as:
True replacement cost: the cost to replace the item in Colombia, in equivalent working condition, including import friction when relevant.
Implementation note:
type ReplacementValueSource =
| "verified_current_market"
| "purchase_price_adjusted"
| "owner_estimate"
| "needs_review"
Add fields if not already available:
items.replacement_value_usd_cents integer
items.replacement_value_source text
items.replacement_value_reviewed_at timestamptz
items.replacement_value_note text
At quote time:
if (!item.replacement_value_usd_cents) {
line.status = "unpriced_requires_admin_review"
}
4.3 Remove insurance from rate formula
Current class parameters include insurance inside m+i+o. Because the business model says no insurance is available, the engine should split the terms and set insurance to zero:
annualCost =
depreciation
+ replacementCost * maintenancePct
+ replacementCost * overheadPct
Recommended launch parameters:
| Class | Life | Residual | Utilization | Maintenance | Insurance | Overhead | Margin |
|---|---|---|---|---|---|---|---|
| camera_body | 3.5y | 20% | 5% | 8% | 0% | 14% | 21% |
| lens | 6y | 33% | 5% | 5% | 0% | 11% | 20% |
| lighting | 4y | 15% | 5% | 7% | 0% | 12.3% | 21% |
| support | 8y | 28% | 5% | 4% | 0% | 8.4% | 18% |
| electronics | 4y | 20% | 5% | 7% | 0% | 11% | 20% |
| accessory | 3y | 10% | 5% | 6% | 0% | 13.5% | 20% |
This preserves current total opex behavior while making the risk model honest: catastrophic risk is handled by deposit, not insurance.
4.4 Keep the rental floor
Recommended:
pricing.day_rate_floor_usd_cents = 1500 // $15/day
pricing.day_rate_round_usd_cents = 500 // $5 increments
Cheap items are operationally expensive to check out, inspect, and chase. The floor protects handling labor.
4.5 Add launch competitiveness controls
Add a global launch adjustment that can be turned off later:
pricing.rental_launch_discount_pct = 0.10
pricing.rental_launch_discount_expires_at = "2026-09-30"
Apply it only to the rental fee, never to deposit:
discountedDayRate = effectiveDayRate * (1 - rentalLaunchDiscountPct)
deposit = fullReplacementValue
Recommendation: use this only for vetted clients and first 90 days. Do not put permanent discounts into the core formula.
5. Production/package pricing engine recommendation
5.1 New settings
Add pricing.production settings:
production: {
ivaRate: 0.19,
copPerUsdSnapshot: 4000,
roomHourlyCop: 100000,
crewHourlyCop: 80000,
editorHourlyCop: 90000,
producerHourlyCop: 120000,
minimumProductionNetCop: 1200000,
bookingRetainerPct: 0.50,
includedRevisionRounds: 1,
extraRevisionHourlyCop: 90000,
verticalClipNetCop: 120000,
thumbnailNetCop: 80000,
transcriptNetCop: 60000,
launchPilotDiscountPct: 0.10,
launchPilotDiscountExpiresAt: "2026-09-30"
}
These are net of IVA.
5.2 Package definitions
Package A — Pilot podcast episode
Use for first-time clients with 1–2 speakers.
| Component | Included |
|---|---|
| Studio block | Up to 3 hours in room |
| Recording | Up to 90 minutes captured |
| Cameras | Up to 3-camera capture |
| Audio | 2 speakers |
| Lighting | Standard podcast lighting |
| Deliverable | 1 edited horizontal episode |
| Clips | 2 vertical clips |
| Revisions | 1 revision round |
| Turnaround | 5–7 business days |
| Launch net price | 1,800,000 COP |
| IVA | 342,000 COP |
| Gross total | 2,142,000 COP |
| Booking retainer | 900,000 COP |
Recommended public wording: “Pilot podcast episode from 1.8M COP + IVA.”
Package B — Standard podcast episode
Use for repeat clients.
| Component | Included |
|---|---|
| Studio block | Up to 4 hours |
| Recording | Up to 2 hours |
| Cameras | Up to 3-camera capture |
| Audio | 2–3 speakers |
| Deliverable | 1 edited horizontal episode |
| Clips | 4 vertical clips |
| Revisions | 1 revision round |
| Net price | 2,600,000 COP |
| IVA | 494,000 COP |
| Gross total | 3,094,000 COP |
Package C — Monthly show starter
Use to create recurring revenue.
| Component | Included |
|---|---|
| Episodes/month | 4 |
| Studio block | 4 sessions/month |
| Edited episodes | 4 |
| Vertical clips | 16 |
| Monthly reporting | Light |
| Net price | 8,800,000 COP |
| IVA | 1,672,000 COP |
| Gross total | 10,472,000 COP |
This gives a meaningful discount versus 4 × 2.6M = 10.4M COP net, but still contributes heavily to fixed cost coverage.
6. Break-even logic
Assuming a 55% contribution margin after variable labor/time allocation, the number of sessions needed to cover fixed cost changes sharply by average price.

Interpretation:
| Average net session price | Sessions/month to cover fixed costs at 55% contribution |
|---|---|
| 1.2M COP | 25.8 |
| 1.5M COP | 20.7 |
| 1.8M COP | 17.2 |
| 2.2M COP | 14.1 |
| 2.8M COP | 11.1 |
| 3.5M COP | 8.9 |
Conclusion: 1.8M COP pilot episodes are viable as a launch wedge, but the business should push clients toward standard episodes, monthly retainers, editing add-ons, and clip packages.
7. Example pricing breakdowns
Example 1 — Pilot podcast episode, 2 people
Assumptions:
- 2 speakers
- 3-hour studio block
- 90-minute recording
- 3-camera capture
- Standard lighting
- 1 edited horizontal episode
- 2 vertical clips
- 1 revision round
- 5–7 business day turnaround
| Line | Quantity | Rate | Net |
|---|---|---|---|
| Studio block | 3 hr | 100,000 COP/hr | 300,000 |
| Crew / capture labor | 6 hr | 80,000 COP/hr | 480,000 |
| Post-production editing | 8 hr | 90,000 COP/hr | 720,000 |
| Producer / project management | 2 hr | 120,000 COP/hr | 240,000 |
| Equipment recovery | package | — | 260,000 |
| Launch discount | — | — | -200,000 |
| Net subtotal | 1,800,000 | ||
| IVA 19% | 342,000 | ||
| Client total | 2,142,000 COP | ||
| Booking retainer, 50% of net | 900,000 COP |

Notes:
- No full replacement deposit is required if STUDIO.CHAT operates the gear in its own space and the gear never leaves STUDIO.CHAT custody.
- A booking retainer is different from a gear deposit. It secures the date and covers pre-production/admin risk.
- If the client rents equipment separately or takes equipment off-site, then the full replacement deposit applies.
Example 2 — Same pilot, but client takes the production kit off-site
Representative kit:
| Item | Replacement value USD | Deposit COP @ 4,000 |
|---|---|---|
| Sony FX6 | 6,000 | 24,000,000 |
| Sony FX30 | 1,800 | 7,200,000 |
| Sony FX30 | 1,500 | 6,000,000 |
| Sony FE 24-50mm F2.8 G | 800 | 3,200,000 |
| Sony E PZ 10-20mm F4 G | 700 | 2,800,000 |
| Aputure amaran 300c | 500 | 2,000,000 |
| Aputure amaran 150c | 400 | 1,600,000 |
| DJI Mic 3 | 300 | 1,200,000 |
| DJI Mic 3 | 300 | 1,200,000 |
| Total replacement deposit | 12,300 USD | 49,200,000 COP |
Rental day-rate from current engine logic for that kit is approximately $375 USD/day net, or 1,500,000 COP/day net at 4,000 COP/USD, before IVA. The deposit is not discounted.
Quote:
| Line | Amount |
|---|---|
| Rental fee, 1 day net | 1,500,000 COP |
| IVA 19% on rental fee | 285,000 COP |
| Rental fee gross | 1,785,000 COP |
| Refundable replacement deposit | 49,200,000 COP |
| Amount due before release | 50,985,000 COP |
Example 3 — Standard recurring client, four episodes/month
Assumptions:
- 4 sessions/month
- 2 speakers each
- 4 edited horizontal episodes
- 16 vertical clips
- Same set, same client, lower planning overhead
| Line | Net COP |
|---|---|
| Episode production, 4 × 2.6M normal value | 10,400,000 |
| Recurring-client discount | -1,600,000 |
| Monthly net | 8,800,000 |
| IVA 19% | 1,672,000 |
| Monthly gross | 10,472,000 COP |
Why this matters: one monthly show starter covers about 52% of baseline fixed monthly cost before variable-cost allocation.
Example 4 — Gear-only rental, FX6 one day
Assumptions:
- Replacement value: $6,000 USD
- Class: camera_body
- Current-style launch rate: approximately $185/day net
- COP/USD: 4,000
| Line | Amount |
|---|---|
| Rental fee net | 740,000 COP |
| IVA 19% | 140,600 COP |
| Rental fee gross | 880,600 COP |
| Refundable full replacement deposit | 24,000,000 COP |
| Amount due before release | 24,880,600 COP |
This is intentionally friction-heavy. It protects the company and discourages casual/unvetted rentals.
8. Inventory replacement exposure
Current Medellín inventory rows with positive quantity and replacement values total approximately $126,771 USD in replacement exposure.

The largest exposure categories are lenses, camera bodies, computers, lighting, and storage. Those categories should be reviewed first for true replacement values.
9. Claude Code implementation instructions
9.1 Objective
Modify the pricing engine so STUDIO.CHAT can price:
- Gear rentals using replacement-cost day rates and 100% replacement deposit.
- Podcast/production packages using room, labor, edit, producer, equipment-recovery, retainer, IVA, and add-on logic.
9.2 Files to inspect first
src/lib/office/pricing.ts
src/lib/office/pricing.test.ts
src/lib/office/settings.ts
src/components/office/PricingForm.tsx
src/app/office/pricing
src/lib/office/money.ts
supabase/migrations/*
Also compare against live behavior at:
https://dev.studio.chat/
9.3 Rental engine changes
Step 1 — split insurance out of opex
Current docs describe combined maintenance + insurance + overhead. Replace with explicit fields:
type PricingClass = {
lifeYears: number
residualPct: number
utilizationPct: number
maintenancePct: number
insurancePct: number
overheadPct: number
marginPct: number
}
Set insurancePct to 0.
Step 2 — update annual cost formula
export function annualRentalCostUsdCents(
replacementValueUsdCents: number,
pricingClass: PricingClass
): number {
const depreciation =
(replacementValueUsdCents * (1 - pricingClass.residualPct)) /
pricingClass.lifeYears
const maintenance =
replacementValueUsdCents * pricingClass.maintenancePct
const insurance =
replacementValueUsdCents * pricingClass.insurancePct // launch default 0
const overhead =
replacementValueUsdCents * pricingClass.overheadPct
return depreciation + maintenance + insurance + overhead
}
Step 3 — keep rate formula
rawDayRate =
annualCost /
(365 * utilizationPct * (1 - marginPct))
Then:
dayRate = max(floor, roundToNearest(rawDayRate, roundUsdCents))
Step 4 — harden deposit behavior
Deposit should be a direct function of replacement exposure:
export function computeReplacementDepositUsdCents(lines: QuoteLine[]): number {
return lines.reduce((sum, line) => {
return sum + line.replacementValueUsdCents * line.quantity
}, 0)
}
Do not let discounts reduce deposit.
Add tests:
it("charges deposit equal to full replacement value", () => {
const quote = computeQuote({
lines: [
{ replacementValueUsdCents: 600000, quantity: 1, rateDayUsdCents: 18500 },
{ replacementValueUsdCents: 180000, quantity: 2, rateDayUsdCents: 5500 },
],
days: 1,
})
expect(quote.depositUsdCents).toBe(960000)
})
Step 5 — add explicit nullable unpriced state
If replacement value is missing:
line.priceStatus = "needs_replacement_value"
line.depositStatus = "needs_replacement_value"
Prevent checkout/confirmation until resolved.
9.4 Production package engine
Add a new module:
src/lib/office/production-pricing.ts
Suggested types:
export type ProductionPricingSettings = {
ivaRate: number
copPerUsdSnapshot: number
roomHourlyCop: number
crewHourlyCop: number
editorHourlyCop: number
producerHourlyCop: number
minimumProductionNetCop: number
bookingRetainerPct: number
includedRevisionRounds: number
extraRevisionHourlyCop: number
verticalClipNetCop: number
thumbnailNetCop: number
transcriptNetCop: number
launchPilotDiscountPct: number
launchPilotDiscountExpiresAt: string | null
}
export type PodcastPackageInput = {
packageKind: "pilot" | "standard" | "monthly_starter" | "custom"
speakerCount: number
studioHours: number
recordingMinutes: number
crewHours: number
editHours: number
producerHours: number
verticalClips: number
thumbnails: number
transcripts: number
revisionRounds: number
applyLaunchDiscount: boolean
}
Computation:
export function computePodcastQuote(
input: PodcastPackageInput,
settings: ProductionPricingSettings
) {
const room = input.studioHours * settings.roomHourlyCop
const crew = input.crewHours * settings.crewHourlyCop
const editing = input.editHours * settings.editorHourlyCop
const producer = input.producerHours * settings.producerHourlyCop
const includedClips =
input.packageKind === "pilot" ? 2 :
input.packageKind === "standard" ? 4 :
input.packageKind === "monthly_starter" ? 16 :
0
const extraClips = Math.max(0, input.verticalClips - includedClips)
const clips = extraClips * settings.verticalClipNetCop
const thumbnails = input.thumbnails * settings.thumbnailNetCop
const transcripts = input.transcripts * settings.transcriptNetCop
const extraRevisionRounds = Math.max(
0,
input.revisionRounds - settings.includedRevisionRounds
)
const revisions = extraRevisionRounds * settings.extraRevisionHourlyCop * 2
let net =
room + crew + editing + producer + clips + thumbnails + transcripts + revisions
net = Math.max(net, settings.minimumProductionNetCop)
if (input.applyLaunchDiscount) {
net = Math.round(net * (1 - settings.launchPilotDiscountPct))
}
const iva = Math.round(net * settings.ivaRate)
const gross = net + iva
const bookingRetainer = Math.round(net * settings.bookingRetainerPct)
return {
netCop: net,
ivaCop: iva,
grossCop: gross,
bookingRetainerCop: bookingRetainer,
lines: { room, crew, editing, producer, clips, thumbnails, transcripts, revisions }
}
}
9.5 Seed settings
Create a migration that upserts these settings into the append-only settings model.
{
"pricing.deposit_percent": 1.0,
"pricing.deposit_minimum_usd_cents": 0,
"pricing.day_rate_floor_usd_cents": 1500,
"pricing.day_rate_round_usd_cents": 500,
"pricing.cop_per_usd_snapshot": 4000,
"pricing.production.room_hourly_cop": 100000,
"pricing.production.crew_hourly_cop": 80000,
"pricing.production.editor_hourly_cop": 90000,
"pricing.production.producer_hourly_cop": 120000,
"pricing.production.minimum_production_net_cop": 1200000,
"pricing.production.booking_retainer_pct": 0.50,
"pricing.production.vertical_clip_net_cop": 120000,
"pricing.production.thumbnail_net_cop": 80000,
"pricing.production.transcript_net_cop": 60000,
"pricing.production.extra_revision_hourly_cop": 90000,
"pricing.production.launch_pilot_discount_pct": 0.10,
"pricing.production.launch_pilot_discount_expires_at": "2026-09-30"
}
9.6 Admin UI changes
On /office/pricing, add sections:
-
Rental class settings
- Current class table
- Split maintenance / insurance / overhead
- Display note: “Insurance is 0%; risk is handled by replacement deposit.”
-
Deposit policy
- Deposit percent
- Deposit minimum
- Show computed examples:
- FX6 replacement deposit
- 3-camera podcast kit deposit
-
Production pricing
- Room hourly COP
- Crew hourly COP
- Editor hourly COP
- Producer hourly COP
- Package defaults
- Add-on prices
- Booking retainer percentage
-
Break-even panel
- Fixed monthly cost
- Employee count
- Fully burdened employee cost
- Rent/utilities
- Break-even sessions/month at selected average package price
9.7 Quote UI changes
For production quotes, show:
Net production subtotal
IVA
Gross client total
Booking retainer due now
Balance due before shoot
For gear rentals, show:
Rental subtotal net
IVA
Rental total gross
Refundable replacement deposit
Total due before release
Never merge refundable deposit into taxable service total.
10. Suggested website/package copy
Use this pricing posture:
Pilot podcast episode from 1.8M COP + IVA.
Includes the room, cameras, audio, lighting, one edited episode, and two vertical clips. Good enough to publish. Priced low enough to stop talking about starting.
For rentals:
Gear rentals are available to vetted productions. Deposits are equal to full replacement value because Colombia does not offer a practical insurance path for this shelf. If that sounds intense, good. The gear is real.
11. Final recommendation
At launch, STUDIO.CHAT should not try to win by charging premium-agency prices. It should win by making a high-quality podcast/video result feel organized, accessible, and lower-risk than hiring a random production vendor.
Recommended launch anchors:
| Offer | Net price |
|---|---|
| Pilot podcast episode | 1.8M COP |
| Standard podcast episode | 2.6M COP |
| Monthly show starter, 4 episodes | 8.8M COP |
| Vertical clip add-on | 120k COP |
| Extra edit/revision hour | 90k COP |
| Room-only hourly floor | 100k COP |
| Full replacement gear deposit | 100% true replacement cost |
Review these after the first 10 paid podcast bookings or after 90 days, whichever comes first.