commercial-recurring-budget

activetype/docdomain/commercialdomain/finance

Commercial recurring budget (post-launch operations)

TL;DR

This note prices ongoing operations after the 25 May launch — separate from the one-time build in [[Projects/lumendev-museum-ibu-marsinah/context/commercial-pricing-breakdown-v0|the v0 breakdown]].

Operating stack (locked): shared LumenDev Vercel Pro (marginal hosting ≈ Rp 0 for this site) + MongoDB Atlas M0 (free) + free Resend / monitoring tiers. LumenDev runs monthly manual mongodump because M0 has no automated backups.

Internal cost (what LumenDev pays): vendor cash ≈ Rp 17.000/month (~Rp 200k/year domain only). Fully loaded with MG time at cost (~5 hr/month): ≈ Rp 392.000/month (~Rp 4,7 jt/year).

Client-facing recurring (recommended — Option A itemised): infra ≈ Rp 240.000/month (client label: biaya server, not vendor names) + LumenCare Foundation retainer Rp 600.000/month≈ Rp 840.000/month (~Rp 9,5 jt/year if retainer prepaid annually). Option B all-in bundle: Rp 850.000/month or Rp 9.350.000/year prepaid.

First-year TCO hint (with ~Rp 16 jt build): roughly Rp 25–26 jt year one (build + recurring), if both are agreed.

Budget caps (client ceiling): see §6≤ Rp 300k/month (achievable with a thin retainer) and ≤ Rp 150k/month (infra-only / self-serve; no real support hours).

Scope of this note

Covers recurring infrastructure, maintenance, and support/help only. Excludes: one-time build fee, Phase 2 features, payment gateway, net-new modules. Stack per [[Projects/lumendev-museum-ibu-marsinah/decisions/adr-2026-05-21-nextjs-mongodb-authjs-stack|ADR]]: Next.js on Vercel + MongoDB + Auth.js under the LumenDev Vercel account.

Client presentation rule: On invoices and proposals, use plain language — “Biaya server” / “Domain & DNS” — not Vercel, MongoDB Atlas, or Resend line items. Internal statements to MG may still show vendor actuals.

Assumptions

  • Exchange rate (planning): USD 1 = Rp 17.700 (May 2026 spot ~Rp 17.665; rounded up for headroom).
  • Traffic: very low — museum info site + light Rumah Singgah booking (one night per user per calendar month).
  • Hosting: LumenDev portfolio Vercel Pro already covers commercial use; this project’s marginal hosting cost ≈ Rp 0 (usage inside account credit).
  • Database: Atlas M0 (free) — accepted trade-off: no Atlas automated backups, possible idle auto-pause; mitigated by scheduled manual dumps (see maintenance retainer).
  • Server charge to client: 50% of a standalone Pro-seat planning figure (354.000/mo) → Rp 200.000/month, rounded, labelled biaya server only.
  • Internal labour (at cost): Rp 75.000/hour — project-specific; not yet in LumenDev playbooks.
  • Client overage: Rp 150.000/hour — derived from Rp 500k/point anchor (~3–4 hr per simple point).
  • Maintenance lane: LumenCare Foundation per [[Areas/LumenDev/playbooks/lumencare-tier-matrix|tier matrix]].
  • Email (Resend): Rp 0 while v0 has no automated email ([[Projects/lumendev-museum-ibu-marsinah/context/commercial-pricing-client-facing-id|client-facing v0]] excludes it). Budget line stays at zero until Phase 2 notifications ship.

1. Internal cost — what LumenDev actually pays

Monthly (operating stack)

| Line item | Vendor / basis | USD/mo | IDR/mo | Notes | |---|---|---:|---:|---| | Hosting — Vercel Pro (portfolio) | Vercel | $0* | 0 | *Marginal for this site on shared LumenDev Pro; account seat already paid for portfolio | | Database — MongoDB Atlas M0 | MongoDB | $0 | 0 | Free tier; manual backup obligation | | Transactional email — Resend | Resend | $0 | 0 | Free tier; unused until Phase 2 email | | Uptime monitoring — Better Stack (free) | Better Stack | $0 | 0 | Commercial use allowed on free tier (not UptimeRobot) | | SSL / TLS | Vercel | $0 | 0 | Included | | Domain + DNS | registrar | — | 16.667 | ~Rp 200.000/year ÷ 12 | | Vendor subtotal (cash) | | | ≈ 17.000 | | | MG time — maintenance (~3 hr) | labour at cost | — | 225.000 | Includes monthly mongodump + restore drill | | MG time — support (~2 hr) | labour at cost | — | 150.000 | | | Labour subtotal (at cost) | | | 375.000 | | | Internal total — fully loaded | | | ≈ 392.000 | |

