Crude Oil Pipelines

Hydraulics, capacity, and the price of getting oil to market

2026-03-10

Every barrel of Alberta crude travels an average of 3,500 kilometres before it reaches a refinery — and the price the producer receives is determined as much by the physics of that journey as by the market at the other end.

That physics begins with a deceptively simple question: what does it take to push a viscous fluid through 760 millimetres of steel pipe at two metres per second for 2,700 kilometres? The answer is pressure — and the equation that quantifies how much pressure is the Darcy-Weisbach formula. Everything else in this essay — the capacity of the Enbridge Mainline, the discount WCS crude trades at relative to WTI, the comparative economics of Keystone versus Trans Mountain — follows from understanding what that equation says and why.

The hydraulics of a liquid pipeline

Fluid moving through a pipe loses pressure to friction. The Darcy-Weisbach equation expresses that loss:

\Delta P = f_D \cdot \frac{L}{D} \cdot \frac{\rho v^2}{2}

Symbol Meaning Units / range
ΔP Pressure drop along pipe segment Pa (or psi for field use)
fD Darcy friction factor (dimensionless) 0.008–0.025 for turbulent flow in steel pipe
L Pipe segment length m
D Internal pipe diameter m
ρ Fluid density kg/m³ — dilbit ≈ 920–940; synthetic crude ≈ 850
v Mean flow velocity m/s — typical pipeline: 1.5–3.0 m/s

The equation has three parts. The geometry ratio L/D scales pressure drop with how long and how narrow the pipe is — a longer, thinner pipe offers more resistance. The kinetic pressure term *ρ**v2/2 captures the energy the fluid carries at its operating velocity. The friction factor fD* connects these to the physical characteristics of the pipe wall and the flow regime.

The Reynolds number determines the flow regime:

Re = \frac{\rho v D}{\mu}

where μ is the dynamic viscosity of the fluid (Pa·s). For crude oil pipelines, Re routinely exceeds 100,000 — well into the turbulent regime (*R**e* > 4000). Turbulent flow generates more friction than laminar flow, which is why the friction factor matters and why viscosity management (including diluent blending for bitumen) is an operational priority.

The friction factor for turbulent flow in a rough steel pipe is approximated by the Swamee-Jain equation, an explicit form that avoids the iterative Colebrook-White calculation:

f_D = \frac{0.25}{\left\[\log\_{10}\\\left(\frac{\varepsilon}{3.7D} + \frac{5.74}{Re^{0.9}}\right)\right\]^2}

where ε = 4.6 × 10−5 m is the roughness of commercial steel pipe.

The quadratic relationship between velocity and pressure drop is the key insight: doubling throughput velocity quadruples the pressure requirement. This is why pump stations exist at intervals along every major pipeline — they restore pressure that friction has consumed.

Volumetric flow rate follows directly from velocity and pipe geometry:

Q = v \cdot \frac{\pi D^2}{4}

Converting to barrels per day: 1 m³ = 6.2898 bbl; 1 day = 86,400 s.

Alberta’s three export corridors

Alberta crude moves to market through three distinct systems, all originating at the Hardisty, AB hub — the province’s primary crude gathering and storage node. Hardisty sits in east-central Alberta and functions as the point at which upstream production hands off to long-haul export transmission.

System Operator Capacity (bbl/day) Route Approx. tariff (USD/bbl)
Enbridge Mainline Enbridge ~3,000,000 Hardisty → Superior WI / Sarnia ON ~5
Trans Mountain (post-expansion) Trans Mountain Corp ~890,000 Edmonton → Burnaby BC ~11
Keystone TC Energy ~590,000 Hardisty → Cushing OK / Gulf Coast ~8

Sources: CER Pipeline Profiles; company annual reports and investor disclosures. Tariffs are indicative — actual rates depend on contract type, volume commitment, and commodity.

The Enbridge Mainline is the largest crude pipeline system in North America, consisting of multiple parallel lines (Lines 1–13) that move approximately 3 million bbl/day eastward to Superior, Wisconsin, where they connect to Flanagan South, Seaway, and the southern extension toward Gulf Coast refineries, as well as to Sarnia, Ontario, serving eastern Canadian refineries.

