offdataai
Energy & Utilities · data model template

Utility CIS / Customer Billing data model

Third-normal-form CIS replica spanning the utility customer-to-cash chain: customer_account → service_address → service_point (IEC 61968 usage point) → meter → meter_reading, with service_agreement carrying the rate tariff and its effective dates per service point, bill / bill_line_item providing the standard header-detail statement, payment posting against the bill, and service_order tracking field work. AMI/MDMS feed meter_reading via the source field. Customer PII (name, address, email, phone, postal code) is masked under GDPR and CCPA.

Normalized replica of a utility Customer Information System (CIS) for customer-of-record, premise, service-point/usage-point, meter, meter readings, service agreements, bills, bill line items and payments — aligned to IEC 61968 (CIM) and patterned on VertexOne, Oracle CC&B, Harris Northstar and SAP IS-U. It is a normalized (3NF) relational model that mirrors the source system, suited to operational databases and to landing source data faithfully.

3NFEnergy & UtilitiesGDPRCCPAIEC-61968
17
tables
165
columns
26
relationships
8
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: PostgreSQL). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

master_datacustomer_premisemeteringbilling_paymentservice_ops

Design decisions

  • IEC 61968 CIM-aligned customer-to-meter chain

    Modeling customer_account → service_address → service_point → meter follows the IEC 61968 Common Information Model for utility customer and metering domains, so the replica is directly mappable to CIM-based MDM/MDMS and outage/AMI exchanges without bespoke translation.

  • Tariff history kept via a separate service_agreement

    Rate tariffs change over time and customers can switch tariffs without changing premise or meter; a separate service_agreement with effective_from / effective_to per service point preserves tariff history without re-stating old bills, mirroring how Oracle CC&B and SAP IS-U keep SA / tariff history.

  • Bill header / line item split mirrors statement structure

    Bills are issued as a header (totals, dates, status) with N line items (energy, demand, fixed, tax, fee, credit, late-fee); the header/detail split lets each line carry its own service_point, tariff and commodity without denormalizing the statement totals.

  • AMI / MDMS integration via meter_reading source

    Meter readings arrive from AMI head-end systems, AMR walk-by routes or manual reads; tagging meter_reading with source plus a read_status quality code lets the warehouse reconcile MDMS-validated reads against billing-quality reads without splitting the table per channel.

  • CIS is the master for customer-of-record across commodities

    A single customer_account can hold service_points across electric, gas, water, sewer and steam; making customer_account the master and joining all premises / meters / bills to it through service_point keeps the customer-of-record single-sourced across commodities, as IEC 61968 prescribes.

Tables in the Utility CIS / Customer Billing model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Tables (10)

customer_account

Grain: one row per CIS customer account (account_number)

IEC 61968 Customer + CustomerAccount — the customer-of-record across commodities.

ColumnTypeKeys
customer_account_keybigintPK
utility_company_keybigint
billing_cycle_keybigint
account_numbervarcharBK · PII
customer_namevarcharPII
account_typevarchar
account_classvarchar
mailing_addressvarcharPII
emailvarcharPII
phonevarcharPII
account_statusvarchar
opened_datedate
closed_datedate
credit_score_bandvarchar
deposit_amountdecimal
parent_account_keybigint

service_address

Grain: one row per service premise / address

IEC 61968 ServiceLocation / premise — physical location served.

ColumnTypeKeys
service_address_keybigintPK
service_address_idvarcharBK
street_addressvarcharPII
cityvarchar
statevarchar
postal_codevarcharPII
countryvarchar
latitudedecimal
longitudedecimal
dwelling_typevarchar
year_builtinteger

service_point

Grain: one row per service point / usage point

IEC 61968 UsagePoint — the meterable delivery point of a commodity.

ColumnTypeKeys
service_point_keybigintPK
customer_account_keybigint
service_address_keybigint
service_class_keybigint
rate_tariff_keybigint
service_point_idvarcharBK
install_datedate
removal_datedate
service_point_statusvarchar
voltage_levelvarchar
supply_phasevarchar

meter

Grain: one row per physical meter (badge / serial)

IEC 61968 Meter — physical measuring device installed at a service point.

ColumnTypeKeys
meter_keybigintPK
meter_type_keybigint
service_point_keybigint
meter_idvarcharBK
install_datedate
removal_datedate
current_statusvarchar
last_test_datedate
manufacturervarchar
modelvarchar
multiplierdecimal

meter_reading

Grain: one row per meter read (reading_id)

IEC 61968 MeterReading — sourced from AMI/MDMS or manual route reads.

ColumnTypeKeys
meter_reading_keybigintPK
meter_keybigint
read_status_keybigint
reading_idvarcharBK
read_datetimestamp
register_valuedecimal
prior_register_valuedecimal
consumption_kwh_or_unitdecimal
is_billableboolean
billing_period_startdate
billing_period_enddate
recorded_byvarcharPII
sourcevarchar

service_agreement

Grain: one row per service agreement (agreement_id)

IEC 61968 ServiceAgreement — links customer, service point and tariff over time.

ColumnTypeKeys
service_agreement_keybigintPK
customer_account_keybigint
service_point_keybigint
rate_tariff_keybigint
service_class_keybigint
agreement_idvarcharBK
effective_fromdate
effective_todate
agreement_statusvarchar
deposit_requiredboolean
contract_demand_kwdecimal
is_net_meteredboolean

bill

