NEW: The 2026 Happy Planet Index is live

Explore the data

South Africa

2026 HPI index for South Africa
Rank Life expectancy Wellbeing Ecological footprint HPI score
122nd 66.5 years 4.6/10 2.56 gha 39.4
HPI Data over time for South Africa
Year Rank Life expectancy Wellbeing Ecological footprint HPI score
2025 122nd 66.5 years 4.6/10 2.56 gha 39.4
2024 107th 66.3 years 5.2/10 2.59 gha 42.3
2023 105th 66.1 years 5.2/10 2.7 gha 42.1
2022 100th 65.5 years 5.4/10 2.72 gha 42.4
2021 105th 62 years 5.6/10 3 gha 39.7
2020 105th 65.2 years 4.9/10 2.91 gha 39.1
2019 124th 66.1 years 5/10 3.1 gha 39.5
2018 134th 65.7 years 4.9/10 3.12 gha 38.5
2017 136th 65.4 years 4.5/10 3.19 gha 36.3
2016 126th 64.7 years 4.8/10 3.02 gha 37.7
2015 128th 64.1 years 4.9/10 3.08 gha 37.7
2014 133rd 63.2 years 4.8/10 3.42 gha 35.7
2013 139th 62.4 years 3.7/10 3.37 gha 29.9
2012 130th 61.7 years 5.1/10 3.54 gha 35.8
2011 132nd 60.6 years 4.9/10 3.4 gha 34.7
2010 128th 58.9 years 4.7/10 3.57 gha 31.8
2009 122nd 57.4 years 5.2/10 3.54 gha 33.4
2008 115th 56 years 5.3/10 3.8 gha 32.2
2007 112th 54.9 years 5.2/10 3.63 gha 31.5
2006 79th 54.2 years 5.1/10 3.53 gha 30.9
HPI Data in 2026 by Income groups South Africa
Decile Price range Life expectancy Wellbeing Ecological footprint HPI score
1 Less than $771 USD
(Less than 5,068 rands)
62.3 years 3.4/10 2.5 gha 22.2
2 $771 to $2,274 USD
(5,068 to 14,951 rands)
62.1 years 4.3/10 2.7 gha 27.8
3 $2,274 to $3,173 USD
(14,951 to 20,861 rands)
61.8 years 4.7/10 3.2 gha 29.5
4 $3,173 to $4,266 USD
(20,861 to 28,048 rands)
61.8 years 5/10 3.6 gha 30.5
5 $4,266 to $13,593 USD
(28,048 to 37,886 rands)
62.2 years 5.2/10 4 gha 31.5
6 $13,593 to $8,133 USD
(37,886 to 53,473 rands)
63.4 years 5.3/10 4.6 gha 32.6
7 $8,133 to $12,360 USD
(53,473 to 81,263 rands)
65.5 years 5.5/10 5.5 gha 33.9
8 $12,360 to $21,106 USD
(81,263 to 138,767 rands)
68.9 years 5.6/10 6.9 gha 35
9 $21,106 to $55,874 USD
(138,767 to 367,367 rands)
73.6 years 5.7/10 10 gha 34.7
10 Over $55,874 USD
(Over 367,367 rands)
80.1 years 5.8/10 28.6 gha 22.6

Fatal error: Uncaught JSMin_UnterminatedRegExpException: JSMin: Unterminated RegExp at byte 132241: /.test(c.value),i=c=>!isNaN(parseFloat(c.value))&&isFinite(c.value),n=c=>Object.prototype.toString.call(c.value)==="[object String]";return{isPresent:t,isEmail:e,isNumber:i,isString:n,isValidCurrencyCode:c=>n(c)&&c.value.length==3,isValidCountryCode:c=>n(c)&&c.value.length==2,isCheckboxChecked:c=>c.checked}}(),hs=function(){let t=document.getElementById("newsletter-sign-up"),e={};const i=()=>{n()},n=()=>{ne(t,"submit",g=>{g.preventDefault(),c(),s()})},s=()=>{let g={fname:t.elements["newsletter-fname"],lname:t.elements["newsletter-lname"],email:t.elements["newsletter-email"],weallConsent:t.elements["newsletter-consent"],message:t.elements.message};r(g)&&y(g)},r=g=>{let u=!0;return Object.keys(g).forEach(p=>{l(p,g[p],g)||(u=!1)}),u},l=(g,u,p)=>{let E=!1;switch(g){case"fname":return E=Rt.isPresent(u),E||o("fname","Please enter your first name",u),E;case"email":return E=Rt.isPresent(u)&&Rt.isEmail(u),E||o("email","Please enter a valid email address",u),E;case"weallConsent":case"nicConsent":return console.log(p),p.weallConsent.checked?E=!0:o("consent","Please check the box to sign up"),E;default:return!0}},c=()=>{let g=t.querySelectorAll(".error-help");Array.from(g).forEach(p=>p.remove());let u=t.querySelectorAll(".is-error");Array.from(u).forEach(p=>Ye(p,"is-error")),e={}},o=(g,u,p=null)=>{e[g]||(p?m(g,u,p):f(g,u),e[g]=u)},m=(g,u,p)=>{He(p,"is-error");let E=p.parentNode,T=document.createElement("span");T.className="error-help",T.innerText=u,E.appendChild(T)},f=(g,u)=>{let p=t.querySelector(".js-form-error"),E=document.createElement("span");E.className="error-help",E.innerText=u,p.appendChild(E)},y=g=>{x(!0),w({fname:g.fname.value,lname:g.lname.value,email:g.email.value,weallConsent:g.weallConsent.checked,honey:g.message.value}).then(u=>{if(!u.ok)throw new Error("There was an error submitting your details, please try again.");return u.json()}).then(u=>{if(u.error)throw new Error(u.error);S(t)}).finally(()=>{x(!1)}).catch(u=>{f("http",u)})},S=(g,u,p)=>{g.innerHTML=` in /var/www/hpi_wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php:264 Stack trace: #0 /var/www/hpi_wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(150): JSMin->action(1) #1 /var/www/hpi_wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(84): JSMin->min() #2 /var/www/hpi_wordpress/wp-content/plugins/autoptimize/classes/autoptimizeScripts.php(843): JSMin::minify('var we="top",_e...') #3 /var/www/hpi_wordpress/wp-content/plugins/autoptimize/classes/autoptimizeScripts.php(402): autoptimizeScripts->minify_single('/var/www/hpi_wo...') #4 /var/www/hpi_wordpress/wp-content/plugins/autoptimize/classes/autoptimizeMain.php(591): autoptimizeScripts->read(Array) #5 [internal function]: autoptimizeMain->end_buffering(' <!doctype htm...', 9) #6 /var/www/hpi_wordpress/wp-includes/functions.php(5581): ob_end_flush() #7 /var/www/hpi_wordpress/wp-includes/class-wp-hook.php(353): wp_ob_end_flush_all('') #8 /var/www/hpi_wordpress/wp-includes/class-wp-hook.php(377): WP_Hook->apply_filters('', Array) #9 /var/www/hpi_wordpress/wp-includes/plugin.php(523): WP_Hook->do_action(Array) #10 /var/www/hpi_wordpress/wp-includes/load.php(1308): do_action('shutdown') #11 [internal function]: shutdown_action_hook() #12 {main} thrown in /var/www/hpi_wordpress/wp-content/plugins/autoptimize/classes/external/php/jsmin.php on line 264