Trans Mountain (TMX, post-2024 expansion) is the only pipeline system with direct tidewater access on Canada’s Pacific coast. Its western terminus at the Burnaby Marine Terminal enables tanker loading for Asian markets, principally Japan, South Korea, and China. This geographic reach is economically significant because Pacific Basin refineries — particularly in Asia — are configured to process heavy sour crude, the category that includes Alberta’s diluted bitumen. The quality discount these buyers apply is typically smaller than the WCS-WTI discount in U.S. markets.

Keystone (TC Energy) provides 590,000 bbl/day of capacity to Cushing, Oklahoma — the delivery point for WTI futures contracts and the hub connecting to Gulf Coast refineries along the Cushing-to-Port Arthur corridor. The cancelled Keystone XL extension would have added 830,000 bbl/day of direct Hardisty-to-Gulf capacity.

Capacity utilisation at Hardisty is routinely high. The apportionment mechanism on the Enbridge Mainline — where available capacity is rationed among shippers when demand exceeds supply — is a recurring feature of Alberta crude markets. When the Mainline is apportioned, shippers with uncommitted (spot) access are curtailed first.

The netback price model

The price a well operator in the Athabasca region receives for a barrel of oil is not the WTI price on the futures screen. It is that price, minus the cost of getting the oil there, minus an adjustment for the fact that Alberta crude is heavier and sourer than WTI and requires more refinery processing.

The netback price model expresses this:

Pwellhead = Pmarket − Ttransport − Aquality

Symbol Meaning Typical range
Pmarket Benchmark crude price at destination USD/bbl
Ttransport Pipeline tariff from Hardisty to destination USD/bbl
Aquality Quality adjustment (WCS discount to benchmark) USD/bbl — 10–25 historically
Pwellhead Netback value at Hardisty USD/bbl

Western Canadian Select (WCS) is the benchmark blend for Alberta heavy crude — a mix of oil sands bitumen and conventional heavy crude, approximately 20.5° API gravity and 3.5% sulphur. WTI is approximately 39.6° API and 0.24% sulphur. The quality differential reflects the additional processing costs U.S. Gulf Coast refineries incur to convert the heavier, higher-sulphur feedstock: more hydrogen, more energy, more catalyst. This differential has ranged from $10/bbl to over $40/bbl depending on market conditions and refinery capacity.

Calculating netback for each corridor at illustrative 2023 market conditions:

Destination Market price Tariff Quality adj Netback
Gulf Coast (Keystone) $70.00 $8.00 $14.00 $48.00
Gulf Coast (Mainline) $70.00 $5.00 $14.00 $51.00
Pacific (Burnaby / TMX) $74.00 $11.00 $10.00 $53.00
Ontario (Sarnia) $68.00 $4.50 $14.00 $49.50

At these illustrative values, the Trans Mountain route to Pacific markets offers the highest netback, driven by a combination of Pacific Basin market pricing (higher Pmarket) and a smaller quality discount (Asian refiners pay a lower penalty for heavy crude than U.S. Gulf refiners). The Mainline to Gulf Coast beats Keystone on netback because the lower tariff more than offsets any price difference at destination.

The route with the highest netback is economically preferred — but access is constrained by pipeline contracts. Long-term ship-or-pay agreements lock shippers into specific systems for years at a time. The expansion of Trans Mountain added a new row to the netback surface that was previously unavailable; producers with TMX access can now access the highest-netback market.

Reference implementation

import numpy as np

# ── Constants ──────────────────────────────────────────────────────────────
M3_TO_BBL   = 6.2898      # m³ → barrels
SEC_PER_DAY = 86_400      # seconds per day


def swamee_jain_friction(roughness_m: float, diameter_m: float,
                         reynolds: float) -> float:
    """
    Explicit approximation to the Colebrook-White equation.
    Returns the Darcy friction factor (dimensionless).

    Parameters
    ----------
    roughness_m  : pipe wall roughness (m) — commercial steel: 4.6e-5
    diameter_m   : internal pipe diameter (m)
    reynolds     : Reynolds number Re = ρvD/μ (dimensionless)

    Returns
    -------
    float : Darcy friction factor f_D
    """
    term = roughness_m / (3.7 * diameter_m) + 5.74 / reynolds**0.9
    return 0.25 / np.log10(term)**2


