Inside the RAF: Bucket hats, bonuses and billions in debt while victims wait for payouts
Inside the RAF: Bucket hats, bonuses and billions in debt while victims wait for payouts



The Road Accident Fund (RAF) pulls in more than R48 billion from the fuel levy annually, but thousands of road crash victims are still waiting for their payouts.

The fund’s finances are in serious trouble. It now reportedly owes more than R518 billion, while holding assets worth only R33 billion.

According to parliamentary records, the RAF allocated around R1 billion for communications and advertising over about two years, with around R650 million spent through two media companies, MediaMix360 and Dzinge Productions. It also spent R231 million on staff bonuses and R1.8 million on executive protection.

However, this is not all. The Standing Committee on Public Accounts (SCOPA) members were also left scratching their heads after hearing that the fund, which is meant to assist victims of road accidents, reportedly spent R48,300 on a single bucket hat from Dzinge Productions.

Spokesperson McIntosh Polela maintained that although the invoice indicated a quantity of one hat, it actually represented multiple units.

Other questionable expenses included golf shirts at R8,180 each, podcasts costing R110,313 per episode, and thousands of branded water bottles at R85 each.

According to the AGSA, the RAF identified more than R95 million in irregular, wasteful, and fruitless expenditure that could have been available for legitimate RAF purposes, including paying claims to road accident victims. This includes

<!–
This single file contains the complete, self-contained web component.
1. The block defines the custom element.
2. The tag shows how to use the component.
3. The content INSIDE the tag is the static fallback
that renders if JavaScript is disabled or fails to load.
–>

// — DATA & CONFIGURATION —
// All data is hard-coded here for easy editing.

const RAF_DATA = [

category: “Funding”,
title: “R48 billion”,
description: “Annual income from the national fuel levy.”,
details: “This R48bn comes directly from the fuel levy, meant to compensate accident victims, but the fund is operationally insolvent.”
,

category: “Debt Crisis”,
title: “R518 billion”,
description: “Total liabilities owed by the RAF.”,
details: “The fund’s liabilities (what it owes in claims) have ballooned to R518bn, making it one of the state’s biggest financial risks.”
,

category: “Debt Crisis”,
title: “R33 billion”,
description: “Value of RAF assets — far below its debt.”,
details: “With only R33bn in assets, the fund’s debt-to-asset ratio is catastrophic, leaving a R485bn shortfall.”
,

category: “Irregular Spend”,
title: “R1 billion”,
description: “Allocated for communications and PR in two years.”,
details: “A staggering R1 billion was earmarked for ‘communications’ over just two years, a budget larger than many national departments.”
,

category: “Irregular Spend”,
title: “R650 million”,
description: “Paid to MediaMix360 and Dzinge Productions.”,
details: “These two PR firms were awarded massive contracts, which are now under SIU investigation for procurement irregularities.”
,

category: “Governance”,
title: “R231 million”,
description: “Paid to staff despite audit failures.”,
details: “Despite failing to meet 80% of its performance targets and receiving a qualified audit, staff were paid R231m in bonuses.”
,

category: “Irregular Spend”,
title: “R1.8 million”,
description: “VIP security for executives.”,
details: “R1.8 million was spent on VIP ‘close protection services’ for executives, a cost deemed irregular by auditors.”
,

category: “Irregular Spend”,
title: “R48,300”,
description: “Allegedly paid for a single branded hat.”,
details: “This single bucket hat was part of R1.1m in irregular ‘brand equity’ spending, including R8,180 golf shirts.”
,

category: “Irregular Spend”,
title: “R8,180 each”,
description: “Part of questionable branding spend.”,
details: “These luxury golf shirts were flagged by AGSA as part of a pattern of fruitless and wasteful expenditure on branding.”
,

category: “Irregular Spend”,
title: “R110,313 each”,
description: “Branded podcast episodes under scrutiny.”,
details: “The RAF spent R1.3m on 12 podcast episodes, a cost of R110k per episode, with little evidence of value.”
,

category: “Oversight”,
title: “R95 million+”,
description: “Identified by AGSA in 2024/25 as irregular, fruitless, or wasteful.”,
details: “The Auditor-General (AGSA) flagged over R95m in irregular, fruitless, and wasteful spending in the 2024/25 report alone.”
,

category: “Governance”,
title: “R6.4 million”,
description: “Overpayments and duplicate payouts.”,
details: “The SIU is investigating R6.4m in duplicate payments to service providers, highlighting severe gaps in payment controls.”
,

category: “Victims”,
title: “74% drop in claims”,
description: “From 303,695 in 2019/20 to 79,377 in 2024.”,
details: “A new ‘Full Verification’ policy has seen new claims plummet, not due to safer roads, but by making it harder for victims to claim.”
,

category: “Victims”,
title: “82% decline”,
description: “Personal claims collapse from 102,086 in 2020 to 18,286 in 2024.”,
details: “Personal claims from victims have collapsed, suggesting the new system is failing the very people it’s meant to protect.”
,

category: “Oversight”,
title: ““Weak boards, compliant members””,
description: “Wayne Duvenage (OUTA) criticises lack of accountability.”,
details: “OUTA’s Wayne Duvenage told Parliament that compliant boards fail to hold executives accountable for systemic failures.”
,

category: “Oversight”,
title: “SIU Investigation”,
description: “Probing duplicate payments, procurement and non-cooperation.”,
details: “The Special Investigating Unit (SIU) is probing multiple contracts, duplicate payments, and alleged non-cooperation from RAF leadership.”

];