Grain: one row per bill statement (bill_id)

Bill header — one statement issued to a customer for a billing period.

ColumnTypeKeys
bill_keybigintPK
customer_account_keybigint
billing_cycle_keybigint
bill_idvarcharBK
bill_datedate
billing_period_startdate
billing_period_enddate
due_datedate
total_amountdecimal
current_chargesdecimal
previous_balancedecimal
payments_applieddecimal
taxesdecimal
late_feesdecimal
currencyvarchar
bill_statusvarchar

bill_line_item

Grain: one row per bill line (bill_line_id)

Bill detail — header/detail with the bill table.

ColumnTypeKeys
bill_line_item_keybigintPK
bill_keybigint
service_point_keybigint
rate_tariff_keybigint
service_class_keybigint
bill_line_idvarcharBK
charge_typevarchar
descriptionvarchar
quantitydecimal
unit_ratedecimal
amountdecimal
currencyvarchar

payment

Grain: one row per payment transaction (payment_id)

Cashiering / payment posting against the bill.

ColumnTypeKeys
payment_keybigintPK
customer_account_keybigint
bill_keybigint
payment_method_keybigint
payment_idvarcharBK
payment_datetimestamp
amountdecimal
currencyvarchar
payment_channelvarchar
confirmation_numbervarchar
payment_statusvarchar

service_order

Grain: one row per service order (service_order_id)

Field service orders against a service point (move-in, disconnect, reread, ...).

ColumnTypeKeys
service_order_keybigintPK
customer_account_keybigint
service_point_keybigint
service_order_idvarcharBK
order_typevarchar
requested_datedate
scheduled_datedate
completed_datedate
order_statusvarchar
technician_idvarchar

Lookup tables (7)

utility_company

Grain: one row per utility operating company

Utility-of-record operating entity (per IEC 61968 OrganisationRole).

ColumnTypeKeys
utility_company_keybigintPK
utility_idvarcharBK
utility_namevarchar
countryvarchar
regulated_statusvarchar
regulatory_jurisdictionvarchar

service_class

Grain: one row per utility commodity / service class

IEC 61968 ServiceCategory — the commodity sold at the service point.

ColumnTypeKeys
service_class_keybigintPK
service_class_idvarcharBK
descriptionvarchar
regulatedboolean
unit_of_measurevarchar

rate_tariff

Grain: one row per rate tariff version

Rate / pricing scheme — tariff history retained via effective_from/to.

ColumnTypeKeys
rate_tariff_keybigintPK
service_class_keybigint
rate_tariff_idvarcharBK
tariff_namevarchar
rate_structurevarchar
effective_fromdate
effective_todate
requires_demand_meterboolean
is_activeboolean

meter_type

Grain: one row per meter model / technology

Meter catalog — AMI smart, AMR walk-by, or manual read.

ColumnTypeKeys
meter_type_keybigintPK
meter_type_idvarcharBK
descriptionvarchar
technology_specvarchar
is_bidirectionalboolean
read_interval_minutesinteger

billing_cycle

Grain: one row per billing cycle / route

Read / billing schedule the account is assigned to.

ColumnTypeKeys
billing_cycle_keybigintPK
billing_cycle_idvarcharBK
cycle_namevarchar
read_dayinteger
billing_frequencyvarchar
cycle_groupvarchar
is_activeboolean

payment_method

Grain: one row per supported payment method

Tender types accepted by the CIS cashiering subsystem.

ColumnTypeKeys
payment_method_keybigintPK
payment_method_idvarcharBK
descriptionvarchar
processing_feedecimal
is_electronicboolean

read_status

Grain: one row per meter-read quality code

MDMS read-quality / status classification.

ColumnTypeKeys
read_status_keybigintPK
read_status_idvarcharBK
descriptionvarchar
is_billable_qualityboolean

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • rate_tariff.service_class_key → service_class (many-to-one)
  • customer_account.utility_company_key → utility_company (many-to-one)
  • customer_account.billing_cycle_key → billing_cycle (many-to-one)
  • service_point.customer_account_key → customer_account (many-to-one)
  • service_point.service_address_key → service_address (many-to-one)
  • service_point.service_class_key → service_class (many-to-one)
  • service_point.rate_tariff_key → rate_tariff (many-to-one)
  • meter.meter_type_key → meter_type (many-to-one)
  • meter.service_point_key → service_point (many-to-one)
  • meter_reading.meter_key → meter (many-to-one)
  • meter_reading.read_status_key → read_status (many-to-one)
  • service_agreement.customer_account_key → customer_account (many-to-one)
  • service_agreement.service_point_key → service_point (many-to-one)
  • service_agreement.rate_tariff_key → rate_tariff (many-to-one)
  • service_agreement.service_class_key → service_class (many-to-one)
  • bill.customer_account_key → customer_account (many-to-one)
  • bill.billing_cycle_key → billing_cycle (many-to-one)
  • bill_line_item.bill_key → bill (many-to-one)
  • bill_line_item.service_point_key → service_point (many-to-one)
  • bill_line_item.rate_tariff_key → rate_tariff (many-to-one)
  • bill_line_item.service_class_key → service_class (many-to-one)
  • payment.customer_account_key → customer_account (many-to-one)
  • payment.bill_key → bill (many-to-one)
  • payment.payment_method_key → payment_method (many-to-one)
  • service_order.customer_account_key → customer_account (many-to-one)
  • service_order.service_point_key → service_point (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time