Annual

| Line item | IDR/year | Notes | |---|---:|---| | Vercel (marginal) | 0 | Shared Pro account | | MongoDB M0 | 0 | | | Resend / monitoring / SSL | 0 | | | Domain + DNS | 200.000 | Planning renewal | | Vendor subtotal (cash) | ≈ 200.000 | | | MG time — 60 hr/year at cost | 4.500.000 | | | Internal total — fully loaded | ≈ 4.700.000 | |

Reference — full standalone allocation (not billed to client)

If this project had to bear a dedicated Pro seat + Flex DB alone (not the chosen model):

| Scenario | Vendor cash/month | Vendor cash/year | |---|---:|---:| | Dedicated Pro + Flex (reference only) | ≈ 512.000 | ≈ 6.147.000 | | Shared Pro + M0 (operating default) | ≈ 17.000 | ≈ 200.000 |

2. Client-facing recurring fee — recommended

Per [[Areas/LumenDev/playbooks/project-build-pricing-framework|pricing framework]]: infra pass-through + separate LumenCare retainer. Do not expose Vercel/MongoDB SKUs to the museum.

Client line items (what they see)

| Client label | Fee | Billing | Internal basis | |---|---:|---|---| | Biaya server | Rp 200.000/month | Monthly or annual infra statement | 50% of standalone Pro-seat reference (354k); portfolio hosting marginal ≈ 0 | | Domain & DNS | ≈ Rp 17.000/month (Rp 200k/year) | Annual statement | Registrar renewal at actuals | | Admin fee | 10% on infra subtotal | With infra statement | Per playbook band (10–15%) | | Infra subtotal (incl. admin) | ≈ Rp 240.000/month | — | (200 + 17) × 1,10 ≈ 239 → 240k | | LumenCare Foundation retainer | Rp 600.000/month | Monthly / quarterly / annual prepaid | Labour + SLA capacity | | Combined (Option A) | ≈ Rp 840.000/month | — | ~Rp 9,48 jt/year if retainer prepaid at Rp 6,6 jt + infra ~2,88 jt |

Retainer annual-prepaid incentive: Rp 6.600.000/year (one month free vs Rp 7,2 jt monthly).

Option A — Itemised (recommended default)

Present biaya server + domain (annual infra statement) and retainer separately. Matches LumenDev transparency policy without vendor jargon.

Option B — Simplified all-in bundle

| Plan | Fee | Notes | |---|---:|---| | Monthly | Rp 850.000/month | Server + domain + maintenance + support in one number | | Annual prepaid | Rp 9.350.000/year | ≈ one month free vs 12 × 850k |

Offer Option B if the client wants a single predictable figure. Option A remains the default for auditability.

Margin check (operating stack)

| Framing | Client price/mo | Internal fully loaded/mo | Gross margin | |---|---:|---:|---:| | Option A | 840.000 | 392.000 | Rp 448.000 (~53%) | | Option B | 850.000 | 392.000 | Rp 458.000 (~54%) | | Option A vs cash only | 840.000 | 17.000 | Strong contribution |

Appropriate for a small museum client while keeping real infra cost near zero on the shared account.

What's included in the maintenance retainer

  • Routine maintenance: monthly dependency + security patches, manual MongoDB backup (mongodump) + quarterly restore drill, Better Stack uptime checks, one monthly health review (logs, errors, uptime).
  • Support / help: up to 2 hours/month for questions, content updates (text, photos, hours, contact), minor tweaks. Unused hours do not roll over.
  • Excluded → scoped CR or Phase 2: new features, pages/modules, redesign, payment gateway, migration, multi-language. Beyond 2 hr/month: Rp 150.000/hour, pre-approved, 30-minute increments.

SLA (LumenCare Foundation)

