ScallerFox Docs

How Pods Are Counted for Billing

Understanding which pod conditions are billed and which are not, based on real-time Kubernetes event tracking.

1

How Billing Works

Per-Pod Time-Based Billing

Billing dihitung setiap 5 menit. Setiap pod di-charge berdasarkan waktu running sebenarnya.

charge_per_session = floor(elapsed_minutes) × (package_price_per_hour ÷ 60)

Untuk setiap session aktif, hitung elapsed sejak last_billed_at, bulatkan ke bawah, kalikan harga per menit.

BILLABLE BILLABLE_TERMINATING RESERVATION

Every 5 Minutes

Billing runs at minute 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55 (WIB).

1 Pod = 1 Session

Each tracked pod gets one open session. Duplicate sessions are prevented. Each session tracks last_billed_at.

Per-Minute Accuracy

Each session charges based on floor(elapsed_minutes). Short-lived pods are not overcharged.

2

Billable Pods

These pod conditions count toward your billing. Each open session contributes to the active billable pod count.

Pod ConditionStatus
RunningBILLABLE
Running + TerminatingBILLABLE_TERMINATING
CrashLoopBackOffRESERVATION
OOMKilledRESERVATION
Terminating + Containers RunningBILLABLE_TERMINATING
Unknown Waiting StateRESERVATION
3

Not Billable

These pod conditions do not count toward billing. Sessions are closed or never created.

Pod ConditionStatus
PendingPodInitializingContainerCreating
FREE
ImagePullBackOff
FREE
InvalidImageName
FREE
CreateContainerConfigError
FREE
Unknown Phase
FREE
Pod Deleted
FREE
Terminating + Containers Stopped
FREE
No Application ID
FREE
4

Session Lifecycle & Final Charge

Each pod gets one billing session. Every 5 minutes, session is charged based on elapsed time since last_billed_at. When pod is deleted, final charge applies remaining minutes (rounded up).

EventStatus
Pod AddedBILLABLE
Every 5 min (Billing Tick)BILLABLE
CrashLoopBackOffRESERVATION
Platform ErrorFREE
Pod Deleted (HPA kill / manual)FREE
Stale Session CleanupFREE

Per-Pod Time-Based Calculation

1

Periodic Billing (every 5 min)

elapsed = now - last_billed_at  →  billable_min = floor(elapsed_minutes)

2

Update last_billed_at

After each charge, last_billed_at = now so next tick only charges new elapsed time.

3

Final Charge (pod deleted)

elapsed = now - last_billed_at  →  final_min = ceil(elapsed_minutes) (bulatkan ke atas untuk coverage penuh)

Contoh Perhitungan per Skenario

SkenarioPeriodic Tick (floor)Final Charge (ceil)Total
Pod hidup 3 mnt, lalu mati0 (tidak ada tick)ceil(3) = 3 mnt3 menit
Pod hidup 3.7 mnt, lalu matifloor(3.7) = 3 mntceil(3.7) = 4 mnt4 menit
Pod hidup 5 mnt pas, lalu matifloor(5) = 5 mntceil(0) = 0 mnt5 menit
Pod hidup 8 mnt, lalu matifloor(5) = 5 mntceil(3) = 3 mnt8 menit
Pod hidup 17.5 mnt, lalu matifloor(5) × 3 = 15 mntceil(2.5) = 3 mnt18 menit

Kenapa floor + ceil? Floor di periodic tick memastikan pod tidak di-charge untuk menit awal sebelum tick pertama. Jika pod mati sebelum tick kedua, final charge dengan ceil mengambil semua sisa menit. Kombinasi ini memastikan tidak ada menit yang hilang meskipun pod mati di antara dua tick.

5

Quick Reference

$ Billable — Session Counted

RunningBILLABLE
Running + TerminatingBILLABLE_TERM.
CrashLoopBackOffRESERVATION
OOMKilledRESERVATION
Unknown WaitingRESERVATION

Not Billable — Session Free

Pending / InitializingFREE
ImagePullBackOffFREE
InvalidImageNameFREE
ConfigErrorFREE
Pod Deleted / TerminatedFREE

Per-Pod Time-Based Billing

Setiap pod di-charge berdasarkan waktu running sebenarnya. Setiap 5 menit, elapsed sejak last_billed_at di-floor dan di-charge per menit. Saat pod dihapus, sisa waktu di-charge dengan ceil (bulatkan ke atas). Ini lebih akurat dan adil untuk user dan platform.