Revealed: Sports Ministry’s shocking over Sh1 Billion expenditure on AFCON consultancy
Revealed: Sports Ministry’s shocking over Sh1 Billion expenditure on AFCON consultancy
Read this story aloud
Listen to the clean text version of this article
Ready
4 min listen
Audio reading is not supported on this browser.
The Ministry of Sports is facing a storm of criticism after revelations that it allocated over Ksh1 billion to consultancy services for the 2027 Africa Cup of Nations (AFCON). Despite the substantial spending, little progress has been seen on the ground, raising concerns among MPs and the public about the efficiency of the ministry’s budget
The Ministry of Sports is facing widespread public criticism after it emerged that it spent Sh1 billion on consultancy services tied to the 2027 Africa Cup of Nations (AFCON), which Kenya will co-host with Uganda and Tanzania, People Daily reports.
Documents tabled in Parliament by Sports Principal Secretary Peter Tum reveal that a large portion of the ministry’s budget was channeled towards feasibility studies and consultancy work related to sports infrastructure development. However, despite this significant allocation, there is little visible progress on the ground.
The financial breakdown shows Ksh1 billion was set aside for stadium consultancy related to AFCON, while an additional Sh352 million was spent on regional consultancy services. On top of that, Sh1.5 billion was used for feasibility studies and topographical surveys to support the establishment of sports academies across Kenyan constituencies.
More To Read
- From Pipeline to MLS history: How Lawrence Olum became Kenya’s quiet football pioneer
- How the new Ngong Road flyover is fueling growth at Dagoretti Corner
- How climate change is threatening grassroots football in Kenya ahead of AFCON 2027
- Government doubles sports funding to Sh25.2 billion in 2026/27 budget ahead of AFCON showpiece
- Harambee Stars to face Lesotho in revised June friendlies schedule
- Kenya’s AFCON readiness in question amid Sh11 billion stadium funding shortfall
Despite these substantial outlays, tangible results are lacking, especially regarding the promised stadiums and sports facilities. Members of Parliament expressed their concerns over the Sh3.1 billion used for renovating the Moi International Sports Centre in Nairobi and over Sh1.7 billion spent on the Kenya Academy of Sports (KAS) project at Kasarani, which included building hostels and an access gate.
In defense of the expenditure, Tum stated that consultants from the University of Nairobi had been engaged for various projects, but admitted that some contracts had already been terminated as part of a new direction for the ministry. “The ministry has terminated contracts with several consultancy firms in our restructuring efforts,” Tum informed the Parliamentary Sports and Culture Committee, which is chaired by Webuye West MP Dan Wanyama.
The committee, led by Wanyama, questioned the ministry’s justification for such massive spending on consultants when physical progress remains minimal. Yatta MP Basil Ngui raised concerns about the use of expensive external consultants instead of relying on government experts from the Public Works Department. “How does the ministry justify over a billion shillings on consultants for projects such as Talanta Stadium and the sports academies?” Ngui asked.
Latest Stories
- Nairobi among 35 counties to receive rains this week, weatherman says
- Belgium knocks US out of World Cup after Balogun controversy
- KUCCPS set to release university placement results for over 980,000 Form Four leavers
- Saba Saba: Police block key roads as commuters face heavy traffic delays in Nairobi
Wanyama, pressing for quicker action on the delayed projects, highlighted that the youth, particularly from Generation Z, are looking to sports as a means to unlock future opportunities. “The youth are depending on you—make sure these projects are completed to empower them,” Wanyama urged.
Earlier this year, the ministry had indicated that the construction of Talanta Sports City and the renovations at Kasarani Stadium were progressing well, but these claims have now been thrown into doubt. Tum’s presentation also detailed the allocation of Sh115.2 million for automating the sports registrar’s office and Sh20 million for Malinya Stadium in Kakamega County, a venue known for hosting local bullfighting events.
Other Topics To Read
Top Stories Today
- Saba Saba: Police block key roads as commuters face heavy traffic delays in Nairobi
- Nairobi among 35 counties to receive rains this week, weatherman says
- Live update: Police mount roadblocks ahead of Saba Saba protests
- KUCCPS set to release university placement results for over 980,000 Form Four leavers
- Presidential candidates to spend only upto Sh4.43 billion on campaigns in draft IEBC rules
- From AI to ‘killer robots’: UN chief issues urgent governance call
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
KUCCPS set to release university placement results for over 980,000 Form Four leaversEducation
|Lucy Mumbi
|30 minutes ago
Saba Saba: Police block key roads as commuters face heavy traffic delays in NairobiNews
|Lucy Mumbi
|49 minutes ago
Live update: Police mount roadblocks ahead of Saba Saba protestsNational
|Eastleigh Voice Reporter
|1 hour ago
Belgium knocks US out of World Cup after Balogun controversyNews
|DW News
|22 minutes ago
Mombasa tuk-tuk operators issue seven-day ultimatum over new traffic penaltiesCoast
|Farhiya Hussein
|2 hours ago
CS Duale, Attorney General Oduor face contempt case over failure to implement KNDI court orderNews
|Carolyne Kubwa
|14 hours ago
Kenyans urged to join Saba Saba march to honour victims of alleged abductions, killingsNews
|Lucy Mumbi
|1 day ago
Peace team sounds alarm over gang attacks on worship centres and peaceful gatheringsNational
|Abdirahman Khalif
|12 hours ago
From AI to ‘killer robots’: UN chief issues urgent governance callTechnology
|UN News
|2 hours ago
Burkina Faso tightens grip on NGOs with new ban on exploitative humanitarian imagesAfrica
|Rachael Mutabasi
|1 day ago
