CommoVision

See the future in real time

← All tables

well_production

Monthly production volumes for every well, one row per well per month. The series is complete and continuous from first production to the well's reporting frontier: alongside volumes exactly as reported, it includes reliably-inferred rows (interior gap fills, lease-to-well allocations, period-to-month splits), each labeled in record_origin so you can always filter to the raw reported subset. Volumes are monthly totals; per-day rates, cumulatives, and month counts are intentionally not stored. They derive from this table in one SQL expression (see the derived-fields section). Operator columns carry who filed each record, exactly as the source reported it, plus the operator we attribute where the source filed none; the owner at any date is computed from our merger history at read time, so an ownership correction reaches every month without a rewrite.

Access tier: portal Portal. These rows are well-level or producing-unit-level data, or our modelled output at cohort or grid grain. They open with a Portal, Pro or Enterprise plan. The website shows aggregates built from them, never the rows.
Primary key: well_id, date
Region codes: ab, ak, al, ar, argentina, bc, brazil, ca, co, gom, ks, la, mb, mexico, mi, ms, mt, nd, nm, oh, ok, pa, pacific, sk, tx, ut, wv, wy

Columns

ColumnTypeNullableDescription
well_id string no Globally unique well identifier (opaque string), the join key to the well register and every other well-grain table. Stable across time; never parse substrings out of it.
date date no Production month, always the first day of the month (a 2026-03 row is dated 2026-03-01). Together with well_id this is the primary key.
year int16 no Calendar year of the production month (equals the year of date). Provided for fast year-level filtering and partition pruning.
oil_per_month int32 no Oil produced during the month, in barrels (BBL). Includes condensate. Never NULL: a reported zero, a reliably-inferred zero, and a placeholder zero all appear as 0, with record_origin telling you which (see source_corrupt for placeholder zeros where the source's stored figures were discarded as corrupt, and source_redacted for placeholder zeros where the source withheld this stream's figure). NGLs are excluded.
gas_per_month int32 no Natural gas produced during the month, in thousand cubic feet (MCF). Hydrocarbon gas only: non-hydrocarbon volumes a source books in its gas column (carbon dioxide, helium, nitrogen) are excluded. Gross wellhead gas; see the disposition table for how gas was used or sold. Never NULL.
water_per_month int32 yes Water produced during the month, in barrels (BBL). NULL where the source does not report well-level water (e.g. TX, OK): NULL means "not reported", never zero.
producing_days int16 yes Number of days the well actually produced during the month, as reported. NULL where the source does not report it, and where a reported count was refused as outside the 0-31 range a month can hold; in Pennsylvania and Ohio a spread filing's zero-day months that still carry volume are NULL as well. Note: per-day rates in our serving layers divide by calendar days, not producing days, so rates stay comparable across sources.
reported_operator string yes The operator exactly as the official source records it for this month, normalized to a canonical display name but with NO merger succession applied: the faithful source record. The owner at any later date, mergers and acquisitions applied, is computed from this identity at read time rather than stored per row. NULL wherever the source gives us no operator we can present as a company for that month: it may publish nothing at all, only a placeholder for an unknown or orphaned operator (a state plugging fund, an "unknown operator" literal), a name our own mapping resolves to such a bucket record, or only a contract or licence identifier we have not yet mapped to its operator.
reported_operator_id string yes Stable company identifier for reported_operator (no merger succession). Join key to the organizations register; our merger history applied to this id gives the owner at any date. Populated wherever the published record maps to a registered organization, including the bucket records that stand in for operators the source leaves unidentified; on those rows reported_operator is NULL, because a bucket is not a company name. NULL where the source publishes no operator at all, or where a usable published name is not yet mapped to a registered organization, so a NULL id beside a populated reported_operator_entity means an unmapped name, not a missing operator.
reported_operator_entity string yes Raw reporting entity name from the source (e.g. "EOG New Mexico"), before any normalization or company resolution. No merger succession is applied: this is the source's own string, not our corrected view of who owns the well today. NULL where the source names no real company: regulator placeholder strings ("historic owner", "not assigned") are treated as no operator rather than published as one. Also empty on months we filled in ourselves (record_origin = gap_filled): the source reported nothing for that month. Useful for audit and M&A analysis.
reported_operator_registration_id string yes The official source's operator ID at the time of production (TX P-5 number, ND operator number, etc.). Where the source filing carries one, it is passed through raw as an opaque string. Where the source issues licence IDs but never prints them on production records (currently Kansas), it is our match of the reported operator name to the state's own licensee register: the same ID namespace, derived by us rather than filed. NULL otherwise.
attributed_operator_id string yes Stable company identifier for the operator we attribute to this month where the source filed none: on filled-in months (record_origin = gap_filled) it is carried from the well's adjacent filings, and in regions whose source names no operator it comes from our own curation. No merger succession is applied; the owner at any date is computed from this id at read time, exactly as for reported_operator_id. Never populated where the filing itself names an operator (see the reported columns); NULL when we have nothing reliable to attribute.
record_origin string no How this row was derived: the provenance flag. Values: reported (as filed with the source), gap_filled (a reliably-inferred zero inside a well's reporting history), lease_allocated (lease-level volume allocated to wells), period_allocated (multi-month filing split to months), reconciled (adjusted to match an official published total), wellstar_estimated (California's own preliminary-estimate flag), source_corrupt (placeholder zeros for filed figures we discarded as corrupt), source_redacted (the source filed the month and withheld one stream's production figure; that stream carries a placeholder zero), identity_inferred (the source filed the volume without naming the well; the well shown is our attribution on a measured one-well ground). Filter record_origin = 'reported' for the raw source view, noting that inside a declared discard window (see source_corrupt) the discarded stream's figures are placeholder zeros on every origin, reported rows included. Values: reported · gap_filled · lease_allocated · period_allocated · reconciled · wellstar_estimated · source_corrupt · source_redacted · identity_inferred.

Region-specific columns

Extra columns a single region's source adds.

ab (1 column)
ColumnTypeDescription
operator_method string How this month's operator was determined: petrinex_per_row = the regulator reported the operator for this month; petrinex_chain = carried between dated regulator reports; static_earliest_petrinex = the earliest reported operator stamped backward over older months; static_current_operator = the well's current operator applied to the whole history. The two static values mean the operator shown for an old month can be a later company.
nd (1 column)
ColumnTypeDescription
operator_method string How this month's operator was determined: ndic_monthly_report = NDIC's monthly production report names this month's operator; static_current_operator = the well's current operator, filled into a month that report does not cover (every month before 2003, and the report's gaps).

Derived fields you can compute

FieldFormulaDescription
oil_per_day oil_per_month / date_part('day', last_day(date)) Average oil rate for the month in BBL/d, using calendar days (not producing days) so rates are comparable across sources and wells.
gas_per_day gas_per_month / date_part('day', last_day(date)) Average gas rate for the month in MCF/d, calendar-day basis.
water_per_day water_per_month / date_part('day', last_day(date)) Average water rate for the month in BBL/d, calendar-day basis. NULL where water_per_month is NULL.
oil_cum SUM(oil_per_month) OVER (PARTITION BY well_id ORDER BY date) Cumulative oil (BBL) from first production through this month.
gas_cum SUM(gas_per_month) OVER (PARTITION BY well_id ORDER BY date) Cumulative gas (MCF) from first production through this month.
water_cum SUM(water_per_month) OVER (PARTITION BY well_id ORDER BY date) Cumulative water (BBL) from first production through this month.
months_on_production CASE WHEN date >= MIN(CASE WHEN oil_per_month > 0 OR gas_per_month > 0 THEN date END) OVER (PARTITION BY well_id) THEN 1 + datediff('month', MIN(CASE WHEN oil_per_month > 0 OR gas_per_month > 0 THEN date END) OVER (PARTITION BY well_id), date) END Calendar months elapsed since the well's first month with any oil or gas (that month = 1), counting idle months. NULL before first production. The x-axis for type-curve and decline analysis.
producing_months SUM(CASE WHEN oil_per_month > 0 OR gas_per_month > 0 THEN 1 ELSE 0 END) OVER (PARTITION BY well_id ORDER BY date) Running count of months with actual production (oil or gas above zero): unlike months_on_production, idle months don't advance it.

How these numbers are built is on methodology; the machine twin of this page is data-dictionary.json.