:root{ --ground:#FFFFFF; --surface:#FFFFFF; --ink:#0B1A17; --muted:#3E4B46; --line:#D3DBD6; --accent:#0B7A63; --accent-ink:#FFFFFF; --accent-soft:#E3F5EE; --sticker:#FFC72C; --sticker-ink:#231A00; --save:#C0281F; --chip:#F2F5F3; --hot:#E4572E; --hot-ink:#FFFFFF; --c-tech:#DCE7F7; --c-home:#F6E7D6; --c-health:#DDF0EA; --c-beauty:#F7DDE8; --c-groceries:#E9F2D6; --c-fitness:#E4E0F6; --c-fashion:#F3E3D3; --c-kids:#FFF0C7; --glyph:#132623; --display:"Bricolage Grotesque","Arial Narrow",system-ui,sans-serif; --body:"Figtree",system-ui,-apple-system,"Segoe UI",sans-serif; } @media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){ color-scheme:dark; --ground:#0E1615; --surface:#16211F; --ink:#E6EEEA; --muted:#9AABA4; --line:#26332F; --accent:#3FC1A1; --accent-ink:#06201A; --accent-soft:#17332C; --sticker:#F2C14E; --sticker-ink:#231900; --save:#F07A6E; --chip:#1D2A27; --hot:#F0764E; --hot-ink:#1E0A03; --c-tech:#1C2A3D; --c-home:#33291E; --c-health:#17332C; --c-beauty:#3A2230; --c-groceries:#26321A; --c-fitness:#282440; --c-fashion:#33281D; --c-kids:#3A3118; --glyph:#E6EEEA; } } :root[data-theme="dark"]{ color-scheme:dark; --ground:#0E1615; --surface:#16211F; --ink:#E6EEEA; --muted:#9AABA4; --line:#26332F; --accent:#3FC1A1; --accent-ink:#06201A; --accent-soft:#17332C; --sticker:#F2C14E; --sticker-ink:#231900; --save:#F07A6E; --chip:#1D2A27; --hot:#F0764E; --hot-ink:#1E0A03; --c-tech:#1C2A3D; --c-home:#33291E; --c-health:#17332C; --c-beauty:#3A2230; --c-groceries:#26321A; --c-fitness:#282440; --c-fashion:#33281D; --c-kids:#3A3118; --glyph:#E6EEEA; } *{box-sizing:border-box} body{background:var(--ground);color:var(--ink);font-family:var(--body);font-size:15px;line-height:1.5;padding-inline:16px;padding-block:0 48px} .wrap{max-width:1160px;margin:0 auto} header.top{position:sticky;top:env(safe-area-inset-top,0px);z-index:5;background:var(--ground);border-bottom:1px solid var(--line);margin-inline:-16px;padding:10px 16px} .bar{max-width:1160px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap} .brand{font-family:var(--display);font-weight:800;font-size:22px;letter-spacing:-.01em;cursor:pointer;background:none;border:0;color:var(--ink);padding:0} .brand b{color:var(--accent)} .prov{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted)} .regions{display:grid;gap:2px;font-size:13px} .regions .row{display:flex;justify-content:space-between;gap:8px} .regions .row span:last-child{white-space:nowrap;font-variant-numeric:tabular-nums} .regions .mine{font-weight:700;color:var(--ink)} .regions .na{color:var(--muted)} .brand{display:inline-flex;align-items:center;gap:8px} .brand-mark{width:46px;height:34px;object-fit:contain;background:#fff;border-radius:8px;padding:2px} .about{display:grid;grid-template-columns:1.05fr 1fr;gap:24px;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:18px;margin-block:10px 22px} @media (max-width:760px){.about{grid-template-columns:1fr}} .about-img{width:100%;height:auto;max-width:100%;border-radius:12px;display:block} .about-text{display:grid;gap:10px} .eyebrow-s{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);font-weight:700} .about h3{font-family:var(--display);font-weight:800;font-size:clamp(24px,3.4vw,34px);line-height:1.05;margin:0;letter-spacing:-.01em;text-wrap:balance} .about p{margin:0;color:var(--muted);max-width:52ch} .perks{list-style:none;margin:4px 0 0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px 16px} .perks li{display:grid;gap:1px;padding-left:22px;position:relative;font-size:14px} .perks li::before{content:"";position:absolute;left:0;top:4px;width:12px;height:7px;border-left:2.5px solid var(--accent);border-bottom:2.5px solid var(--accent);transform:rotate(-45deg)} .perks span{color:var(--muted);font-size:13px} .search{flex:1 1 220px;max-width:420px;position:relative} .search input{width:100%;font:inherit;padding:9px 12px 9px 36px;border-radius:999px;border:1px solid var(--line);background:var(--surface);color:var(--ink)} .search svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);width:16px;height:16px;stroke:var(--muted);fill:none} .hero{display:grid;grid-template-columns:1.1fr 1fr;gap:24px;align-items:center;padding-block:28px 20px} @media (max-width:760px){.hero{grid-template-columns:1fr}} .hero h1{font-family:var(--display);font-weight:800;font-size:clamp(32px,5.6vw,54px);line-height:1.02;margin:0 0 10px;letter-spacing:-.02em;text-wrap:balance} .hero h1 span{background:var(--sticker);color:var(--sticker-ink);padding:0 .15em;border-radius:4px} .hero p{margin:0 0 16px;color:var(--muted);max-width:52ch} .trust{display:flex;gap:6px 16px;flex-wrap:wrap;margin:-4px 0 16px;font-size:13px;color:var(--muted)} .trust span{display:inline-flex;align-items:center;gap:5px} .trust svg{width:14px;height:14px;fill:none;stroke:var(--accent);stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round} .stats{display:flex;gap:18px;flex-wrap:wrap} .stat{display:grid} .stat strong{font-family:var(--display);font-size:24px;font-weight:800;font-variant-numeric:tabular-nums} .stat span{font-size:12px;color:var(--muted);letter-spacing:.06em;text-transform:uppercase} .feature{background:var(--surface);border:2px solid var(--ink);border-radius:16px;padding:18px;display:grid;grid-template-columns:96px 1fr;gap:16px;align-items:center;position:relative;box-shadow:6px 6px 0 var(--sticker)} .feature .eyebrow{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--hot);font-weight:700} .feature h2{margin:2px 0 6px;font-size:19px;line-height:1.25} .feature .tile{width:96px;height:96px} .budgets{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-block:8px 26px} @media (max-width:620px){.budgets{grid-template-columns:repeat(2,1fr)}} .budget{font:inherit;text-align:left;cursor:pointer;border:1px solid var(--line);background:var(--surface);color:var(--ink);border-radius:14px;padding:14px 16px;display:grid;gap:2px;transition:transform .12s} .budget:hover{transform:translateY(-2px)} .budget .lbl{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)} .budget .amt{font-family:var(--display);font-weight:800;font-size:28px;letter-spacing:-.01em} .budget .n{font-size:13px;color:var(--accent);font-weight:600} .budget[aria-pressed="true"]{background:var(--sticker);color:var(--sticker-ink);border-color:var(--sticker)} .budget[aria-pressed="true"] .lbl,.budget[aria-pressed="true"] .n{color:var(--sticker-ink)} .cats{display:flex;gap:8px;overflow-x:auto;padding-bottom:6px;margin-bottom:18px;scrollbar-width:thin} button.chip{font:inherit;font-size:14px;border:1px solid var(--line);background:var(--chip);color:var(--ink);padding:6px 12px 6px 8px;border-radius:999px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;white-space:nowrap} button.chip svg{width:18px;height:18px} button.chip .k{color:var(--muted);font-size:12px} button.chip[aria-pressed="true"]{background:var(--ink);color:var(--ground);border-color:var(--ink)} button.chip[aria-pressed="true"] .k{color:var(--ground);opacity:.75} button:focus-visible,a:focus-visible,select:focus-visible,input:focus-visible{outline:2px solid var(--accent);outline-offset:2px} .shelf{margin-bottom:28px} .shelf-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px} .shelf-head h3{font-family:var(--display);font-weight:800;font-size:22px;margin:0;letter-spacing:-.01em} .shelf-head button{font:inherit;font-size:14px;background:none;border:0;color:var(--accent);font-weight:600;cursor:pointer;padding:4px} .rail{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(230px,250px);gap:14px;overflow-x:auto;padding:12px 2px 10px;scroll-snap-type:x mandatory;scrollbar-width:thin} .rail .deal{scroll-snap-align:start} .toolbar{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px} .toolbar .count{font-size:14px;color:var(--muted)} .toolbar .right{display:flex;gap:8px;align-items:center} select{font:inherit;font-size:14px;padding:6px 10px;border-radius:8px;border:1px solid var(--line);background:var(--surface);color:var(--ink)} .clear{font:inherit;font-size:14px;background:none;border:1px solid var(--line);color:var(--ink);border-radius:8px;padding:6px 10px;cursor:pointer} .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px;padding-top:10px} .deal{min-width:0;background:var(--surface);border:1px solid var(--line);border-radius:14px;overflow:visible;display:grid;grid-template-rows:auto 1fr;position:relative} .tile{border-radius:13px 13px 0 0;height:92px;display:grid;place-items:center;position:relative} .tile svg{width:44px;height:44px;stroke:var(--glyph);fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;opacity:.85} .tile.named{place-items:center;padding:14px 12px 26px;text-align:center} .tile.named .pname{font-family:var(--display);font-weight:800;font-size:16px;line-height:1.15;letter-spacing:-.005em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-wrap:balance} .feature .tile.named{padding:8px}.feature .tile.named .pname{font-size:13px;-webkit-line-clamp:5} .feature .tile{border-radius:12px} .tile.photo{background:var(--chip);overflow:hidden;place-items:stretch} .tile.photo img{width:100%;height:100%;object-fit:cover;display:block} .tile .credit{position:absolute;right:8px;bottom:6px;font-size:10px;color:#56655F;background:rgba(255,255,255,.85);padding:1px 6px;border-radius:999px} .tile .rbadge{position:absolute;left:10px;bottom:8px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;background:var(--surface);color:var(--ink);padding:2px 8px;border-radius:999px} .body{padding:12px 14px 14px;display:grid;gap:8px;grid-template-rows:auto 1fr auto auto} .sticker{position:absolute;top:-10px;right:10px;background:var(--sticker);color:var(--sticker-ink);font-family:var(--display);font-weight:800;font-size:15px;padding:3px 9px;border-radius:6px;transform:rotate(3deg);font-variant-numeric:tabular-nums;z-index:1} .sticker.hot{background:var(--hot);color:var(--hot-ink)} .flag{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--hot)} .name{font-weight:600;font-size:15px;line-height:1.3;margin:0} .prices{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap} .now{font-family:var(--display);font-weight:800;font-size:26px;letter-spacing:-.01em;font-variant-numeric:tabular-nums} .was{color:var(--muted);text-decoration:line-through;font-variant-numeric:tabular-nums;font-size:14px} .save{color:var(--save);font-weight:600;font-size:13px} .foot{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap} .checked{font-size:12px;color:var(--muted);white-space:nowrap} a.shop{background:var(--accent);color:var(--accent-ink);text-decoration:none;font-weight:700;padding:8px 13px;border-radius:8px;font-size:14px;white-space:nowrap} a.shop:hover{filter:brightness(1.08)} .empty{padding:30px;text-align:center;color:var(--muted);border:1px dashed var(--line);border-radius:12px;grid-column:1/-1} .notice{font-size:13px;color:var(--muted);margin:0 0 18px} .contact{margin-top:36px;background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:18px 20px;display:grid;gap:8px;max-width:640px} .contact h3{font-family:var(--display);font-weight:800;font-size:22px;margin:0} .contact p{margin:0;color:var(--muted)} .mailrow{display:flex;gap:10px;align-items:center;flex-wrap:wrap} a.mail{font-weight:700;font-size:17px;color:var(--accent);user-select:all;word-break:break-all} .copied{font-size:13px;color:var(--accent)} .hdr-mail{font-size:13px;color:var(--muted);text-decoration:none} .hdr-mail:hover{color:var(--accent)} .hero .free-badge{color:var(--accent-ink);line-height:1.25;display:inline-flex;align-items:center;gap:6px;margin:0 0 12px;background:var(--accent);color:var(--accent-ink);font-weight:800;letter-spacing:.04em;font-size:clamp(13px,2.4vw,15px);padding:6px 12px;border-radius:999px;max-width:100%} .hero .ubuntu{font-family:var(--display);font-weight:700;font-size:clamp(18px,2.6vw,22px);color:var(--ink);margin:0 0 8px} .ctas{display:flex;gap:10px;flex-wrap:wrap;margin:0 0 14px} a.cta{background:var(--ink);color:var(--ground);text-decoration:none;font-weight:700;padding:11px 18px;border-radius:10px;font-size:15px} a.cta.ghost{background:transparent;color:var(--ink);border:1.5px solid var(--ink)} a.cta:hover{filter:brightness(1.1)} .how{background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:18px;margin-block:10px 22px;display:grid;gap:12px;scroll-margin-top:80px} .how h3{font-family:var(--display);font-weight:800;font-size:clamp(22px,3vw,30px);margin:0} .steps{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;counter-reset:st} .steps li{counter-increment:st;display:grid;gap:2px;padding-left:40px;position:relative} .steps li::before{content:counter(st);position:absolute;left:0;top:0;width:28px;height:28px;border-radius:50%;background:var(--sticker);color:var(--sticker-ink);font-weight:800;display:grid;place-items:center} .steps span{color:var(--muted);font-size:14px} .whyfree{background:var(--accent-soft);border-radius:12px;padding:12px 14px;font-size:14px} #budgets{scroll-margin-top:80px} .legal a{color:var(--muted)} footer{margin-top:28px;padding-top:18px;border-top:1px solid var(--line);color:var(--muted);font-size:13px;display:grid;gap:6px;max-width:75ch} @media (prefers-reduced-motion: reduce){*{transition:none!important}}
Contact

100% FREE FOR ALL SOUTH AFRICANS

All the daily specials. One place.

Ubuntu — By Us. For Us.

Find specials from your favourite stores without searching everywhere. Tap a special and you buy straight from the store, which handles payment and delivery.

No subscription No sign-up No hidden charges

How it works

  1. Find a specialSearch or browse specials from South African stores, with dates and your province's price.
  2. Tap throughWe send you to the store's own website or leaflet. We don't sell, stock or deliver anything.
  3. Buy from the storeThe store handles payment, delivery and returns, at the store's price.
Why is it free? Because it's built for South Africans, by South Africans. You'll never pay to use it. Later, some stores may pay us a small fee when you click through. That won't cost you anything extra, and any paid placement will be clearly marked.
South African family smiling at the Specials2Doors app on a phone, with a bag of groceries
Proudly South African

We're 100% free for South Africans

Specials2Doors is built for South Africans, by South Africans, to help you save money and find the best deals in one place.

  • Save moneyEveryday essentials and more, with the real saving shown.
  • Save timeNo need to search multiple sites.
  • Mobile friendlyShop anywhere, any time.
  • No sign-upWe don't ask for your personal details.
  • Supporting SA storesEvery deal links straight to the retailer's own site.

Online deals checked on 14 October 2026. Catalogue specials show the retailer's advertised price and dates, show the province each price was advertised for (Western Cape prices are added as soon as the leaflet is available), and disappear automatically after their end date. Always confirm the price before you pay.

Get in touch

Spotted a wrong price, want a retailer added, or run a store and want your specials listed? Email us.