Aligned with [[Areas/LumenDev/playbooks/lumencare-tier-matrix|tier matrix]] — no financial service credits by default (per matrix policy; optional credits only if explicitly added via [[Areas/LumenDev/playbooks/msa-sla-clause-template|MSA template]] brackets).

  • Coverage: Monday–Friday, 09:00–17:00 WIB; public holidays excluded. Outside hours = best effort only.
  • Availability target: 99,0%/month, excluding third-party outages and announced maintenance.
  • Response: P1 ≤ 4 business hours · P2 ≤ 1 business day · P3 ≤ 2 business days.
  • Backups: manual M0 dumps (not Atlas Flex snapshots); monthly verification.
  • Maintenance windows: ≥ 48 hours notice for planned work.
  • No 24/7 on-call; no default uptime penalty credits.

3. Upgrade path (if requirements change)

| Upgrade | Extra cost (indicative) | When to consider | |---|---:|---| | MongoDB Flex ($8/mo) | ~Rp 1,7 jt/year + admin | Client requires Atlas automated daily backups | | Full Pro seat allocation on invoice | +~Rp 154k/mo vs 50% server line | Account split or contract requires dedicated seat | | Resend Pro | ~Rp 4,25 jt/year | High email volume beyond free tier | | .or.id domain | saves ~Rp 100–150k/year vs .id | Org documents available; natural fit for museum |

Default remains M0 + 50% server line unless the client explicitly pays for Flex backups.

6. Budget cap packages (client ceiling)

Internal reference: vendor cash ≈ Rp 17k/month; fully loaded labour ≈ Rp 375k/month at 5 hr × Rp 75k. Standard Rp 840k covers that with margin. At ≤ Rp 300k you subsidise labour; at ≤ Rp 150k you must drop included hours (infra-only or loss-leader hosting line).

How to press total recurring toward Rp 300.000/month (max cap)

| Lever | Saving vs standard (~840k) | Trade-off | |---|---:|---| | Cut retainer 600k → 200k | 400k | ~2 hr/mo total MG time, not 5 | | Cut biaya server 200k → 100k | 100k | Symbolic hosting fee; LumenDev absorbs positioning | | Waive 10% admin on infra | ~22k | Slightly less FX/statement buffer | | Bundle domain into server (one line, annual true-up) | simplifies invoice | Client sees one “server” number | | Quarterly patches instead of monthly | ~1 hr/mo labour | Security lag up to 90 days | | Self-serve content (no included edits) | ~2 hr/mo | Museum updates via admin; MG on CR only | | Annual prepaid (10–12% discount) | cashflow | Same scope, lower effective monthly |

Recommended at 300k cap — package 300-A (all-in):

| | | |---|---:| | Client pays | Rp 300.000/month (single line: Biaya server & pemeliharaan website) | | Includes | Hosting (portfolio Vercel), M0 DB, SSL, domain averaged in; critical security patches; manual DB backup 1×/quarter; uptime check; 1 hour/month P3 (content/text/hours) — no rollover | | Response | P1 best effort next business day (not 4 hr); P2/P3 ≤ 2 business days | | Excluded | Proactive monthly review, quarterly restore drill, >1 hr/mo, new features | | Overage | Rp 150.000/hour, pre-approved | | MG economics | ~4 hr/mo at cost ≈ Rp 300k labour → ~breakeven on time; LumenDev margin ≈ Rp 283k only if you deliver ≤1 hr/mo |

Alternatives at 300k cap:

| ID | Structure | Client total/mo | Best for | |---|---:|---| | 300-A | All-in single line | 300.000 | Simplest museum budget | | 300-B | 100k biaya server + 200k pemeliharaan | 300.000 | Client wants to see server vs “service” split | | 300-C | 150k server (domain bundled) + 150k tiket-only (no included hours) | 300.000 | Museum has volunteer who edits admin; MG fixes breaks only |


Budget options at Rp 150.000/month (max cap)

Cannot fit standard Foundation retainer (300k–900k band floor) and honest labour at 150k. Choose infra-only or accept subsidy.

| ID | Structure | Client total/mo | What they get | What LumenDev does not do | |---|---:|---|---|---| | 150-A | Biaya server all-in | 150.000 | Site stays online on LumenDev stack; domain renewal billed once/year (~Rp 200k) on top or embedded in Rp 1,8 jt/tahun prepaid | No included support hours; no scheduled backups; patches critical CVE only when notified | | 150-B | Hosting only (museum owns domain) | 130.000 server + client pays registrar | Same as A minus domain | Museum manages DNS/domain card | | 150-C | Annual prepaid hosting | Rp 1.500.000/tahun (~125k/mo effective) | 150-A scope, paid upfront | Same cuts as 150-A; cite as “≤ Rp 150k/bulan setara” | | 150-D | Self-serve after handoff | 0 recurring (defer) | Training in build; docs; break-glass Rp 150k/jam | No monitoring obligation — only if museum accepts risk |

