The 2003–04 Heineken Cup was the ninth season for which European teams competed for the Heineken Cup. Competing teams, from England, France, Ireland, Italy, Scotland and Wales, were divided into six pools of four, in which teams played home and away matches against each other. The winners of the pools, together with the two best runners-up, qualified for the knock-out stage.
This was the first competition in the series to employ the bonus point system for classifying teams. In prior competitions, teams earned two points for a win and one for a draw. Starting with the 2003–04 competition, teams earned points in the pool matches under the following scenarios:
- Four points for a win
- Two points for a draw
- One bonus point for scoring four or more tries, regardless of the final score
- One bonus point for losing by seven points or less
Teams
{| class="wikitable" width=100%
|-
!France
!England
!Wales
!Ireland
!Scotland
!Italy
|- valign=top
|
- Stade Français
- Toulouse
- Biarritz Olympique
- Agen
- Bourgoin
- Perpignan
|
- Leicester Tigers
- Leeds Carnegie
- Sale Sharks
- Northampton Saints
- Gloucester
- London Wasps
|
- Newport Gwent Dragons
- Neath-Swansea Ospreys
- Cardiff Blues
- Llanelli Scarlets
- Celtic Warriors
|
- Ulster
- Munster
- Leinster
|
- Border Reivers
- Edinburgh
|
- Benetton Treviso
- Calvisano
|}
Pool stage
Pool 1
{| class="wikitable" style="text-align: center;"
|-
!width="200"|Team
!width="20"|P
!width="20"|W
!width="20"|D
!width="20"|L
!width="20"|Tries for
!width="20"|Tries against
!width="20"|Try diff
!width="20"|Points for
!width="20"|Points against
!width="25"|Points diff
!width="20"|TB
!width="20"|LB
!width="20"|Pts
|- bgcolor="#ccffcc"
|align=left| Stade Français
|6||4||0||2||11||8||3||134||80||54||1||1||18
|-
|align=left| Leicester Tigers
|6||3||0||3||17||10||7||137||115||22||3||0||15
|-
|align=left| Ulster
|6||3||0||3||10||9||1||109||106||3||1||1||14
|-
|align=left| Newport Gwent Dragons
|6||2||0||4||5||16||−11||67||146||−79||0||1||9
|}
Pool 2
{| class="wikitable" style="text-align: center;"
|-
!width="200"|Team
!width="20"|P
!width="20"|W
!width="20"|D
!width="20"|L
!width="20"|Tries for
!width="20"|Tries against
!width="20"|Try diff
!width="20"|Points for
!width="20"|Points against
!width="25"|Points diff
!width="20"|TB
!width="20"|LB
!width="20"|Pts
|- bgcolor="#ccffcc"
|align=left| Toulouse
|6||5||0||1||18||7||11||157||65||92||4||1|||25
|- bgcolor="#ccffcc"
|align=left| Edinburgh
|6||5||0||1||14||7||7||130||89||41||2||0||22
|-
|align=left| Leeds Tykes
|6||1||0||5||5||11||−6||66||122||−56||0||1||5
|-
|align=left| Neath-Swansea Ospreys
|6||1||0||5||6||18||−12||78||155||−77||0||0||4
|}
Pool 3
{| class="wikitable" style="text-align: center;"
|-
!width="200"|Team
!width="20"|P
!width="20"|W
!width="20"|D
!width="20"|L
!width="20"|Tries for
!width="20"|Tries against
!width="20"|Try diff
!width="20"|Points for
!width="20"|Points against
!width="25"|Points diff
!width="20"|TB
!width="20"|LB
!width="20"|Pts
|- bgcolor="#ccffcc"
|align=left| Biarritz Olympique
|6||4||0||2||18||12||6||139||97||42||3||1||20
|-
|align=left| Leinster
|6||4||0||2||13||11||2||142||113||29||1||1||18
|-
|align=left| Cardiff Blues
|6||2||0||4||13||13||0||123||132||−9||0||3||11
|-
|align=left| Sale Sharks
|6||2||0||4||6||14||−8||75||137||−62||0||1||9
|}
Pool 4
{| class="wikitable" style="text-align: center;"
|-
!width="200"|Team
!width="20"|P
!width="20"|W
!width="20"|D
!width="20"|L
!width="20"|Tries for
!width="20"|Tries against
!width="20"|Try diff
!width="20"|Points for
!width="20"|Points against
!width="25"|Points diff
!width="20"|TB
!width="20"|LB
!width="20"|Pts
|- bgcolor="#ccffcc"
|align=left| Llanelli Scarlets
|6||5||0||1||17||5||12||160||72||88||2||1||23
|-
|align=left| Northampton Saints
|6||4||0||2||13||4||9||121||54||67||1||1||18
|-
|align=left| Agen
|6||2||0||4||8||7||1||83||94||−11||1||2||11
|-
|align=left| The Borders
|6||1||0||5||4||26||−22||39||183||−144||0||0||4
|}
Pool 5
{| class="wikitable" style="text-align: center;"
|-
!width="200"|Team
!width="20"|P
!width="20"|W
!width="20"|D
!width="20"|L
!width="20"|Tries for
!width="20"|Tries against
!width="20"|Try diff
!width="20"|Points for
!width="20"|Points against
!width="25"|Points diff
!width="20"|TB
!width="20"|LB
!width="20"|Pts
|- bgcolor="#ccffcc"
|align=left| Munster Rugby
|6||5||0||1||22||5||17||172||76||96||4||0||24
|- bgcolor="#ccffcc"
|align=left| Gloucester
|6||5||0||1||22||11||11||197||100||97||4||0||24
|-
|align=left| Bourgoin
|6||1||0||5||13||22||−9||119||191||−72||2||1||7
|-
|align=left| Benetton Treviso
|6||1||0||5||13||32||−19||104||225||−121||1||0||5
|}
Pool 6
{| class="wikitable" style="text-align: center;"
|-
!width="200"|Team
!width="20"|P
!width="20"|W
!width="20"|D
!width="20"|L
!width="20"|Tries for
!width="20"|Tries against
!width="20"|Try diff
!width="20"|Points for
!width="20"|Points against
!width="25"|Points diff
!width="20"|TB
!width="20"|LB
!width="20"|Pts
|- bgcolor="#ccffcc"
|align=left| London Wasps
|6||5||0||1||22||8||14||186||85||101||3||1||24
|-
|align=left| Celtic Warriors
|6||4||0||2||11||10||1||123||118||5||2||2||20
|-
|align=left| Perpignan
|6||3||0||3||13||11||2||119||115||4||2||1||15
|-
|align=left| Ghial Rugby Calvisano
|6||0||0||6||13||30||−17||115||225||−110||1||2||3
|}
Seeding and runners-up
{| class="wikitable" style="text-align: center;"
|-
!Seed
!Pool Winners
!Pts
!TF
!+/-
|-
|1
|align=left| Toulouse
|25||18||+92
|-
|2
|align=left| London Wasps
|24||22||+101
|-
|3
|align=left| Munster
|24||22||+97
|-
|4
|align=left| Llanelli Scarlets
|23||17||+88
|-
|5
|align=left| Biarritz Olympique
|20||18||+42
|-
|6
|align=left| Stade Français
|18||11||+54
|-
!Seed
!Pool Runners-up
!Pts
!TF
!+/-
|-
|7
|align=left| Gloucester
|24||22||+96
|-
|8
|align=left| Edinburgh
|22||14||+41
|-
| –
|align=left| Celtic Warriors
|20||11||+5
|-
| –
|align=left| Northampton Saints
|18||13||+67
|-
| –
|align=left| Leinster
|18||13||+29
|-
| –
|align=left| Leicester Tigers
|15||17||+22
|}
Knockout stage
Quarter-finals
----
----
----
Semi-finals
----