// — CATEGORY STYLING —
// Maps category keys to display labels and accent colors.
const CATEGORY_STYLES =
“Funding”: label: “Funding”, color: “#6c757d” , // Grey
“Debt Crisis”: label: “Debt Crisis”, color: “#e63946” , // Red
“Irregular Spend”: label: “Irregular Spend”, color: “#e63946” , // Red
“Governance”: label: “Governance”, color: “#f4a261” , // Amber
“Oversight”: label: “Oversight Failure”, color: “#f4a261” , // Amber
“Victims”: label: “Victim Impact”, color: “#8d99ae” // Muted Blue/Grey
;

/**
* RAFFinancials
* A self-contained web component to display an interactive infographic
* about the Road Accident Fund’s financial situation.
*
* @element raf-financials
*/
class RAFFinancials extends HTMLElement {
constructor()
super();
// Attach a shadow DOM tree to the instance.
this.attachShadow( mode: ‘open’ );
this.observer = null;
this.currentFilter=”all”;

connectedCallback()
// Clear any static fallback content
this.innerHTML = ”;

// Render the component’s structure into the shadow DOM
this.shadowRoot.innerHTML = `
$this.getStyles()
$this.getTemplate()
`;

// Store references to key elements
this.grid = this.shadowRoot.querySelector(‘.card-grid’);
this.filterLegend = this.shadowRoot.querySelector(‘.filter-legend’);

// Initial render of cards
this.renderCards();

// Set up interactivity
this.setupEventListeners();
this.setupIntersectionObserver();

/**
* Defines all CSS styles encapsulated within the shadow DOM.
* @returns string A string of CSS rules.
*/
getStyles()
return `
:host
/* Scope + theming */
–raf-bg: #1a1a1a;
–raf-surface: #2b2b2b;
–raf-text: #f5f5f5;
–raf-text-muted: #cccccc;
–raf-rule: #333;
–raf-rule-strong: #444;
–raf-chip: #333;
–raf-chip-border: #555;
–raf-shadow: 0 4px 12px rgba(0,0,0,0.3);

/* Category accents (can be overridden by inline styles from JS) */
–raf-funding: #6c757d;
–raf-red: #e63946;
–raf-amber: #f4a261;
–raf-mutedblue: #8d99ae;

display: block;
width: 100%;
color-scheme: dark;
contain: content;
font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;

/* Optional light theme hook: */
:host([data-theme=”light”])
–raf-bg: #ffffff;
–raf-surface: #f7f7f8;
–raf-text: #111111;
–raf-text-muted: #444;
–raf-rule: #e6e6e6;
–raf-rule-strong: #d9d9d9;
–raf-chip: #f1f1f3;
–raf-chip-border: #d4d4d8;
color-scheme: light;

/* Prefer-reduced-motion: gentler transitions */
@media (prefers-reduced-motion: reduce)
* animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important;

/* Wrapper */
.infographic-wrapper
background-color: var(–raf-bg);
color: var(–raf-text);
padding: 1.5rem 1rem;
border-radius: 8px;
overflow: hidden;

@media (min-width: 640px)
.infographic-wrapper padding: 2rem 1.5rem;

/* Header */
.header
border-bottom: 1px solid var(–raf-rule-strong);
padding-bottom: 1.25rem;
margin-bottom: 1.5rem;

.title
font-size: 1.75rem;
font-weight: 800;
line-height: 1.2;
margin: 0 0 0.5rem 0;
color: var(–raf-text);

.dek
font-size: 1rem;
line-height: 1.5;
margin: 0;
color: var(–raf-text-muted);
max-width: 70ch;

@media (min-width: 640px)
.title font-size: 2.25rem;
.dek font-size: 1.125rem;

/* Filter legend */
.filter-legend
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(–raf-rule);

.filter-tag
font: inherit;
font-size: 0.75rem;
font-weight: 700;
background-color: var(–raf-chip);
color: var(–raf-text);
border: 1px solid var(–raf-chip-border);
padding: 0.35rem 0.75rem;
border-radius: 999px;
cursor: pointer;
text-transform: uppercase;
letter-spacing: 0.5px;
transition: background-color .2s ease, border-color .2s ease, transform .1s ease, color .2s ease;

.filter-tag:hover
background-color: color-mix(in oklab, var(–raf-chip), var(–raf-text) 10%);
border-color: color-mix(in oklab, var(–raf-chip-border), var(–raf-text) 20%);

.filter-tag:active transform: scale(0.96);
.filter-tag[aria-pressed=”true”]
background-color: var(–raf-text);
color: var(–raf-bg);
border-color: var(–raf-text);

/* Active-state colour accents per category */
.filter-tag[data-filter=”Debt Crisis”][aria-pressed=”true”],
.filter-tag[data-filter=”Irregular Spend”][aria-pressed=”true”]
background-color: var(–raf-red);
border-color: var(–raf-red);
color: #fff;

.filter-tag[data-filter=”Governance”][aria-pressed=”true”],
.filter-tag[data-filter=”Oversight”][aria-pressed=”true”]
background-color: var(–raf-amber);
border-color: var(–raf-amber);
color: #1a1a1a;

.filter-tag[data-filter=”Victims”][aria-pressed=”true”]
background-color: var(–raf-mutedblue);
border-color: var(–raf-mutedblue);
color: #fff;

/* Grid */
.card-grid
display: grid;
grid-template-columns: 1fr;
gap: 1rem;

@media (min-width: 600px)
.card-grid grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));

@media (min-width: 1024px)
.card-grid grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));

/* Card */
.card
background-color: var(–raf-surface);
border-radius: 6px;
border: 1px solid var(–raf-rule-strong);
border-left-width: 4px; /* set by JS via style.borderLeftColor */
padding: 1rem;
cursor: pointer;

/* Entrance animation */
opacity: 0;
transform: translateY(20px);

/* Keep timing unified */
transition:
opacity .4s ease-out,
transform .4s ease-out,
background-color .2s ease,
box-shadow .2s ease;

.card.is-visible
opacity: 1;
transform: translateY(0);

.card:hover
background-color: color-mix(in oklab, var(–raf-surface), #000 10%);
box-shadow: var(–raf-shadow);

.card-header
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 0.5rem;

.card-content flex: 1 1 auto;

.card-category
font-size: 0.75rem;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 0.5rem;
/* colour injected inline from JS */

.card-title
font-size: 1.5rem;
font-weight: 800;
line-height: 1.2;
margin: 0 0 0.5rem 0;
color: var(–raf-text);

.card[data-category=”Debt Crisis”] .card-title,
.card[data-category=”Irregular Spend”] .card-title
color: #ff6b6b;

.card-description
font-size: 0.9rem;
line-height: 1.5;
color: var(–raf-text-muted);
margin: 0;

/* Toggle icon */
.card-toggle-icon
flex: 0 0 auto;
width: 24px;
height: 24px;
stroke: #999;
transition: transform .3s ease, stroke .2s ease;

.card[aria-expanded=”true”] .card-toggle-icon
transform: rotate(45deg);
stroke: var(–raf-text);

/* Details disclosure */
.card-details-wrapper
max-height: 0;
overflow: hidden;
transition: max-height .3s ease-in-out;

.card-details
font-size: 0.9rem;
line-height: 1.5;
color: color-mix(in oklab, var(–raf-text), #fff 10%);
background-color: color-mix(in oklab, var(–raf-bg), #000 20%);
border-radius: 4px;
padding: 0.75rem 1rem;
margin-top: 1rem;
border-top: 1px solid var(–raf-rule-strong);

.card[aria-expanded=”true”] .card-details-wrapper max-height: 300px;

/* Footer */
.footer-credit
font-size: 0.75rem;
color: #888;
margin-top: 1.5rem;
padding-top: 1rem;
border-top: 1px solid var(–raf-rule);
text-align: left;

`;

/**
* Defines the component’s HTML structure.
* @returns string An HTML template string.
*/
getTemplate()
// Generate filter buttons from the CATEGORY_STYLES object
const filters = Object.keys(CATEGORY_STYLES);
const filterButtons = filters.map(key =>
const label = CATEGORY_STYLES[key];
return ``;
).join(”);

return `

Inside the RAF: Billions In, Nothing Out

How South Africa’s Road Accident Fund pulls in R48 billion a year — yet crash victims still wait for justice.

Source: AGSA, SCOPA hearings, SIU reports, 2023/24 RAF Annual Report.

`;

/**
* Renders the data cards into the grid, applying the current filter.
*/
renderCards()
// Clear existing cards
this.grid.innerHTML = ”;

const fragment = document.createDocumentFragment();
let hasVisibleCards = false;

RAF_DATA.forEach((item, index) => label: item.category, color: ‘#666’ ;

const cardEl = document.createElement(‘div’);
cardEl.className=”card”;
cardEl.setAttribute(‘data-category’, item.category);
cardEl.setAttribute(‘role’, ‘button’);
cardEl.setAttribute(‘tabindex’, ‘0’);
cardEl.setAttribute(‘aria-expanded’, ‘false’);
cardEl.setAttribute(‘aria-controls’, `details-$index`);
cardEl.style.borderLeftColor = color;

// Apply filter
if (this.currentFilter !== ‘all’ && this.currentFilter !== item.category)
cardEl.style.display = ‘none’;
else
hasVisibleCards = true;

cardEl.innerHTML = `

$label

$item.title

$item.description

`;
fragment.appendChild(cardEl);
);

this.grid.appendChild(fragment);

// If no cards are visible, show a message (optional)
if (!hasVisibleCards)
this.grid.innerHTML = `

No items match this category.

`;

// Re-observe cards if filter changed
this.setupIntersectionObserver();

/**
* Sets up event listeners for card clicks (delegated) and filters.
*/
setupEventListeners()
// Use event delegation for card clicks
this.grid.addEventListener(‘click’, this.handleCardClick.bind(this));
this.grid.addEventListener(‘keydown’, (e) =>
if (e.key === ‘Enter’ );

// Use event delegation for filter clicks
this.filterLegend.addEventListener(‘click’, this.handleFilterClick.bind(this));

/**
* Handles a click event on the card grid.
* @param Event e – The click event.
*/
handleCardClick(e)
const card = e.target.closest(‘.card’);
if (card)
this.toggleCard(card);

/**
* Handles a click event on the filter legend.
* @param Event e – The click event.
*/
handleFilterClick(e)
const button = e.target.closest(‘.filter-tag’);
if (button)
const filter = button.dataset.filter;

// Update active state
this.shadowRoot.querySelectorAll(‘.filter-tag’).forEach(btn =>
const isPressed = btn.dataset.filter === filter;
btn.setAttribute(‘aria-pressed’, isPressed);
btn.setAttribute(‘aria-checked’, isPressed);
);

// Set filter and re-render
this.currentFilter = filter;
this.renderCards();

/**
* Toggles the expanded/collapsed state of a card.
* @param HTMLElement cardEl – The card element to toggle.
*/
toggleCard(cardEl)
const isExpanded = cardEl.getAttribute(‘aria-expanded’) === ‘true’;
const detailsWrapper = cardEl.querySelector(‘.card-details-wrapper’);

cardEl.setAttribute(‘aria-expanded’, !isExpanded);
detailsWrapper.setAttribute(‘aria-hidden’, isExpanded);

/**
* Sets up the Intersection Observer to animate cards as they enter the viewport.
*/
setupIntersectionObserver()
// Disconnect previous observer if it exists
if (this.observer)
this.observer.disconnect();

const options =
root: null, // relative to the viewport
rootMargin: ‘0px’,
threshold: 0.1 // 10% of the item is visible
;

this.observer = new IntersectionObserver((entries, observer) =>
entries.forEach(entry =>
if (entry.isIntersecting)
entry.target.classList.add(‘is-visible’);
// Stop observing the element once it’s visible
observer.unobserve(entry.target);

);
, options);

// Observe all cards present in the shadow DOM
this.shadowRoot.querySelectorAll(‘.card’).forEach(card =>
this.observer.observe(card);
);

}

// Define the new custom element
if (‘customElements’ in window)
window.customElements.define(‘raf-financials’, RAFFinancials);

Inside the RAF: Billions In, Nothing Out

How South Africa’s Road Accident Fund pulls in R48 billion a year — yet crash victims still wait for justice.

(Enable JavaScript to view the full interactive infographic.)

