Docs.

STUDIO.CHAT pricing engine research + implementation brief

business/studiochat_pricing_engine_research_and_claude_code_brief.md

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:

  1. Podcast production should be the commercial lead. Price it as a production package, not as a public rental checkout cart.
  2. Gear rentals should stay relationship-gated. Public rental pricing can exist, but quote flow should emphasize vetting, full replacement deposit, and pickup/return rules.
  3. 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.
  4. The deposit should be 100% of true replacement cost for every item leaving STUDIO.CHAT custody.
  5. 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:

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

InputValue
Minimum-wage employee fully loaded monthly cost2,762,212 COP
Employees assumed4
Staff cost / month11,048,848 COP
Rent + utilities / month6,000,000 COP
Total fixed cost / month17,048,848 COP
Total fixed cost / year204,586,174 COP
COP/USD snapshot4,000
Fixed cost / month in USD$4,262 USD

Baseline fixed cost stack

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.

MetricValue
Paid staff hours/month704
Assumed billable/productive utilization50%
Billable-equivalent hours/month352
Fixed-cost floor/hour48,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.1 Two engines, not one

Claude Code should separate the commercial model into two related engines:

  1. Rental engine
    Replacement-cost-driven day rates + 100% refundable replacement deposit.

  2. 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:

ClassLifeResidualUtilizationMaintenanceInsuranceOverheadMargin
camera_body3.5y20%5%8%0%14%21%
lens6y33%5%5%0%11%20%
lighting4y15%5%7%0%12.3%21%
support8y28%5%4%0%8.4%18%
electronics4y20%5%7%0%11%20%
accessory3y10%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.

ComponentIncluded
Studio blockUp to 3 hours in room
RecordingUp to 90 minutes captured
CamerasUp to 3-camera capture
Audio2 speakers
LightingStandard podcast lighting
Deliverable1 edited horizontal episode
Clips2 vertical clips
Revisions1 revision round
Turnaround5–7 business days
Launch net price1,800,000 COP
IVA342,000 COP
Gross total2,142,000 COP
Booking retainer900,000 COP

Recommended public wording: “Pilot podcast episode from 1.8M COP + IVA.”

Package B — Standard podcast episode

Use for repeat clients.

ComponentIncluded
Studio blockUp to 4 hours
RecordingUp to 2 hours
CamerasUp to 3-camera capture
Audio2–3 speakers
Deliverable1 edited horizontal episode
Clips4 vertical clips
Revisions1 revision round
Net price2,600,000 COP
IVA494,000 COP
Gross total3,094,000 COP

Package C — Monthly show starter

Use to create recurring revenue.

ComponentIncluded
Episodes/month4
Studio block4 sessions/month
Edited episodes4
Vertical clips16
Monthly reportingLight
Net price8,800,000 COP
IVA1,672,000 COP
Gross total10,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.

Break-even sessions by price

Interpretation:

Average net session priceSessions/month to cover fixed costs at 55% contribution
1.2M COP25.8
1.5M COP20.7
1.8M COP17.2
2.2M COP14.1
2.8M COP11.1
3.5M COP8.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
LineQuantityRateNet
Studio block3 hr100,000 COP/hr300,000
Crew / capture labor6 hr80,000 COP/hr480,000
Post-production editing8 hr90,000 COP/hr720,000
Producer / project management2 hr120,000 COP/hr240,000
Equipment recoverypackage260,000
Launch discount-200,000
Net subtotal1,800,000
IVA 19%342,000
Client total2,142,000 COP
Booking retainer, 50% of net900,000 COP

Pilot podcast breakdown

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:

ItemReplacement value USDDeposit COP @ 4,000
Sony FX66,00024,000,000
Sony FX301,8007,200,000
Sony FX301,5006,000,000
Sony FE 24-50mm F2.8 G8003,200,000
Sony E PZ 10-20mm F4 G7002,800,000
Aputure amaran 300c5002,000,000
Aputure amaran 150c4001,600,000
DJI Mic 33001,200,000
DJI Mic 33001,200,000
Total replacement deposit12,300 USD49,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:

LineAmount
Rental fee, 1 day net1,500,000 COP
IVA 19% on rental fee285,000 COP
Rental fee gross1,785,000 COP
Refundable replacement deposit49,200,000 COP
Amount due before release50,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
LineNet COP
Episode production, 4 × 2.6M normal value10,400,000
Recurring-client discount-1,600,000
Monthly net8,800,000
IVA 19%1,672,000
Monthly gross10,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
LineAmount
Rental fee net740,000 COP
IVA 19%140,600 COP
Rental fee gross880,600 COP
Refundable full replacement deposit24,000,000 COP
Amount due before release24,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.

Inventory 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:

  1. Gear rentals using replacement-cost day rates and 100% replacement deposit.
  2. 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:

  1. Rental class settings

    • Current class table
    • Split maintenance / insurance / overhead
    • Display note: “Insurance is 0%; risk is handled by replacement deposit.”
  2. Deposit policy

    • Deposit percent
    • Deposit minimum
    • Show computed examples:
      • FX6 replacement deposit
      • 3-camera podcast kit deposit
  3. Production pricing

    • Room hourly COP
    • Crew hourly COP
    • Editor hourly COP
    • Producer hourly COP
    • Package defaults
    • Add-on prices
    • Booking retainer percentage
  4. 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:

OfferNet price
Pilot podcast episode1.8M COP
Standard podcast episode2.6M COP
Monthly show starter, 4 episodes8.8M COP
Vertical clip add-on120k COP
Extra edit/revision hour90k COP
Room-only hourly floor100k COP
Full replacement gear deposit100% true replacement cost

Review these after the first 10 paid podcast bookings or after 90 days, whichever comes first.