def darcy_weisbach_pressure_drop(f_D: float, length_m: float,
                                 diameter_m: float, density_kgm3: float,
                                 velocity_ms: float) -> float:
    """
    Pressure drop along a pipe segment (Darcy-Weisbach).

    Parameters
    ----------
    f_D         : Darcy friction factor (dimensionless)
    length_m    : pipe length (m)
    diameter_m  : internal diameter (m)
    density_kgm3: fluid density (kg/m³)
    velocity_ms : mean flow velocity (m/s)

    Returns
    -------
    float : pressure drop (Pa)
    """
    return f_D * (length_m / diameter_m) * (density_kgm3 * velocity_ms**2 / 2)


def flow_rate_bbl_per_day(diameter_m: float, velocity_ms: float) -> float:
    """Convert pipe velocity to volumetric flow rate in bbl/day."""
    area_m2   = np.pi * (diameter_m / 2)**2          # m²
    q_m3_s    = velocity_ms * area_m2                 # m³/s
    q_m3_day  = q_m3_s * SEC_PER_DAY                  # m³/day
    return q_m3_day * M3_TO_BBL                        # bbl/day


def netback_price(market_price_usd: float, transport_tariff_usd: float,
                  quality_adjustment_usd: float) -> float:
    """
    Wellhead netback value at Hardisty.

    Parameters
    ----------
    market_price_usd      : benchmark crude at destination (USD/bbl)
    transport_tariff_usd  : pipeline tariff Hardisty → destination (USD/bbl)
    quality_adjustment_usd: WCS-to-benchmark quality discount (USD/bbl, positive = discount)

    Returns
    -------
    float : netback price (USD/bbl)
    """
    return market_price_usd - transport_tariff_usd - quality_adjustment_usd


# ── Reference values — Enbridge Mainline, Line 3 segment ──────────────────
diameter_m    = 0.762           # 30 inches — representative Mainline diameter
roughness_m   = 4.6e-5          # commercial steel
density_kgm3  = 930.0           # dilbit (Western Canadian Select blend)
viscosity_pas = 0.005           # dilbit at 15°C, Pa·s
velocity_ms   = 2.0             # typical operating velocity

reynolds = density_kgm3 * velocity_ms * diameter_m / viscosity_pas
f_D      = swamee_jain_friction(roughness_m, diameter_m, reynolds)

length_km = 2_700              # Hardisty, AB to Superior, WI (approx)
delta_P   = darcy_weisbach_pressure_drop(f_D, length_km * 1000,
                                         diameter_m, density_kgm3, velocity_ms)

q_bbl_day = flow_rate_bbl_per_day(diameter_m, velocity_ms)

# Netback: WCS to Cushing via Keystone (590,000 bbl/day capacity)
wcs_market      = 70.00   # USD/bbl — illustrative
keystone_tariff = 8.00    # USD/bbl Hardisty → Cushing, approximate
quality_adj     = 14.00   # WCS-WTI differential, approximate 2023 average
nb_cushing      = netback_price(wcs_market, keystone_tariff, quality_adj)

print(f"Reynolds number          : {reynolds:,.0f}  ({'turbulent' if reynolds > 4000 else 'laminar'})")
print(f"Darcy friction factor    : {f_D:.4f}")
print(f"Pressure drop            : {delta_P / 1e6:.1f} MPa  ({delta_P * 0.000145:.0f} psi)")
print(f"Flow rate                : {q_bbl_day:,.0f} bbl/day")
print()
print(f"WCS market price (Cushing): ${wcs_market:.2f}/bbl")
print(f"Keystone tariff           : ${keystone_tariff:.2f}/bbl")
print(f"WCS quality discount      : ${quality_adj:.2f}/bbl")
print(f"Netback at Hardisty       : ${nb_cushing:.2f}/bbl")