Recommended at 150k cap — package 150-A with explicit written limits:

  • One client-facing sentence: “Biaya bulanan hanya untuk server & penayangan website; perubahan konten dan perbaikan dilakukan sendiri di panel admin, atau ditagih per jam.”
  • Minimum viable ops for LumenDev:30 min/month unbilled (watch deploy + invoice) or 150k becomes a loss after ~2 hr/year.

150k vs 300k — quick pick:

| Cap | Pick | Museum gets | |---|---|---| | 300k | 300-A | Light hands-on care (1 hr/mo) + quarterly backup | | 150k | 150-A | Stay online only; museum is operator |


Comparison table (all recurring tiers)

| Tier | Total/mo | Server line | Care / labour | Included MG time | |---|---:|---:|---:|---:| | Standard A | 840.000 | 240k (itemised) | 600k retainer | ~5 hr | | Standard B | 850.000 | (bundled) | (bundled) | ~5 hr | | Cap 300 — 300-A | 300.000 | (bundled) | (bundled) | ~1 hr | | Cap 300 — 300-C | 300.000 | 150k | 150k ticket-only | 0 hr (CR only) | | Cap 150 — 150-A | 150.000 | 150k all-in | — | 0 hr | | Self-serve | 0 | — | — | 0 (ad hoc hourly) |

4. Per-line research notes (May 2026 pricing)

Hosting — Vercel. Hobby is non-commercial only; portfolio Pro ($20/seat) covers compliance. This site’s traffic stays inside usage credit. Client sees biaya server at half the standalone seat IDR equivalent — not “Vercel Pro”. (Vercel pricing, Hobby plan)

Database — MongoDB Atlas M0 (chosen). Free: 0,5 GB, 100 ops/sec, no automated backups, auto-pause after 30 days idle. Mitigation: monthly mongodump in retainer. Flex ($8/mo) adds daily snapshots — upgrade path only. (M0 limits, Flex backups, Pricing)

Transactional email — Resend. Free tier sufficient when email ships; not in v0 scope. (Resend pricing)

Domain + DNS. Planning Rp 200.000/year renewal; .or.id cheaper if eligible. DNS on Vercel at no extra charge.

Uptime — Better Stack free tier (commercial OK). Do not use UptimeRobot free for client sites (personal-only since Oct 2024). (UptimeRobot pricing)

SSL/TLS. Free via Vercel on all plans.

5. Open questions (client / MG)

  • [ ] Confirm LumenDev Vercel Pro is active on the shared account (validates marginal ≈ 0 hosting).
  • [ ] Domain: .id, .or.id, or .com? Already registered? Who renews?
  • [ ] Client-facing structure: Option A itemised vs Option B all-in?
  • [ ] Billing cadence: infra annual statement; retainer monthly / quarterly / prepaid?
  • [ ] Account ownership: LumenDev holds vendors; museum pays IDR invoices only?
  • [ ] Retainer term: 12 months + annual review recommended.
  • [ ] Rates in playbooks: codify Rp 75k (internal) / Rp 150k (overage) or keep project-local.
  • [ ] Admin fee %: 10% confirmed (playbook allows 10–15%).

Decided (no longer open): M0 database; server fee at 50% / Rp 200k labelled biaya server; no default SLA credits.

Sources

Related

  • [[Projects/lumendev-museum-ibu-marsinah/context/commercial-pricing-breakdown-v0|One-time build pricing (v0)]]
  • [[Projects/lumendev-museum-ibu-marsinah/context/commercial-pricing-client-facing-id|Penawaran harga v0 (versi klien)]]
  • [[Areas/LumenDev/playbooks/lumencare-tier-matrix|LumenCare tier matrix]]
  • [[Areas/LumenDev/playbooks/monthly-infra-statement-template|Monthly infra statement template]]
  • [[Areas/LumenDev/playbooks/msa-sla-clause-template|MSA/SLA clause template]]
  • [[Projects/lumendev-museum-ibu-marsinah/meetings/2026-05-22-client-scope-lock|Scope-lock meeting (2026-05-22)]]