Edge Case: When Accounts from Additional/Secondary Providers are Present on a Bill
Task
Obtain the total consumption for a given meter during a given service period, without double-counting and ensuring data accuracy.
Contextual Notes
- A measurement period is defined as the period of time between
periodStartandperiodEnddates. For measurement periods that have the same dates or are only one day more or less on either or both ends, we consider them as the same measurement periods. - A meter reading is defined as a data record for a meter and represented by a
meterDataobject in the Arcadia data model. A meter can have multiple meter readings over time. - On the Utility Cloud API, the “primary” provider is sometimes referred to as the “main” provider and the “additional” provider is sometimes referred to as the “secondary” provider.
High Level Steps
1. Check if there are any duplicates for the same measurement period and the same meter.
If there are ADDITIONAL/SECONDARY providers present on a statement, there will be duplicate meter readings and the duplicates will occur on one statement.
- For example, on a statement for the meter-level measurement period between Jan 1, 2023, and Feb 1, 2023, there are two meter readings for the same meter with the meter number 123. The first meter reading is 45 kWh and the second meter reading is 50 kWh. When this happens, you will need to decide which meter reading to use when accounting for the total usage for this measurement period.
If there are no ADDITIONAL/SECONDARY providers present on a statement, there may be duplicate meter readings and, if so, they will occur on different statements.
You can check whether ADDITIONAL/SECONDARY providers are present at the JSON path accountData.providers.classification in a Retrieve Statement endpoint response. To learn more about ADDITIONAL/SECONDARY providers, see the Arcadia Data Model guide.
When duplicates are present, thetotalUsages of each meter reading may be the same or different.
2. If duplicates are present, decide which one to use.
Around 70% of meter reading duplicates due to this edge case can be resolved by this logic.
To ensure you are not double-counting and choosing the accurate value, you can choose which value to use with the following steps:
- For meter readings that have the same
totalUsagevalues, you can choose a random one to use as thetotalUsagevalues are identical. - For meter readings that have different
totalUsagevalues, you need to determine which meter reading belongs to the commodity distributor and use the value from that meter. The commodity distributor owns the metering, therefore they are accountable for the accuracy of the data. You can check if a meter reading belongs to the commodity distributor with the following steps:- Check the value for the
meterData.deregulationStatusfield. When the value isDELIVERY_ONLY, the meter reading belongs to the commodity distributor and you can use thetotalUsagevalue reported for this meter reading.- If the
meterData.deregulationStatusvalue is notDELIVERY_ONLY, then check theaccountData.charges.lifeCycleStagefield by first finding theaccountDataobject themeterDataobject nests under, then finding a charges object that nests under theaccountDataobject. When the value foraccountData.charges.lifeCycleStageis one ofTRANSMISSION,DISTRIBUTION,COMBINED_DELIVERY, then the meter reading belongs to the commodity distributor and you can use thetotalUsagevalue reported for this meter.- If neither of these values are present in the JSON response, you need to manually review the statement and determine which meter belongs to the commodity distributor contextually. Additionally, you can reach out to our Support team for a recommendation.
Consider upgrading to the Plug API and using DataHub
If you prefer us to handle this logic for you, consider using our DataHub product. The DataHub product has this logic built-in, therefore will only present the relevant total usage from commodity usage accounting purposes.
- If neither of these values are present in the JSON response, you need to manually review the statement and determine which meter belongs to the commodity distributor contextually. Additionally, you can reach out to our Support team for a recommendation.
- If the
- Check the value for the
Steps for De-Duplicating via the API
Most likely, if you are ONLY using the API, you will be able to resolve around 50% of the duplicates due to this edge case programmatically and will need to rely on manual reviews to resolve the remaining duplicates.
Accouting for one meter for one measurement period
- Use the Meter Details endpoint to make a request by specifying the
meterId. - The response will include an array of
usageobjects for the specifiedmeterIdfor all measurement periods. - Identify the measurement period you care about and identify all
usageobjects that has the sameperiodStartandperiodEnddate or +/- one day with respect to the measurement period, has"tariffRateComponents.tarffRateComponentType": "TOTAL", and has"contributionStatus": "CONTRIBUTING"- If there is only one
usageobject identified, then there is no duplicate meter readings for the specific measurement period and you can skip step 4 and proceed to step 6. - If there are more than one
usageobject identified, proceed to step 4.
- If there is only one
- Review the
measuredUsagevalue and compare if the values are the same for the identifiedusageobjects.- If they are the same, you can use any one of them to account for the total usage.
- If they are not the same, proceed to step 5.
- Review the
._embedded.meters[0].deregulationStatusfield for each identifiedusageobject.- If the value is
DELIVERY_ONLY, then the meter reading is for a commodity distributor and you can use thetotalUsagevalue. - If the value is not
DELIVERY_ONLY, you will need to manually perform the remaining checks outlined here.
- If the value is
Account for one meter for all measurement periods
- Repeat steps 1-5 for all measurement periods you need to account for.
Accounting for all meters for all measurement periods
- Call the List Meters endpoint without specifying any query parameters to get all
meterIds associated with your org. - Repeat steps 1-6 for all
meterIds obtained in step 7.
Updated 3 months ago