Output:

Reynolds number          : 280,800  (turbulent)
Darcy friction factor    : 0.0141
Pressure drop            : 186.7 MPa  (27,077 psi)
Flow rate                : 164,699 bbl/day

WCS market price (Cushing): $70.00/bbl
Keystone tariff           : $8.00/bbl
WCS quality discount      : $14.00/bbl
Netback at Hardisty       : $48.00/bbl

The pressure drop figure — 187 MPa over 2,700 km — is why the Mainline requires approximately 50 pump stations between Hardisty and Superior. Each station restores roughly 3–5 MPa of operating pressure, and the stations are spaced at intervals set by the terrain profile and line-fill volume constraints.

Run it yourself

Change the pipe geometry, fluid properties, and economics below. Notice in particular what happens to pressure drop when velocity increases: the quadratic scaling (*Δ**P ∝ v*2) means that a 50% increase in throughput velocity nearly doubles the pressure requirement. Notice also how sensitive the netback is to the quality discount — a $5/bbl widening of the WCS-WTI differential has exactly the same effect as a $5/bbl tariff increase.

import numpy as np

# ── Parameters — change these and hit Run ──────────────────────────────────
diameter_in   = 30.0    # pipe diameter (inches) — Mainline: 30–36; Keystone: 36; TMX: 24
velocity_ms   = 2.0     # flow velocity (m/s) — typical range: 1.0–3.0
density_kgm3  = 930.0   # fluid density (kg/m³) — dilbit: 920–940; syncrude: 840–860
viscosity_pas = 0.005   # dynamic viscosity (Pa·s) — dilbit 15°C: 0.004–0.008

wcs_price     = 70.0    # WCS market price at destination (USD/bbl) — try: 55–90
tariff_usd    = 8.0     # pipeline tariff (USD/bbl) — Keystone≈8; Mainline≈5; TMX≈11
quality_disc  = 14.0    # WCS quality discount vs benchmark (USD/bbl) — try: 8–25

# ── Hydraulics ─────────────────────────────────────────────────────────────
diameter_m   = diameter_in * 0.0254          # inches → metres
roughness_m  = 4.6e-5                        # commercial steel pipe

reynolds     = density_kgm3 * velocity_ms * diameter_m / viscosity_pas
f_D          = 0.25 / np.log10(roughness_m / (3.7 * diameter_m) + 5.74 / reynolds**0.9)**2
dP_per_km    = f_D * (1000 / diameter_m) * (density_kgm3 * velocity_ms**2 / 2) / 1e6  # MPa/km

area_m2      = np.pi * (diameter_m / 2)**2
q_bbl_day    = velocity_ms * area_m2 * 86_400 * 6.2898

# ── Netback ────────────────────────────────────────────────────────────────
netback      = wcs_price - tariff_usd - quality_disc

# ── Output ─────────────────────────────────────────────────────────────────
print(f"Pipe diameter        : {diameter_in:.0f} in  ({diameter_m:.3f} m)")
print(f"Reynolds number      : {reynolds:,.0f}  ({'turbulent' if reynolds > 4000 else 'laminar/transitional'})")
print(f"Friction factor f_D  : {f_D:.4f}")
print(f"Pressure drop        : {dP_per_km:.3f} MPa/km  ({dP_per_km * 145.04:.1f} psi/km)")
print(f"Flow rate            : {q_bbl_day:,.0f} bbl/day")
print()
print(f"Market price         : ${wcs_price:.2f}/bbl")
print(f"Transport tariff     : ${tariff_usd:.2f}/bbl")
print(f"Quality discount     : ${quality_disc:.2f}/bbl")
print(f"Netback at Hardisty  : ${netback:.2f}/bbl")

Where next?

Crude oil moves as a dense, near-incompressible liquid — Darcy-Weisbach is the appropriate physics, and the netback model converts hydraulic capacity into economic value. NGL and condensate present a more complex picture: mixed-phase products requiring separation before they can move at all, with their own economics tied directly to the bitumen supply chain as diluent.

Cluster P — Pipeline Connectivity · Essay 1 of 5 · Difficulty: 2