Now live in Potchefstroom

NowNow — Book Vetted Home Service Professionals in South Africa

Home servicessorted.

Book vetted professionals for cleaning, plumbing, electrical, and 10 more service categories. Instant or scheduled. Fully insured.

🧹 Home Cleaning
🔧 Plumbing
Electrical
💇 Beauty
🔒 Security
.section-signup-unified { background: var(--bg-warm); padding: 6rem 1.5rem; position: relative; overflow: hidden; } /* Decorative radial glows */ .section-signup-unified::before { content: ''; position: absolute; width: 600px; height: 600px; top: -200px; right: -200px; background: radial-gradient(circle, rgba(196,87,42,0.06) 0%, transparent 70%); pointer-events: none; border-radius: 50%; transition: background 0.6s; } .section-signup-unified.provider-mode::before { background: radial-gradient(circle, rgba(212,160,65,0.06) 0%, transparent 70%); } /* ── Toggle Switcher ── */ .signup-toggle-wrap { display: flex; justify-content: center; margin-bottom: 3.5rem; } .signup-toggle { display: inline-flex; position: relative; background: var(--card); border-radius: 100px; padding: 5px; border: 1px solid var(--border-light); box-shadow: var(--shadow); } .signup-toggle-btn { padding: 0.85rem 2rem; border-radius: 100px; font-size: 0.95rem; font-weight: 600; color: var(--text-secondary); background: none; border: none; cursor: pointer; position: relative; z-index: 2; transition: color 0.4s cubic-bezier(0.16, 1, 0.3, 1); display: inline-flex; align-items: center; gap: 0.5rem; white-space: nowrap; } .signup-toggle-btn.active { color: #fff; } .signup-toggle-slider { position: absolute; top: 5px; left: 5px; height: calc(100% - 10px); width: calc(50% - 5px); background: var(--primary); border-radius: 100px; transition: all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); z-index: 1; box-shadow: 0 4px 16px rgba(196,87,42,0.25); } .signup-toggle.provider-active .signup-toggle-slider { left: calc(50%); background: var(--accent); box-shadow: 0 4px 16px rgba(212,160,65,0.25); } @media (max-width: 480px) { .signup-toggle-btn { padding: 0.7rem 1.25rem; font-size: 0.85rem; gap: 0.35rem; } } /* ── Signup Layout (side by side) ── */ .signup-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 4rem; align-items: start; max-width: 1100px; margin: 0 auto; } @media (max-width: 900px) { .signup-layout { grid-template-columns: 1fr; gap: 2rem; } } /* ── Info Panel ── */ .signup-info { padding-top: 1.5rem; } .signup-info .section-title { text-align: left; } .signup-info p { color: var(--text-secondary); font-size: 1.05rem; margin-bottom: 1.75rem; font-weight: 300; line-height: 1.7; } .signup-info-panel { animation: panelReveal 0.45s cubic-bezier(0.16, 1, 0.3, 1) both; } @keyframes panelReveal { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } } /* Mini how-it-works steps */ .mini-steps { display: flex; flex-direction: column; gap: 1.15rem; margin: 1.5rem 0 2rem; } .mini-step { display: flex; align-items: flex-start; gap: 1rem; } .mini-step-number { width: 34px; height: 34px; border-radius: 50%; background: var(--primary); color: #fff; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.82rem; flex-shrink: 0; box-shadow: 0 4px 12px rgba(196,87,42,0.2); } .mini-step-number-gold { background: var(--accent); box-shadow: 0 4px 12px rgba(212,160,65,0.2); } .mini-step-content h4 { font-size: 0.95rem; font-weight: 700; margin-bottom: 0.15rem; line-height: 1.3; } .mini-step-content p { font-size: 0.85rem; color: var(--text-secondary) !important; line-height: 1.5; font-weight: 300; margin-bottom: 0 !important; } /* Benefits list */ .signup-benefits { list-style: none; display: flex; flex-direction: column; gap: 0.85rem; } .signup-benefits li { display: flex; align-items: center; gap: 0.75rem; font-size: 0.95rem; font-weight: 400; } .benefit-icon { width: 26px; height: 26px; background: rgba(107,143,113,0.15); color: #6B8F71; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 0.72rem; font-weight: 700; flex-shrink: 0; } .benefit-icon-gold { background: rgba(212,160,65,0.12); color: var(--accent); } /* ============================================================ FORM CARD — glassmorphic with animated gradient border ============================================================ */ .signup-form-card { background: var(--card); border-radius: var(--radius-xl); box-shadow: var(--shadow-xl); padding: 2.25rem; color: var(--text); position: relative; border: 1px solid var(--border-light); transition: box-shadow 0.4s; } /* Animated gradient border glow */ .signup-form-card::before { content: ''; position: absolute; inset: -2px; border-radius: calc(var(--radius-xl) + 2px); background: conic-gradient(from var(--gradient-angle), #C4572A, #D4A041, #A3431F, #D4A041, #C4572A); z-index: -1; opacity: 0; transition: opacity 0.5s; animation: rotateBorder 6s linear infinite; } .signup-form-card:hover::before { opacity: 0.4; } .signup-form-card:focus-within::before { opacity: 0.5; } @keyframes rotateBorder { to { --gradient-angle: 360deg; } } .signup-form-header { margin-bottom: 1.5rem; } .signup-form-header h3 { font-family: var(--font-display); font-size: 1.5rem; margin-bottom: 0.3rem; } .signup-form-header p { font-size: 0.88rem; color: var(--text-muted) !important; font-weight: 300; } .signup-form-header a { color: var(--primary); font-weight: 600; } /* Form elements */ .form-section { margin-bottom: 1rem; } .form-label { display: block; font-size: 0.82rem; font-weight: 600; margin-bottom: 0.4rem; color: var(--text); } .form-optional { font-weight: 400; color: var(--text-muted); } .required { color: var(--danger); } .form-hint { font-size: 0.75rem; color: var(--text-muted); margin-top: 0.4rem; font-weight: 300; } .form-input, .form-select { width: 100%; padding: 0.72rem 0.9rem; border: 1.5px solid var(--border); border-radius: var(--radius-sm); font-size: 0.92rem; background: var(--bg-warm); color: var(--text); transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); } .form-input:focus, .form-select:focus { border-color: var(--primary); outline: none; box-shadow: 0 0 0 4px rgba(196,87,42,0.08); background: var(--card); } .form-row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; } @media (max-width: 480px) { .form-row-2 { grid-template-columns: 1fr; } } .password-wrapper { position: relative; } .password-wrapper input { padding-right: 3rem; } .password-toggle { position: absolute; right: 0.75rem; top: 50%; transform: translateY(-50%); font-size: 0.95rem; opacity: 0.4; cursor: pointer; background: none; border: none; padding: 4px; transition: opacity 0.2s; } .password-toggle:hover { opacity: 1; } /* Password strength */ .pw-bar { display: flex; gap: 4px; margin-top: 8px; } .pw-bar-seg { flex: 1; height: 4px; border-radius: 2px; background: var(--border-light); transition: background 0.3s; } .pw-text { font-size: 0.72rem; margin-top: 4px; font-weight: 600; letter-spacing: 0.02em; } /* Checkboxes */ .checkbox-group { margin: 1.25rem 0; display: flex; flex-direction: column; gap: 0.65rem; } .checkbox-label { display: flex; align-items: flex-start; gap: 0.65rem; font-size: 0.83rem; cursor: pointer; line-height: 1.5; font-weight: 300; } .checkbox-label input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--primary); flex-shrink: 0; margin-top: 2px; border-radius: 4px; } .checkbox-label a { color: var(--primary); font-weight: 600; text-decoration: underline; } /* Buttons */ .btn-primary { background: var(--primary); color: #fff; padding: 0.82rem 1.5rem; border-radius: var(--radius-sm); font-size: 0.95rem; font-weight: 600; border: none; cursor: pointer; transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; } .btn-primary:hover { background: var(--primary-dark); transform: translateY(-1px); box-shadow: 0 4px 16px rgba(196,87,42,0.25); } .btn-primary:active { transform: scale(0.98); } .btn-provider { background: var(--accent); } .btn-provider:hover { background: #B88A30; box-shadow: 0 4px 16px rgba(212,160,65,0.3); } .full-width { width: 100%; } .btn-loading { position: relative; color: transparent !important; pointer-events: none; } .btn-loading::after { content: ''; position: absolute; width: 20px; height: 20px; border: 2.5px solid rgba(255,255,255,0.3); border-top-color: #fff; border-radius: 50%; animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Auth error */ .auth-error { background: #FEF2F2; color: #DC2626; border-radius: var(--radius-sm); padding: 0.75rem 1rem; font-size: 0.83rem; margin-bottom: 1rem; border: 1px solid #FEE2E2; font-weight: 400; } /* OTP inputs */ .otp-inputs { display: flex; gap: 0.55rem; justify-content: center; margin: 1.75rem 0; } .otp-inputs input { width: 50px; height: 58px; text-align: center; font-size: 1.5rem; font-weight: 700; border: 2px solid var(--border); border-radius: var(--radius-sm); background: var(--bg-warm); transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); color: var(--text); } .otp-inputs input:focus { border-color: var(--primary); outline: none; box-shadow: 0 0 0 4px rgba(196,87,42,0.08); background: var(--card); transform: scale(1.05); } .auth-subtitle { color: var(--text-secondary); font-size: 0.92rem; font-weight: 300; } .auth-email-highlight { font-weight: 700; color: var(--primary); font-size: 1rem; margin-top: 0.25rem; } .auth-resend { text-align: center; margin-top: 1rem; font-size: 0.82rem; color: var(--text-muted); } .auth-resend a { color: var(--primary); font-weight: 600; cursor: pointer; } /* Success */ .signup-success { text-align: center; padding: 2rem 0; } .success-check { font-size: 3rem; margin-bottom: 1rem; } .signup-success h3 { font-family: var(--font-display); font-size: 1.5rem; margin-bottom: 0.5rem; } .signup-success p { color: var(--text-secondary); margin-bottom: 1.5rem; font-weight: 300; } /* Step indicator */ .step-indicator { display: flex; align-items: center; justify-content: center; gap: 0; margin-bottom: 2rem; } .step-dot { display: flex; align-items: center; gap: 0.5rem; font-size: 0.78rem; font-weight: 600; color: var(--text-muted); transition: color 0.3s; } .step-dot.active { color: var(--primary); } .step-dot.done { color: var(--primary); } .step-dot-circle { width: 30px; height: 30px; border-radius: 50%; border: 2px solid var(--border); display: flex; align-items: center; justify-content: center; font-size: 0.72rem; font-weight: 700; transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1); } .step-dot.active .step-dot-circle { border-color: var(--primary); background: var(--primary); color: #fff; box-shadow: 0 0 16px rgba(196,87,42,0.2); } .step-dot.done .step-dot-circle { border-color: var(--primary); background: var(--primary-light); color: var(--primary); } .step-line { width: 36px; height: 2px; background: var(--border); margin: 0 0.5rem; transition: background 0.3s; } .step-dot.done + .step-line { background: var(--primary); } /* Category chips */ .category-chips { display: flex; flex-wrap: wrap; gap: 0.45rem; } .cat-chip { display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.4rem 0.8rem; border-radius: 100px; border: 1.5px solid var(--border); font-size: 0.8rem; font-weight: 500; cursor: pointer; transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); background: var(--card); user-select: none; } .cat-chip:hover { border-color: var(--primary); background: var(--primary-xlight); transform: translateY(-1px); } .cat-chip.selected { border-color: var(--primary); background: var(--primary-light); color: var(--primary); font-weight: 600; box-shadow: 0 0 12px rgba(196,87,42,0.08); } /* ============================================================ FAQ — clean accordion ============================================================ */ .faq-columns { display: grid; grid-template-columns: 1fr 1fr; gap: 3rem; max-width: 1000px; margin: 0 auto; } .faq-column-title { font-family: var(--font-display); font-size: 1.2rem; margin-bottom: 0.75rem; padding-bottom: 0.75rem; border-bottom: 2px solid var(--primary); } .faq-item { border-bottom: 1px solid var(--border-light); } .faq-question { width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 1rem 0; font-size: 0.92rem; font-weight: 600; text-align: left; background: none; border: none; cursor: pointer; color: var(--text); gap: 1rem; transition: color 0.2s; } .faq-question:hover { color: var(--primary); } .faq-chevron { font-size: 1.15rem; color: var(--text-muted); transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1); flex-shrink: 0; } .faq-item.open .faq-chevron { transform: rotate(45deg); } .faq-answer { max-height: 0; overflow: hidden; transition: max-height 0.4s cubic-bezier(0.16, 1, 0.3, 1); } .faq-item.open .faq-answer { max-height: 300px; } .faq-answer p { padding-bottom: 1rem; font-size: 0.88rem; color: var(--text-secondary); line-height: 1.75; font-weight: 300; } @media (max-width: 768px) { .faq-columns { grid-template-columns: 1fr; gap: 2rem; } } /* ============================================================ FOOTER — premium dark ============================================================ */ .l-footer { background: var(--dark-surface); color: rgba(255,255,255,0.6); padding: 0 1.5rem 2rem; position: relative; } /* Gradient accent line at top */ .l-footer::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, #C4572A, #D4A041, #C4572A); } .footer-inner { max-width: var(--max-width); margin: 0 auto; } .footer-top { display: grid; grid-template-columns: 1.5fr 2fr; gap: 4rem; padding: 4rem 0 3rem; } .footer-brand p { font-size: 0.88rem; line-height: 1.7; margin-top: 0.75rem; max-width: 300px; font-weight: 300; } .footer-logo-text { font-family: var(--font-display); font-size: 1.5rem; color: #fff; } .footer-links { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem; } .footer-links h4 { color: rgba(255,255,255,0.9); font-size: 0.78rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 1rem; } .footer-links a, .footer-links p { display: block; font-size: 0.85rem; margin-bottom: 0.55rem; transition: color 0.2s; font-weight: 300; } .footer-links a:hover { color: #fff; } .footer-bottom { border-top: 1px solid rgba(255,255,255,0.06); padding-top: 1.5rem; display: flex; justify-content: space-between; font-size: 0.78rem; font-weight: 300; } @media (max-width: 768px) { .footer-top { grid-template-columns: 1fr; gap: 2rem; } .footer-links { grid-template-columns: repeat(2, 1fr); } .footer-bottom { flex-direction: column; gap: 0.5rem; text-align: center; } } /* ============================================================ TOAST ============================================================ */ .toast-container { position: fixed; top: calc(var(--nav-height) + 1.5rem); right: 1rem; z-index: 200; display: flex; flex-direction: column; gap: 0.5rem; } .toast { padding: 0.85rem 1.25rem; border-radius: var(--radius); font-size: 0.88rem; font-weight: 500; box-shadow: var(--shadow-lg); animation: toastIn 0.35s cubic-bezier(0.16, 1, 0.3, 1), toastOut 0.35s ease 3.5s forwards; max-width: 360px; backdrop-filter: blur(12px); } .toast-success { background: rgba(107,143,113,0.95); color: #fff; } .toast-error { background: rgba(220,38,38,0.95); color: #fff; } .toast-info { background: rgba(43,31,22,0.95); color: #fff; } @keyframes toastIn { from { opacity: 0; transform: translateX(40px) scale(0.95); } to { opacity: 1; transform: translateX(0) scale(1); } } @keyframes toastOut { from { opacity: 1; } to { opacity: 0; transform: translateY(-10px); } } /* ============================================================ PAGE LOAD ANIMATION ============================================================ */ @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .hero-badge { animation: fadeInUp 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.1s both; } .hero-brand { animation: fadeInUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.15s both; } .hero-title { animation: fadeInUp 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.3s both; } .hero-subtitle { animation: fadeInUp 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.42s both; } .hero-ctas { animation: fadeInUp 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.55s both; } .hero-card { animation-delay: 0.6s; opacity: 0; animation-fill-mode: both; } .hero-card-1 { animation: fadeInUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.6s both, hfloat1 6s ease-in-out 1.2s infinite; } .hero-card-2 { animation: fadeInUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.7s both, hfloat2 5.5s ease-in-out 1.3s infinite; } .hero-card-3 { animation: fadeInUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.8s both, hfloat3 7s ease-in-out 1.4s infinite; } .hero-card-4 { animation: fadeInUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.9s both, hfloat1 5s ease-in-out 1.5s infinite; } .hero-card-5 { animation: fadeInUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) 1.0s both, hfloat2 6.5s ease-in-out 1.6s infinite; }
Now live in Potchefstroom

NowNow — Book Vetted Home Service Professionals in South Africa

Home servicessorted.

Book vetted professionals for cleaning, plumbing, electrical, and 10 more service categories. Instant or scheduled. Fully insured.

🧹 Home Cleaning
🔧 Plumbing
Electrical
💇 Beauty
🔒 Security
0 Service Categories
0 Services Available
0 Vetted Providers
🇿🇦 Proudly South African

South Africa's trusted home services marketplace

NowNow connects homeowners with vetted, qualified service professionals — making home maintenance simple, safe, and affordable.

Finding reliable home service professionals in South Africa has always been a challenge. According to Stats SA, the domestic services sector employs over 1 million South Africans, yet most of the industry remains informal — with no standardised pricing, vetting, or quality assurance. NowNow was built to change that.

Our platform offers 13 service categories with over 79 individual services, covering everything homeowners need:

  • Home Cleaning & Deep Cleaning
  • Plumbing & Leak Repairs
  • Electrical Work & Installations
  • Beauty & Grooming Services
  • Security & CCTV Installation
  • Painting & Waterproofing
  • Landscaping & Garden Services
  • Pest Control
  • Handyman & General Repairs
  • Appliance Repair
  • Moving & Removals
  • Pool Maintenance
  • Roofing & Gutters

Every professional on NowNow goes through a rigorous verification process — including identity checks, document validation, and business registration confirmation. Research from the South African Institute of Occupational Safety and Health (SAIOSH) shows that using verified professionals reduces workplace incidents by up to 60%.

Booking is designed to be effortless: choose your service, select a date and time, and get matched with a vetted provider in your area. Need something right now? Use our instant booking for same-day service. Planning ahead? Schedule for any date that suits you. Either way, providers send a transparent quotation before any payment is made.

NowNow is proudly South African — built in Potchefstroom and expanding across the country. We're creating opportunities for skilled tradespeople while giving homeowners the confidence to book quality services through a platform backed by the Department of Trade, Industry and Competition (DTIC)'s principles of fair commerce and consumer protection.

Create your free account

Whether you need services or provide them — get started in under 2 minutes.