  • R48 billion: Annual income from the national fuel levy.
  • R518 billion: Total liabilities owed by the RAF.
  • R1 billion: Allocated for communications and PR in two years.
  • R231 million: Paid to staff despite audit failures.
  • 74% drop in claims: From 303,695 in 2019/20 to 79,377 in 2024.

Source: AGSA, SCOPA hearings, SIU reports, 2023/24 RAF Annual Report.

  • R6.4 million in overpayments and duplicate payments
  • R36 million in irregular procurement expenditure identified in 2024/25
  • .R52.7 million in prior-year irregular expenditure that was not timeously assessed in line with the PFMA compliance and reporting framework

On the irregular expenditure, the AGSA said, “The full extent of irregular expenditure could not be determined as management has not assessed the population to identify similar instances.”

All this, as thousands of victims are left in limbo. The RAF’s 2023/24 annual report shows a dramatic drop in claims. The number of claims registered fell from 303,695 in 2019/20 to 79,377 in 2024, a decline of almost 74%. Personal claims, representing injured road users, dropped even more sharply, from 102,086 in 2020 to 18,286 in 2024, down 82%.

Wayne Duvenage, CEO of OUTA, says that the problem is systemic ” We see too many instances of disregard for state funds, from board member fees, excessive number of meetings, unnecessary and/or overpriced travel tips, unnecessary supplier contracts, over-priced tenders, excessive staff numbers, undeserved bonuses and general spending trends that are not contained”. 

He added that weak boards and compliant members often fail to challenge CEOs or CFOs, allowing billions to be spent irregularly, a direct breach of the Public Finance Management Act (PFMA), which requires state institutions to manage funds responsibly.

“The fact that CEOs of state entities are being re-appointed for extended terms, despite repeated AGSA qualified audits and other corruption issues highlighted by civil society, says a lot about the weakness of state entity boards”.

The Auditor-General also identified material irregularities caused by weak internal controls, including unauthorised banking changes and inadequate verification systems, resulting in millions in financial loss.

“The recurrence of these errors indicates that preventative controls within the claims processing and payment systems are not functioning effectively. If these control weaknesses are not addressed, there is a high risk of continued financial losses through future incorrect, duplicate, or excessive payments”.

Duvenage warned that this systemic mismanagement has real consequences for ordinary South Africans.

“We have seen how people involved in road accidents are unable to receive their rightful benefits, not only because RAF doesn’t conduct their affairs properly, but also because their systems are weak, allowing for the abuse of their processes”.

He further called on the government to strengthen oversight, ensure independent and competent boards, and hold leadership accountable for financial mismanagement.

The Special Investigating Unit (SIU) has also revealed it has launched an ongoing investigation into the RAF, focusing on duplicate payments, irregular procurement, and financial mismanagement.

“The investigation focuses on the losses incurred by the State caused by duplicate payments made to several firms of Attorneys as at 01 March 2021, which also includes unlawful acts of appropriation.”

The SIU also raised concerns about non-cooperation from RAF officials.

“The investigation team has experienced several delays and non-cooperation from the RAF in that: the information requested is provided mostly out of the period stipulated; some of the requests to date have not been responded to; there were instances where the SIU had to resort into opening a criminal case against the RAF executive for failure to adhere to a lawful subpoena issued by the SIU in terms of the SIU Act.”

IOL Business

mthobisi.nozulela@iol.co.za

Get your news on the go. Download the latest IOL App for Android and IOS no



Source link

Leave comment

Your email address will not be published. Required fields are marked with *.