Prototype
Buckets
- Consume
- Sink for consumed service; source for refunds
- Service
- Current allocation for service (can go negative if customer desires, or act as access cutoff)
- Balance
- Current customer balance not allocated for service (can go negative as consumed, or positive if prepaid)
- Invoice
- Amount owed on current invoice
Ticks
Automatic Ticks
Service tick
Service -> Consume
Consumes a bit of service
- once a day for daily consumption (disk, etc)
- once a month for granular service (hosting)
- once a year for registration (domain)
Billing tick
Balance -> Service
- Replenishes Service with enough to cover the next billing period
Unused tick
Service -> Balance
- Move unconsumed Service back to Balance, in case of overprovisioning or unconfigured service
Invoice tick
Invoice -> Balance
- Bring Balance from negative to zero to account for currently owed outstanding
- Bring Invoice from positive to zero to account for overpayment
Payment tick
Outside -> Invoice
- Incoming payments are placed here until they're accounted for by an invoice run
Manual Ticks
Prepay tick
Invoice -> Balance
- Preemptively move money to indicate a customer's desire to prepay by owing more on next invoice than is actually outstanding
Refund tick
Consume -> Service
- Refund for consumed but unprovided service (outage, etc)
Invoice Generation
- Generate Unused tick to refund unused service
- Generate Billing tick to fund next billing period
- Generate Invoice tick to account for payments and refunds
- Compute invoice values and lines from all ticks between current and previous Invoice tick
Example flows
- 20-Dec: January period starts December 20th
- 29-Dec: New customer provisioned for $10.00 VHOST MED service
- 29-Dec: Bucket balances: C:0 S:0 B:0 I:0
- 01-Jan: Service tick: $10 S->C - C:10 S:-10 B:0 I:0
- 20-Jan: February billing period starts
- 20-Jan: Unused tick (none necessary)
- 20-Jan: Billing tick: $10 B->S - C:10 S:10 B:-20 I:0
- 20-Jan: Invoice tick: $20 I->B - C:10 S:10 B:0 I:-20
Sample invoice:
$10.00 - VHOST MED: example.com 2011-Jan $10.00 - VHOST MED: example.com 2011-Feb ---- $20.00 - Amount due
- 30-Jan: Payment tick: $20 ?->I - C:20 S:0 B:0 I:0
- 01-Feb: Service tick: $10 S->C - C:20 S:0 B:0 I:0
- 20-Feb: March billing period starts
- 20-Feb: Unused tick (none necessary)
- 20-Feb: Billing tick: $10 B->S - C:20 S:10 B:-10 I:0
- 20-Feb: Invoice tick: $10 I->B - C:20 S:10 B:0 I:-10
$20.00CR - Payment received 2011-01-30, Thank you! $10.00 - VHOST MED: example.com 2011-Mar ---- $10.00 - Amount due
- Customer goes delinquent!
- 01-Mar: Service tick: $10 S->C - C:30 S:0 B:0 I:-10
- 20-Mar: April billing period starts
- 20-Mar: Unused tick (none necessary)
- 20-Mar: Billing tick: $10 B->S - C:30 S:10 B:-10 I:-10
- 20-Mar: Invoice tick: $10 I->B - C:30 S:10 B:0 I:-20
$10.00 - VHOST MED: example.com 2011-Mar $10.00 - VHOST MED: example.com 2011-Apr ---- $20.00 - Amount due
- Customer requests prepay so they don't go delinquent again; next invoice should be $50
- 21-Mar: Payment tick: $20 ?->I - C:30 S:10 B:0 I:0
- 21-Mar: Prepay tick: $50 I->B - C:30 S:10 B:50 I:-50
- 01-Apr: Service tick: $10 VHOST MED - S->C - C:40 S:0 B:50 I:-50
- 20-Apr: May billing period starts
- 20-Apr: Unused tick (none necessary)
- 20-Apr: Billing tick: $10 B->S - C:40 S:10 B:40 I:-50
- 20-Apr: Invoice tick: $0 I->B - C:40 S:10 B:40 I:-50
$10.00 - VHOST MED: example.com 2011-Mar $10.00 - VHOST MED: example.com 2011-Apr $20.00CR - Payment received 2011-03-21, Thank you! $40.00 - Prepay request $10.00 - VHOST MED: example.com 2011-May ---- $50.00 - Amount due
- 25-Apr: Payment tick: $50 ?->I - C:40 S:10 B:40 I:0
- 01-May: Service tick: $10 S->C - C:50 S:0 B:40 I:0
- 20-May: June billing period starts
- 20-May: Unused tick (none necessary)
- 20-May: Billing tick: $10 B->S - C:50 S:10 B:30 I:0
- 20-May: Invoice tick: $0 I->B - C:50 S:10 B:30 I:0
$40.00 - Prepay request $10.00 - VHOST MED: example.com 2011-May $50.00CR - Payment received 2011-04-25, Thank you! $10.00 - VHOST MED: example.com 2011-Jun ---- $30.00CR - Current balance