1<!doctype html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"> 6
6<script> 7 /* 8 * No-flash theme: a visitor's own choice wins, otherwise light. 9 * 10 * We deliberately do NOT follow prefers-color-scheme here. Most people 11 * run their OS in dark mode, so honouring it would mean the light site 12 * is the one almost nobody sees. The toggle in the nav still works and 13 * still persists, so anyone who prefers dark is one click away. 14 */ 15 (function () { 16 try { 17 var stored = localStorage.getItem('talkify-theme'); 18 document.documentElement.setAttribute('data-theme', stored === 'dark' ? 'dark' : 'light'); 19 } catch (e) { 20 document.documentElement.setAttribute('data-theme', 'light'); 21 } 22 /* Scripting is on, so .r may hide its block until the observer 23 reveals it. Without this class nothing is ever hidden, which is 24 what a visitor with no JS (or a crawler) sees. */ 25 document.documentElement.classList.add('js'); 26 })(); 27 </script>
27 28 <title>AI Receptionist NZ | 24/7 AI Phone Answering From $129/month · Talkify</title> 29 <meta name="description" 30 content="NZ-built AI receptionist and voice assistant for business, answering your calls 24/7 in real NZ and Australian voices. AI reception, smart booking, lead qualification, instant SMS summaries. Integrates with Google Calendar, Outlook, GoHighLevel, HubSpot, Xero and Zenoti. Business plans from $129/month with up to 3 agents on your number, or pay as you go from $10/month plus $1/minute. No setup fee, no lock-in. Free live demo on a real NZ number."> 31 32 33 <link rel="canonical" href="https://talkify.nz"> 34 <link rel="alternate" hreflang="en-NZ" href="https://talkify.nz"> 35 <link rel="alternate" hreflang="en-AU" href="https://talkify.nz/au"> 36 <link rel="alternate" hreflang="x-default" href="https://talkify.nz"> 37 <link rel="icon" type="image/x-icon" href="/favicon.ico"> 38 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> 39 <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> 40 <link rel="apple-touch-icon" sizes="180x180" href="/media/branding/brand/app-icon-180.png"> 41 <link rel="manifest" href="/site.webmanifest"> 42 43 <meta name="theme-color" content="#318abe"> 44 45 <meta property="og:type" content="website"> 46 <meta property="og:url" content="https://talkify.nz"> 47 <meta property="og:site_name" content="Talkify"> 48 <meta property="og:title" content="AI Receptionist NZ | 24/7 AI Phone Answering From $129/month · Talkify"> 49 <meta property="og:description" 50 content="NZ-built AI receptionist and voice assistant for business, answering your calls 24/7 in real NZ and Australian voices. AI reception, smart booking, lead qualification, instant SMS summaries. Integrates with Google Calendar, Outlook, GoHighLevel, HubSpot, Xero and Zenoti. Business plans from $129/month with up to 3 agents on your number, or pay as you go from $10/month plus $1/minute. No setup fee, no lock-in. Free live demo on a real NZ number."> 51 <meta property="og:image" content="https://talkify.nz/media/meta-image.jpg"> 52 53 <meta property="og:image:width" content="1200"> 54 <meta property="og:image:height" content="630"> 55 <meta property="og:image:type" content="image/jpeg"> 56 <meta property="og:image:alt" 57 content="Talkify, AI Phone Agent for New Zealand businesses."> 58 59 <meta property="og:locale" content="en_NZ"> 60 61 <meta name="twitter:card" content="summary_large_image"> 62 <meta name="twitter:title" content="AI Receptionist NZ | 24/7 AI Phone Answering From $129/month · Talkify"> 63 <meta name="twitter:description" 64 content="NZ-built AI receptionist and voice assistant for business, answering your calls 24/7 in real NZ and Australian voices. AI reception, smart booking, lead qualification, instant SMS summaries. Integrates with Google Calendar, Outlook, GoHighLevel, HubSpot, Xero and Zenoti. Business plans from $129/month with up to 3 agents on your number, or pay as you go from $10/month plus $1/minute. No setup fee, no lock-in. Free live demo on a real NZ number."> 65 <meta name="twitter:image" content="https://talkify.nz/media/meta-image.jpg"> 66 <meta name="facebook-domain-verification" content="ic2puw1bkz233rscxrhcl0qol7suu1"/> 67 68
68<script 69 type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":["Organization","LocalBusiness"],"@id":"https://talkify.nz#organization","name":"Talkify","url":"https://talkify.nz","logo":"https://talkify.nz/media/branding/talkify-face-gradient-512.png","image":"https://talkify.nz/media/meta-image.jpg","description":"AI Phone Agent for New Zealand and Australian businesses. 24/7 AI receptionist, smart booking, lead qualification, and intelligent call handling. Business agents from $129 per month, Personal Assistant from $89.","telephone":"+64-800-002-967","email":"[email protected]","priceRange":"$$","areaServed":[{"@type":"Country","name":"New Zealand"},{"@type":"Country","name":"Australia"}],"address":{"@type":"PostalAddress","addressCountry":"NZ","addressRegion":"Canterbury","addressLocality":"Christchurch"},"contactPoint":[{"@type":"ContactPoint","telephone":"+64-800-002-967","contactType":"sales","areaServed":"NZ","availableLanguage":["English","te reo MÄori"]},{"@type":"ContactPoint","telephone":"+64-3-242-1262","contactType":"demo","areaServed":["NZ","AU"]},{"@type":"ContactPoint","telephone":"+611300852142","contactType":"sales","areaServed":"AU","availableLanguage":["English"]}],"foundingDate":"2024","foundingLocation":{"@type":"Place","address":{"@type":"PostalAddress","addressCountry":"NZ","addressLocality":"Christchurch"}},"parentOrganization":{"@type":"Organization","name":"D3V Services Limited","address":{"@type":"PostalAddress","addressCountry":"NZ","addressRegion":"Canterbury","addressLocality":"Christchurch"}},"knowsAbout":["AI receptionist","Virtual receptionist","Phone answering service","After-hours call answering","AI phone agent","Appointment booking","Outbound calling campaigns","Business phone numbers"],"sameAs":["https://www.facebook.com/profile.php?id=61572226258048","https://www.instagram.com/talkifynz/","https://www.linkedin.com/company/talkify-nz/"]},{"@type":"WebSite","@id":"https://talkify.nz#website","name":"Talkify","url":"https://talkify.nz","publisher":{"@id":"https://talkify.nz#organization"},"inLanguage":"en-NZ"},{"@type":"Service","@id":"https://talkify.nz#service","name":"Talkify AI Phone Agent","description":"AI-powered phone agent providing 24/7 AI reception, smart booking, lead qualification and intelligent call handling for New Zealand and Australian businesses.","provider":{"@id":"https://talkify.nz#organization"},"areaServed":[{"@type":"Country","name":"New Zealand"},{"@type":"Country","name":"Australia"}],"serviceType":"AI Phone Agent","category":"Business Phone System","audience":{"@type":"BusinessAudience","audienceType":"Small and medium businesses"},"hasOfferCatalog":{"@type":"OfferCatalog","name":"Talkify Plans","itemListElement":[{"@type":"Offer","name":"Shortwave (Personal Assistant, for one person)","price":"89","priceCurrency":"NZD"},{"@type":"Offer","name":"Broadcast (Business agents)","price":"129","priceCurrency":"NZD"},{"@type":"Offer","name":"Website Chat","price":"49","priceCurrency":"NZD"},{"@type":"Offer","name":"Custom Setup","price":"499","priceCurrency":"NZD","description":"From price. Includes custom API integration; 12-month contract."},{"@type":"Offer","name":"Fleet","priceCurrency":"NZD","description":"Custom pricing for multi-location operators"}]}}]}</script>
69 70 71
71<script 72 type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"What is an AI receptionist?","acceptedAnswer":{"@type":"Answer","text":"An AI receptionist is software that answers your business phone in a natural human voice. It greets callers, answers questions about your business, books appointments into your calendar, takes detailed messages and transfers urgent calls to a real person. Unlike voicemail it holds a real conversation, and unlike a person it answers every call at once, 24 hours a day. Talkify is an AI receptionist built in Christchurch for New Zealand businesses."}},{"@type":"Question","name":"What is an AI Phone Agent?","acceptedAnswer":{"@type":"Answer","text":"An AI Phone Agent is a voice-powered artificial intelligence that answers your business phone calls 24/7. It sounds natural and human-like, can answer questions about your business, book appointments, qualify leads, and forward messages via SMS or email."}},{"@type":"Question","name":"Is Talkify a voice assistant for business?","acceptedA
72nswer":{"@type":"Answer","text":"Yes. Talkify is an AI voice assistant that answers your business phone 24/7, in real New Zealand and Australian voices. It books callers straight into your calendar and texts you the summary the moment the call ends. There is no hardware and no new handset: it works by forwarding your existing business number, so you are running in minutes."}},{"@type":"Question","name":"How does Talkify work with my existing phone number?","acceptedAnswer":{"@type":"Answer","text":"Talkify works via call forwarding. You simply set up your existing business number to forward to your Talkify agent when you can't answer. No hardware changes or number porting required - you can be up and running in minutes."}},{"@type":"Question","name":"Can the AI agent book appointments into my calendar?","acceptedAnswer":{"@type":"Answer","text":"Yes. Talkify books into Google Calendar, Microsoft Outlook, Calendly, Zenoti, GymMaster and Cliniko and sends booking requests into MechanicDesk and Workshop Software for the workshop to accept. It syncs contacts and call outcomes to HubSpot and GoHighLevel. Other systems can be connected on a custom setup. Your AI agent checks real-time availability, books the appointment, and sends confirmation details to both you and the caller."}},{"@type":"Question","name":"How much does Talkify cost?","acceptedA
72nswer":{"@type":"Answer","text":"The cheapest way in is Pay As You Go: $10 a month covers your phone number, then $1 a minute as you use it, with no monthly plan at all. Business agents are on the Broadcast plan: $129/month at the founding rate for your first 3 months, then $199, per phone number with up to 3 agents on it. The Personal Assistant (Shortwave) answers one person's own mobile or landline rather than a business line, and is $89/month. A Website Chat agent for your site is $49/month, and custom setups with API integration start at $499 on a 12-month contract. Shortwave includes 50 minutes a month and Broadcast 200; extra minutes are 10c each (20c after your first 3 months), and each number includes free texts (50 a month on Broadcast, 20 on Shortwave), then 9c each."}},{"@type":"Question","name":"Does the AI sound robotic?","acceptedAnswer":{"@type":"Answer","text":"Not at all. Talkify uses state-of-the-art voice AI that sounds remarkably natural and human-like. Callers regularly can't tell they're speaking with an AI. You can choose from 80+ voices, more than 30 of them New Zealand and Australian, and customise the tone to match your brand."}},{"@type":"Question","name":"What languages does Talkify support?","acceptedA
72nswer":{"@type":"Answer","text":"Talkify supports 32 languages including English (NZ, AU, US, GB), te reo MÄori, Mandarin, Spanish, Hindi and more. AI agents can detect the caller's language and respond accordingly."}},{"@type":"Question","name":"Can I train the AI on my specific business information?","acceptedAnswer":{"@type":"Answer","text":"Absolutely. You provide your business knowledge (opening hours, services, pricing, FAQs, escalation paths) and the agent learns it all. The dashboard has a live prompt editor so you can tweak anything in seconds."}},{"@type":"Question","name":"How much does an AI receptionist cost in NZ?","acceptedAnswer":{"@type":"Answer","text":"Talkify business agents are $129/month at the founding rate for your first 3 months, then $199, including 200 minutes of calls, with extra minutes from 10c. There is no setup fee and no lock-in. For comparison, an employed receptionist in NZ costs roughly $55,000 to $65,000 a year before KiwiSaver, ACC and leave, and human answering services typically run $200 to $500 a month at real call volumes once per-call charges are counted."}},{"@type":"Question","name":"What is the difference between an AI receptionist and a virtual receptionist?","acceptedA
72nswer":{"@type":"Answer","text":"A virtual receptionist is usually a person in a call centre answering for many businesses during business hours, billed per call or per minute. An AI receptionist answers instantly at any hour, handles every caller at once, never bills you more because you had a busy week, and books the job while the caller is still on the line instead of handing you a message to chase. We compare the two honestly, including when a human service is the better fit, on our virtual receptionist page."}},{"@type":"Question","name":"What happens when a call is too complex for the AI?","acceptedAnswer":{"@type":"Answer","text":"It transfers the call to you or your team, with context. You set the rules: emergencies, VIP clients or anything you flag gets warm-transferred or texted to your mobile within seconds, with the caller's name, number and the gist of what they need. Everything else is handled without interrupting you."}},{"@type":"Question","name":"Where is my data stored?","acceptedAnswer":{"@type":"Answer","text":"Audio, transcripts, and call metadata are stored in NZ data centres. AES-256 encryption at rest. Detailed compliance documentation available on request."}},{"@type":"Question","name":"Is there a free trial or demo available?","acceptedA
72nswer":{"@type":"Answer","text":"Yes. You can call the live demo at 03 242 1262 24/7, click the chat widget on any page to talk to the agent right now, or sign up for a free dedicated demo number on your own line."}}]}</script>
72 73
73<script 74 type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"Talkify AI Phone Agent","description":"AI-powered phone agent providing 24/7 reception, smart booking, and intelligent call handling for New Zealand businesses.","applicationCategory":"BusinessApplication","operatingSystem":"Web","url":"https://talkify.nz","publisher":{"@type":"Organization","name":"Talkify","url":"https://talkify.nz"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"5","reviewCount":"6","bestRating":"5"},"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Dean W."},"reviewBody":"Thanks Talkify, love the AI Assistant phone service since we have implemented it at SUB10 to take the pressure off our reception staff and after hours phone handling. Its ability to answer most members and prospects questions has been a real game changer and most don't even know its AI, even though the voice states it is! Thank you!"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Dylan B."},"reviewBody":"Awesome! I'm so busy with my little tech support business I've been waiting so long for something like this to at least answer my calls when I'm onsite or with a customer, which is all day as per bookings etc, now instead of a missed call they can at least talk to someone and pass on their info plus how urgent it is, then I can filter through asap after my jobs are done and get back to people already knowing the problem, contact details, address and urgency level already. My customers love it! So far most of them do not know if she's real or not, it's amazing."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Infinity RV"},"reviewBody":"Talkify Delivers! Highly Recommended. As a busy motorhome and caravan dealership, missing customer calls simply isn't an option. For years, we used traditional answering services, but the costs kept increasing while the service remained much the same. We knew there had to be a better way. Before Talkify, we tried another AI phone agent provider, but when Talkify came looking for a caravan for the family and reached out, we decided to give them a chance. We're glad we did. After several months of using Talkify AI Phone Agents, we can honestly say the system has exceeded our expectations. The AI handles customer enquiries professionally, captures leads effectively, and ensures our customers always have someone available to speak with. It has helped streamline our operations while reducing costs at the same time. What really impressed us, however, wasn't just the technology. In a world where many companies disappear after making the sale, Talkify is the complete opposite. Whether it's during business hours, after hours, or on weekends, they're always available to help. If we leave a message, we usually hear back within 8 minutes. That kind of service is almost unheard of these days. More importantly, they genuinely care about helping businesses succeed, constantly coming up with ideas, improvements, and solutions that go beyond the AI receptionist itself. Rather than simply selling software, they become part of your team and work with you to improve your customer experience and business processes. Talkify has become an important part of our operation today, and the support we receive is second to none. If you're considering a receptionist or phone answering solution, seriously stop looking."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Anton I."},"reviewBody":"Amazing agent. Very good with natural conversation and accurate. Dictates the information back to make sure it gets everything correct."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Dan Y."},"reviewBody":"Highly Recommended, Outstanding AI Phone Agent Service. For more than 19 years, we relied on traditional answering services to manage our customer calls. However, with rising operating costs and continual price increases from traditional providers, we knew it was time to look for a smarter and more cost-effective solution. Before Talkify, we worked with another AI phone agent company. When Talkify approached us, we decided to give this local company an opportunity. Looking back, it has been one of the best business decisions we've made. We have now been using Talkify AI Phone Agents for around two months, and the results have been outstanding. Their technology, reliability, and overall performance have exceeded our expectations. The AI handles our calls professionally and consistently, helping us improve customer service while significantly reducing our monthly costs. However, great technology is only part of the equation. What truly sets Talkify apart is the exceptional support. No matter what time we contact them, they are always willing to help. If they miss a call, they typically get back to us within 10 to 15 minutes. That level of responsiveness and commitment is extremely rare these days. More importantly, they don't just provide support for the existing system. They are constantly looking for ways to improve our business operations and often come up with
74new ideas and solutions that add real value. It feels like having a technology partner rather than just another service provider."},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5","bestRating":"5"},"author":{"@type":"Person","name":"Lance B."},"reviewBody":"Great system! Highly recommend"}],"offers":{"@type":"Offer","price":"129","priceCurrency":"NZD","description":"Business plan, per month."}}</script>
vendor: 1 bytes, line 74
74
75<script type="application/ld+json">{"\u003C?php $__contextArgs = [];\nif (context()-\u003Ehas($__contextArgs[0])) :\nif (isset($value)) { $__contextPrevious[] = $value; }\n$value = context()-\u003Eget($__contextArgs[0]); ?\u003E":"https://schema.org","@type":"VideoObject","@id":"https://talkify.nz#film","name":"Talkify: a day of calls","description":"A day of calls, all answered: a class booked at dawn, a job written in mid-morning, an appointment moved at lunch, a quote request passed to a busy owner, and a 2am emergency put through to whoever is on call.","thumbnailUrl":["https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-224afe26.jpg"],"uploadDate":"2026-10-01","duration":"PT1M20S","contentUrl":"https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-d7aa3f1f.mp4","embedUrl":"https://talkify.nz","inLanguage":"en-NZ","isFamilyFriendly":true,"transcript":"Caller: Morning! Any room in spin at quarter past six? Talkify agent: MÅrena! Yep, two spots left. You're booked in. Caller: Hi, our hot water cylinder's leaking from the base. Talkify agent: Oh no. What's the address? I'll get the job to the team. Caller: Hey, can I move my Thursday appointment to later in the day? Talkify agent: Sure, three thirty on Thursday is free. I've moved you. Caller: Hi, could I get a quote to rewire our garage? Talkify agent: Absolutely. I'll grab a few details for the quote. Caller: There's water everywhere! A pipe's burst! Talkify agent: Oh, that's not good. Turn the water off at the toby if you can. I'm putting you through to Sam, on call, right now. Every call answered, all day, every day. That's Talkify. You set it up yourself in the builder, card by card. Or ask the assistant to do it for you. Serving New Zealand and Australia, with your privacy in mind. Your calls are handled in New Zealand and Australian data centres. No setup fee, no lock-in. Talkify. It's the phone, answered. Start free at talkify.nz.","publisher":{"@type":"Organization","name":"Talkify","url":"https://talkify.nz"}}</script>
75 76
76<script type="application/ld+json">{"@context":"https://schema.org","@type":"ItemList","name":"What sets Talkify apart from other AI phone answering services","itemListElement":[{"@type":"ListItem","position":1,"name":"Local NZ SIP network for low-latency, crystal-clear calls"},{"@type":"ListItem","position":2,"name":"Real New Zealand and Australian AI voices"},{"@type":"ListItem","position":3,"name":"Regional phone numbers across New Zealand and Australia"},{"@type":"ListItem","position":4,"name":"Data sovereignty: stored in New Zealand and Australian data centres"},{"@type":"ListItem","position":5,"name":"Outbound AI calling: confirmations, reminders and marketing campaigns"},{"@type":"ListItem","position":6,"name":"AI phone surveys with transcripts and analysis"},{"@type":"ListItem","position":7,"name":"AI call centre capacity with unlimited concurrent lines"},{"@type":"ListItem","position":8,"name":"Deep integrations: calendars, CRMs, gym software, Zapier and REST API"},{"@type":"ListItem","position":9,"name":"Personalised done-for-you setup"},{"@type":"ListItem","position":10,"name":"Mobile apps for iPhone and Android"},{"@type":"ListItem","position":11,"name":"Smart reporting with transcripts, sentiment and outcomes"}]}</script>
76 77 78 79 <!-- Google Analytics -->
vendor: 68 bytes, lines 79-80
79 80 <script async src="https://www.googletagmanager.com/gtag/js?id=
80G-YS6V82V8W9
vendor: 16 bytes, lines 80-81
80"></script> 81
81<script> 82
vendor: 176 bytes, lines 82-89
82window.dataLayer = window.dataLayer || []; 83 84 function gtag() { 85 dataLayer.push(arguments); 86 } 87 88 gtag('js', new Date()); 89 gtag('config', "
89G-YS6V82V8W9
vendor: 12 bytes, lines 89-90
89"); 90
90gtag('config', "AW-18227321636"); 91 </script>
91 92 93 94
94<script> 95 // Safe before gtag has loaded: dataLayer is already an array by here and 96 // gtag() only pushes onto it, so an event queued early still gets sent. 97 window.talkifyTrack = function (name, params) { 98 if (typeof gtag !== 'function') { return; } 99 gtag('event', name, params || {}); 100 }; 101 </script>
101 102 103 <!-- Google Tag Manager --> 104
104<script>
vendor: 534 bytes, lines 104-116
104(function (w, d, s, l, i) { 105 w[l] = w[l] || []; 106 w[l].push({ 107 'gtm.start': 108 new Date().getTime(), event: 'gtm.js' 109 }); 110 var f = d.getElementsByTagName(s)[0], 111 j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; 112 j.async = true; 113 j.src = 114 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 115 f.parentNode.insertBefore(j, f); 116 })(window, document, 'script', 'dataLayer', "
116GTM-TTGHDLQ4
vendor: 3 bytes, line 116
116");
116</script>
116 117 <!-- End Google Tag Manager --> 118 <link rel="preconnect" href="https://fonts.googleapis.com"> 119 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 120 <!-- Meta Pixel Code --> 121
121<script>
vendor: 679 bytes, lines 121-140
121 122 !function (f, b, e, v, n, t, s) { 123 if (f.fbq) return; 124 n = f.fbq = function () { 125 n.callMethod ? 126 n.callMethod.apply(n, arguments) : n.queue.push(arguments) 127 }; 128 if (!f._fbq) f._fbq = n; 129 n.push = n; 130 n.loaded = !0; 131 n.version = '2.0'; 132 n.queue = []; 133 t = b.createElement(e); 134 t.async = !0; 135 t.src = v; 136 s = b.getElementsByTagName(e)[0]; 137 s.parentNode.insertBefore(t, s) 138 }(window, document, 'script', 139 'https://connect.facebook.net/en_US/fbevents.js'); 140 fbq('init', '
1401560743332225994
vendor: 42 bytes, lines 140-142
140'); 141 fbq('track', 'PageView'); 142
142</script>
142 143 <noscript><img height="1" width="1" style="display:none" 144 src="https://www.facebook.com/tr?id=1560743332225994&ev=PageView&noscript=1" 145 /></noscript> 146 <!-- End Meta Pixel Code --> 147 148 <link 149 href="https://fonts.googleapis.com/css2?family=Outfit:[email protected]&family=JetBrains+Mono:wght@400;500&display=swap" 150 rel="stylesheet"> 151 152 <style> 153 /* ====== TOKENS ====== 154 The 2026 brand guide, in one place. 155 156 Roles, not decoration: 157 blue #318ABE PRIMARY. Links, primary buttons, focus rings, the 158 mark, the start of the gradient. 159 green #A3D654 ACCENT. Live dots, success, the end of the 160 gradient, small highlights on dark ground. 161 ink #101820 Body copy on light, the dark surface on dark. 162 163 Green is never small text on a light ground: #A3D654 on white is 164 1.6:1. Where a word genuinely has to be green and small, use 165 --green-ink. 166 167 Naming note: this sheet grew up with --ink as the page GROUND and 168 --paper as the text on it, and ~65 pages are written against that, 169 so the pair keeps its meaning. :root is the dark treatment; 170 html[data-theme="light"] is what almost every visitor sees, because 171 the no-flash script picks light unless somebody has chosen dark. */ 172 :root { 173 /* -- brand constants, identical in both themes -- */ 174 --blue: #318ABE; 175 --blue-dark: #256D97; 176 --green: #A3D654; 177 --green-ink: #4F6B18; /* the rare small-green-text case, on light */ 178 --brand-blue: #318ABE; /* legacy aliases, still referenced by pages */ 179 --brand-blue-bright: #5BC7E8; 180 --brand-green: #A3D654; 181 --brand-green-bright: #B9DD80; 182 183 /* -- dark treatment -- */ 184 --ink: #101820; 185 --ink-2: #16202A; 186 --ink-3: #1D2831; 187 --line: rgba(255, 255, 255, .10); 188 --line-2: rgba(255, 255, 255, .18); 189 --paper: #FFFFFF; 190 --paper-warm: #F2F4F5; 191 --bone: #C6CCD1; 192 --mute: #9AA2A8; 193 --mute-2: #79828A; 194 195 /* Primary. Blue carries links and fills here. --plasma is the same 196 family: the .blue / .eb-blue / .plasma-text idiom stays blue, the 197 brand simply has one primary rather than the two accents this 198 sheet used to run. Green is --accent, and only --accent. */ 199 --signal: #4FA6D8; 200 --signal-warm: #7BC4E9; 201 --plasma: #4FA6D8; 202 --plasma-bright: #7BC4E9; 203 --accent: #A3D654; /* live, success, gradient end */ 204 --coral: #FF5E3A; 205 --violet: #7C5BFF; 206 /* 45deg blue to green, hero surfaces only, never twice on a page */ 207 --grad: linear-gradient(45deg, var(--blue) 0%, var(--green) 100%); 208 --grad-soft: linear-gradient(45deg, color-mix(in srgb, var(--blue) 18%, transparent) 0%, color-mix(in srgb, var(--green) 18%, transparent) 100%); 209 210 /* -- type -- 211 Outfit does the display, heading and body work; JetBrains Mono 212 does labels. --serif and --serif-italic are kept as names because 213 ~65 pages reference them, but both now resolve to Outfit: there 214 is no second face on the site. */ 215 --sans: 'Outfit', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif; 216 --serif: 'Outfit', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif; 217 --serif-italic: 'Outfit', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif; 218 --mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace; 219 220 /* One scale, so a page cannot invent a size. The old sheet ran 221 138px headlines over 13.5px body copy; nothing here is below 222 14px and nothing above 96px. */ 223 --t-display: clamp(44px, 6.4vw, 96px); 224 --t-h2: clamp(34px, 4.4vw, 60px); 225 --t-h3: clamp(22px, 2.2vw, 30px); 226 --t-sub: clamp(20px, 2vw, 26px); 227 --t-lede: 17px; 228 --t-body: 16px; 229 --t-small: 14px; 230 --t-label: 11.5px; 231 --lh-display: 1.04; 232 --lh-head: 1.12; 233 --lh-body: 1.6; 234 --ls-head: -.02em; /* the guide's -2% on headings */ 235 --ls-label: .13em; /* the guide's +13% on mono labels */ 236 237 --ease: cubic-bezier(.2, .7, .2, 1); 238 --ease-out: cubic-bezier(.16, 1, .3, 1); 239
240 --shell-pad: clamp(20px, 3.5vw, 56px); 241 /* Section rhythm, so a new page stops reaching for 242 style="padding-top:0". See section.shell and .shell.flush. */ 243 --space-section: clamp(72px, 8vw, 120px); 244 --space-section-tight: clamp(52px, 5.5vw, 80px); 245 246 /* -- semantic tokens (recurring patterns that must flip per theme) -- */ 247 --on-accent: #0B1116; /* text sitting on a brand fill */ 248 --panel: #16202A; 249 --panel-2: #1A242E; 250 --panel-grad: linear-gradient(140deg, #18232D, #101820); 251 --panel-grad-160: linear-gradient(160deg, #16202A, #101820); 252 --deck-grad: linear-gradient(180deg, #18232D, #101820); 253 --surface: rgba(255, 255, 255, .02); 254 --surface-2: rgba(255, 255, 255, .04); 255 --surface-3: rgba(255, 255, 255, .06); 256 --scrim-strong: rgba(16, 24, 32, .85); 257 --scrim-mid: rgba(16, 24, 32, .6); 258 --scrim-soft: rgba(16, 24, 32, .4); 259 --scrim-solid: #101820; 260 --shadow-deep: rgba(0, 0, 0, .8); 261 --shadow-soft: rgba(0, 0, 0, .5); 262 --logo-light: none; /* logo image swap: see .logo img rules */ 263 } 264 265 /* ====== LIGHT THEME ====== */ 266 html[data-theme="light"] { 267 --ink: #FFFFFF; 268 --ink-2: #F7F8F8; /* the guide's surface */ 269 --ink-3: #EDEFEF; 270 --line: #E9EAEA; /* the guide's line */ 271 --line-2: #D5D8D9; 272 --paper: #101820; /* the guide's ink, as body copy */ 273 --paper-warm: #1B242C; 274 --bone: #3F4A52; /* long-form body copy, 9.6:1 on white */ 275 --mute: #5A6268; /* the guide's grey, 6.2:1 on white */ 276 --mute-2: #79828A; 277 278 /* On white, #318ABE is 3.8:1, which is short of AA for a 14px 279 label or a link in running text. The guide's own blue dark is 280 5.7:1, so that is what carries text and button fills here; 281 #318ABE stays the brand blue for the mark, the gradient and 282 anything large. */ 283 --signal: #256D97; 284 --signal-warm: #1F5D80; 285 --plasma: #256D97; 286 --plasma-bright: #1F5D80; 287 --accent: #A3D654; 288 289 --on-accent: #FFFFFF; /* white on the blue fill: 5.7:1 */ 290 --panel: #F7F8F8; 291 --panel-2: #EFF1F1; 292 --panel-grad: linear-gradient(140deg, #FFFFFF, #F2F4F4); 293 --panel-grad-160: linear-gradient(160deg, #FFFFFF, #F2F4F4); 294 --deck-grad: linear-gradient(180deg, #FFFFFF, #F7F8F8); 295 --surface: rgba(16, 24, 32, .03); 296 --surface-2: rgba(16, 24, 32, .05); 297 --surface-3: rgba(16, 24, 32, .07); 298 --scrim-strong: rgba(255, 255, 255, .88); 299 --scrim-mid: rgba(255, 255, 255, .58); 300 --scrim-soft: rgba(255, 255, 255, .36); 301 --scrim-solid: #FFFFFF; 302 --shadow-deep: rgba(16, 24, 32, .20); 303 --shadow-soft: rgba(16, 24, 32, .12); 304 } 305 306 html { 307 transition: background-color .35s var(--ease), color .35s var(--ease); 308 } 309 310 @media (prefers-reduced-motion: reduce) { 311 html { 312 transition: none 313 } 314 } 315 316 /* Light-theme atmosphere, the dark grain/scanline/vignette overlays don't suit a light ground */ 317 html[data-theme="light"] .grain { 318 opacity: .12; 319 mix-blend-mode: multiply 320 } 321 322 html[data-theme="light"] .scanlines { 323 display: none 324 } 325 326 html[data-theme="light"] .vignette { 327 background: radial-gradient(120% 80% at 50% 0%, transparent 45%, rgba(20, 22, 15, .06) 100%) 328 } 329 330 /* Theme-swappable photos: elements pass --shot-dark / --shot-light as inline custom props */ 331 html[data-theme="light"] .hero-bg .photo { 332 background-image: var(--shot-light, var(--shot-dark)) 333 } 334 335 html[data-theme="light"] .hero-photo { 336 background-image: var(--shot-light, var(--shot-dark)) 337 } 338 339 html[data-theme="light"] .endcta .endcta-photo { 340 background-image: url('/media/frontend/nz-skyline-day.jpg'); 341 opacity: .5; 342 filter: saturate(1) contrast(1) 343 } 344 345 /* ââ The 2026 mark (x-brand.logo) ââââââââââââââââââââââââââââââââââ 346 The lockup is drawn inline so the spark eye can wink and so the 347 word can take the theme's colour rather than needing a file per 348 combination. Base here is the dark treatment, matching :root; the 349 light theme, which is what the no-flash script picks unless somebody 350 has chosen dark, inverts the pair. The gradient circle is the same 351 blue-to-green in both, per the brand guide. */ 352 .tk-logo { 353 --tk-word: #ffffff; 354 --tk-ground: #101820; 355 display: block; 356 } 357 358 html[data-theme="light"] .tk-logo { 359 --tk-word: #101820; 360 --tk-ground: #ffffff; 361 } 362
363 /* The guide's one permitted movement: 300ms close on a 4 second 364 cycle, on an inner group so the star keeps its translate and scale. */ 365 @keyframes tk-blink { 366 0%, 92%, 100% { transform: scaleY(1) } 367 95% { transform: scaleY(.08) } 368 } 369 370 .tk-logo .tk-eye { 371 animation: tk-blink 4s ease-in-out infinite; 372 transform-origin: 50px 50px 373 } 374 375 @media (prefers-reduced-motion: reduce) { 376 .tk-logo .tk-eye { 377 animation: none 378 } 379 } 380 381 /* Theme toggle button */ 382 .theme-toggle { 383 width: 40px; 384 height: 40px; 385 border-radius: 10px; 386 border: 1px solid var(--line); 387 display: grid; 388 place-items: center; 389 color: var(--bone); 390 transition: .25s var(--ease); 391 flex: 0 0 auto 392 } 393 394 .theme-toggle:hover { 395 border-color: var(--signal); 396 color: var(--paper) 397 } 398 399 .theme-toggle .icon-moon { 400 display: none 401 } 402 403 html[data-theme="light"] .theme-toggle .icon-sun { 404 display: none 405 } 406 407 html[data-theme="light"] .theme-toggle .icon-moon { 408 display: block 409 } 410 411 * { 412 box-sizing: border-box; 413 margin: 0; 414 padding: 0 415 } 416 417 html, body { 418 background: var(--ink); 419 color: var(--paper); 420 font-family: var(--sans); 421 font-weight: 400; 422 -webkit-font-smoothing: antialiased; 423 text-rendering: optimizeLegibility; 424 overflow-x: hidden 425 } 426 427 body { 428 font-size: var(--t-body); 429 line-height: var(--lh-body); 430 letter-spacing: 0 431 } 432 433 a { 434 color: inherit; 435 text-decoration: none 436 } 437 438 img, svg { 439 display: block; 440 max-width: 100% 441 } 442 443 button { 444 font: inherit; 445 color: inherit; 446 background: none; 447 border: 0; 448 cursor: pointer 449 } 450 451 input, textarea, select { 452 font: inherit; 453 color: inherit 454 } 455 456 ::selection { 457 background: var(--signal); 458 color: var(--on-accent) 459 } 460 461 /* Labels: JetBrains Mono 500, uppercase, +13% tracking. */ 462 .mono { 463 font-family: var(--mono); 464 font-weight: 500; 465 letter-spacing: var(--ls-label) 466 } 467 468 .serif { 469 font-family: var(--serif) 470 } 471 472 /* The accent idiom. 473 It was a Fraunces italic in green. Outfit ships no italic, and a 474 browser-synthesised slant on a geometric sans at 96px looks broken, 475 so the accent is now weight and colour: Outfit 600 in the primary 476 blue. The !important is deliberate and is the only one in this 477 sheet: several pages set font-style on their own .it descendants 478 and would otherwise reintroduce the fake slant. */ 479 .italic, .it, .blue { 480 font-family: var(--serif); 481 font-style: normal !important; 482 font-weight: 600 483 } 484 485 .signal-text { 486 color: var(--signal) 487 } 488 489 .plasma-text { 490 color: var(--plasma-bright) 491 } 492 493 /* ====== ATMOSPHERE ====== */ 494 .grain { 495 position: fixed; 496 inset: 0; 497 pointer-events: none; 498 z-index: 200; 499 mix-blend-mode: overlay; 500 opacity: .32; 501 background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .55 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>"); 502 background-size: 160px 503 } 504 505 .scanlines { 506 position: fixed; 507 inset: 0; 508 pointer-events: none; 509 z-index: 201; 510 opacity: .04; 511 background-image: linear-gradient(to bottom, transparent 0, transparent 2px, rgba(255, 255, 255, .6) 2px, rgba(255, 255, 255, .6) 3px); 512 background-size: 100% 3px 513 } 514 515 .vignette { 516 position: fixed; 517 inset: 0; 518 pointer-events: none; 519 z-index: 199; 520 background: radial-gradient(120% 80% at 50% 0%, transparent 40%, rgba(0, 0, 0, .5) 100%) 521 } 522 523 @keyframes pulse { 524 0%, 100% { 525 transform: scale(1); 526 opacity: 1 527 } 528 50% { 529 transform: scale(1.4); 530 opacity: .6 531 } 532 } 533 534 @keyframes slide { 535 from { 536 transform: translateX(0) 537 } 538 to { 539 transform: translateX(-50%) 540 } 541 } 542 543 /* ====== NAV ====== */ 544 .nav { 545 position: fixed; 546 top: 0; 547 left: 0; 548 right: 0; 549 z-index: 80; 550 display: grid; 551 grid-template-columns:1fr auto 1fr; 552 align-items: center; 553 gap: 24px; 554 padding: 18px var(--shell-pad); 555 background: linear-gradient(180deg, var(--scrim-strong), var(--scrim-soft) 80%, transparent); 556 backdrop-filter: blur(10px) saturate(140%); 557 -webkit-backdrop-filter: blur(10px) saturate(140%) 558 } 559 560 .nav .logo { 561 display: flex; 562 align-items: center; 563 gap: 14px 564 } 565 566 .nav .logo .mark { 567 width: 34px; 568 height: 34px; 569 border-radius: 10px; 570 background: var(--grad); 571 display: grid; 572 place-items: center; 573 position: relative; 574 overflow: hidden; 575 box-shadow: 0 0 30px rgba(49, 138, 190, .4) 576 } 577 578 .nav .logo .mark::after { 579 content: ""; 580 position: absolute; 581 inset: 0; 582 background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, .55), transparent 50%) 583 } 584 585 .nav .logo .mark svg { 586 width: 18px; 587 height: 18px; 588 color: var(--ink); 589 position: relative; 590 z-index: 1 591 } 592 593 .nav .logo b { 594 font-family: var(--serif); 595 font-weight: 500; 596 font-size: 22px; 597 letter-spacing: -.02em 598 } 599 600 .nav .logo .tag { 601 font-family: var(--mono); 602 font-size: var(--t-label); 603 color: var(--mute); 604 text-transform: uppercase; 605 letter-spacing: .18em; 606 margin-left: 6px; 607 padding: 3px 6px; 608 border: 1px solid var(--line); 609 border-radius: 4px 610 } 611 612 .nav ul { 613 display: flex; 614 gap: 6px; 615 list-style: none 616 } 617 618 .nav ul a { 619 display: inline-flex; 620 align-items: center; 621 gap: 6px; 622 padding: 8px 14px; 623 border-radius: 999px; 624 font-size: 13px; 625 color: var(--bone); 626 transition: .25s var(--ease) 627 } 628 629 .nav ul a:hover { 630 background: var(--ink-3); 631 color: var(--paper) 632 } 633 634 .nav ul a.is-active { 635 background: var(--ink-3); 636 color: var(--paper) 637 } 638 639 .nav ul a.is-active .dot { 640 background: var(--signal); 641 box-shadow: 0 0 8px var(--signal) 642 } 643 644 .nav ul a .dot { 645 width: 5px; 646 height: 5px; 647 border-radius: 50%; 648 background: var(--mute) 649 } 650 651 /* ââ Agents mega-menu âââââââââââââââââââââââââââââââââââââââââââââ 652 Desktop: opens on hover, on focus, or on click (the click state is 653 what mobile uses, where the whole nav is a stacked panel and the 654 menu becomes an inline accordion). */ 655 .nav-drop { 656 position: relative 657 } 658 659 .nav-drop-btn { 660 display: inline-flex; 661 align-items: center; 662 gap: 6px; 663 padding: 8px 14px; 664 border-radius: 999px; 665 font-family: var(--sans); 666 font-size: 13px; 667 color: var(--bone); 668 background: none; 669 border: 0; 670 cursor: pointer; 671 transition: .25s var(--ease) 672 } 673 674 .nav-drop-btn:hover, 675 .nav-drop-btn.is-active { 676 background: var(--ink-3); 677 color: var(--paper) 678 } 679 680 .nav-drop-btn.is-active .dot { 681 background: var(--signal); 682 box-shadow: 0 0 8px var(--signal) 683 } 684 685 .nav-drop-btn .dot { 686 width: 5px; 687 height: 5px; 688 border-radius: 50%; 689 background: var(--mute) 690 } 691 692 .nav-drop-chev { 693 transition: transform .25s var(--ease); 694 opacity: .7 695 } 696 697 .nav-drop.is-open .nav-drop-chev { 698 transform: rotate(180deg) 699 } 700 701 .nav-drop-panel { 702 position: absolute; 703 top: calc(100% + 10px); 704 left: 0; 705 z-index: 90; 706 display: none; 707 grid-template-columns: minmax(240px, 1fr) minmax(300px, 1fr); 708 gap: 26px; 709 min-width: 620px; 710 padding: 22px; 711 background: var(--ink-2); 712 border: 1px solid var(--line); 713 border-radius: 16px; 714 box-shadow: 0 24px 60px rgba(0, 0, 0, .35) 715 } 716 717 /* Invisible bridge across the 10px gap between the button and the panel. 718 Without it the pointer leaves .nav-drop on the way down and the menu 719 shuts before you get there, unless you move quickly. It spans the full 720 width of the panel, so a diagonal approach is covered too. */ 721 .nav-drop-panel::before { 722 content: ""; 723 position: absolute; 724 left: 0; 725 right: 0; 726 top: -12px; 727 height: 12px 728 } 729
730 /* One-column variant, for a menu that holds a single short list. The 731 base two-column grid is what Agents uses. */ 732 .nav-drop-panel--single { 733 grid-template-columns: 1fr; 734 min-width: 340px 735 } 736 737 /* Industries runs to twenty-three entries in four sectors, so it takes 738 a third column rather than a taller one. Sector headings do the 739 finding; the A-Z inside each does the rest. */ 740 .nav-drop-panel--industries { 741 grid-template-columns: repeat(3, minmax(190px, 1fr)); 742 min-width: 660px 743 } 744 745 .nav-drop:hover .nav-drop-panel, 746 .nav-drop:focus-within .nav-drop-panel, 747 .nav-drop.is-open .nav-drop-panel { 748 display: grid 749 } 750 751 .nav-drop-hd { 752 display: block; 753 font-family: var(--mono); 754 font-size: var(--t-label); 755 letter-spacing: .18em; 756 text-transform: uppercase; 757 color: var(--mute); 758 margin-bottom: 10px 759 } 760 761 /* These selectors carry `.nav ul` on purpose: the generic `.nav ul a` 762 rule above makes every nav link an inline-flex pill, which would put 763 each label and its description side by side instead of stacked. */ 764 .nav ul .nav-drop-panel a { 765 display: block; 766 padding: 9px 10px; 767 border-radius: 10px; 768 font-size: var(--t-small); 769 line-height: 1.35; 770 color: var(--paper); 771 transition: .2s var(--ease) 772 } 773 774 .nav ul .nav-drop-panel a > span { 775 display: block; 776 font-weight: 500 777 } 778 779 .nav ul .nav-drop-panel a em { 780 display: block; 781 font-style: normal; 782 font-size: 11.5px; 783 line-height: 1.4; 784 color: var(--mute); 785 margin-top: 3px 786 } 787 788 .nav ul .nav-drop-panel a:hover { 789 background: var(--ink-3) 790 } 791 792 .nav-drop-col { 793 display: flex; 794 flex-direction: column; 795 align-items: stretch 796 } 797 798 /* A sector column's links sit tighter than the described Agents rows: 799 they are one word each and there is no <em> under them. */ 800 .nav ul .nav-drop-panel--industries a:not(.nav-drop-all) { 801 padding-top: 6px; 802 padding-bottom: 6px 803 } 804 805 /* margin-top:auto pins it to the foot of its column, so both "See all" 806 links line up even though the two columns are different lengths. */ 807 .nav ul .nav-drop-all { 808 margin-top: auto; 809 padding-top: 12px; 810 border-top: 1px solid var(--line); 811 border-radius: 0; 812 color: var(--signal); 813 font-weight: 500; 814 /* The arrow belongs on the same line as the words. In a sector 815 column ~190px wide it wrapped onto a line of its own. */ 816 white-space: nowrap 817 } 818 819 .nav ul .nav-drop-all:hover { 820 background: none; 821 opacity: .8 822 } 823 824 /* `a` is in the selector to out-specify `.nav ul .nav-drop-panel a > 825 span`, which is display:block for the stacked label-and-description 826 rows. Without it the arrow was a block of its own and dropped onto a 827 second line under the words. */ 828 .nav ul a.nav-drop-all > span { 829 display: inline; 830 font-weight: 500 831 } 832 833 .nav .actions { 834 justify-self: end; 835 display: flex; 836 align-items: center; 837 gap: 10px 838 } 839 840 .nav .num { 841 font-family: var(--mono); 842 font-size: 13px; 843 color: var(--bone); 844 padding: 8px 12px; 845 border: 1px solid var(--line); 846 border-radius: 8px; 847 transition: .25s; 848 white-space: nowrap 849 } 850 851 .nav .num:hover { 852 border-color: var(--signal); 853 color: var(--paper) 854 } 855 856 .nav .num b { 857 color: var(--signal); 858 font-weight: 500 859 } 860 861 /* The signup pill's two faces: the wide desktop one links to /signup 862 (a tel: link on a desktop rings nothing), the mobile one is a phone 863 glyph that actually dials. Only ever one on screen. */ 864 .nav .num-call { 865 display: none; 866 align-items: center; 867 justify-content: center; 868 padding: 8px 10px; 869 line-height: 0 870 } 871 872 .menu-btn { 873 display: none 874 } 875 876 .btn { 877 display: inline-flex; 878 align-items: center; 879 gap: 10px; 880 padding: 12px 20px; 881 border-radius: 999px; 882 font-size: var(--t-small); 883 font-weight: 500; 884 letter-spacing: 0; 885 transition: .25s var(--ease); 886 border: 1px solid transparent; 887 white-space: nowrap 888 } 889 890 /* Primary is Talkify Blue, per the guide. Green is the accent and 891 never the button. */ 892 .btn-primary { 893 background: var(--signal); 894 color: var(--on-accent) 895 } 896 897 .btn-primary:hover { 898 background: var(--signal-warm); 899 transform: translateY(-1px); 900 box-shadow: 0 8px 26px -8px color-mix(in srgb, var(--signal) 55%, transparent) 901 } 902 903 .btn-blue { 904 background: var(--plasma); 905 color: var(--on-accent) 906 } 907 908 .btn-blue:hover { 909 background: var(--plasma-bright); 910 transform: translateY(-1px) 911 } 912 913 .btn-ghost { 914 border-color: var(--paper); 915 color: var(--paper) 916 } 917 918 .btn-ghost:hover { 919 background: var(--paper); 920 color: var(--ink); 921 border-color: var(--paper) 922 } 923 924 /* One focus ring for every interactive thing on the site. */ 925 .btn:focus-visible, a:focus-visible, button:focus-visible, 926 input:focus-visible, select:focus-visible, textarea:focus-visible, 927 summary:focus-visible, [tabindex]:focus-visible { 928 outline: 2px solid var(--blue); 929 outline-offset: 2px 930 } 931 932 .btn .arr { 933 transition: transform .25s var(--ease) 934 } 935 936 .btn:hover .arr { 937 transform: translateX(3px) 938 } 939 940 .btn-lg { 941 padding: 16px 28px; 942 font-size: 16px 943 } 944 945 /* ====== EYEBROW ====== */ 946 .eyebrow { 947 display: inline-flex; 948 align-items: center; 949 gap: 10px; 950 font-family: var(--mono); 951 font-weight: 500; 952 font-size: var(--t-label); 953 text-transform: uppercase; 954 letter-spacing: var(--ls-label); 955 color: var(--mute); 956 padding: 6px 10px; 957 border: 1px solid var(--line); 958 border-radius: 999px; 959 background: var(--surface) 960 } 961 962 /* Green is the live state, which is exactly what this dot is. */ 963 .eyebrow .pin { 964 width: 6px; 965 height: 6px; 966 border-radius: 50%; 967 background: var(--accent); 968 box-shadow: 0 0 10px color-mix(in srgb, var(--accent) 70%, transparent) 969 } 970 971 .eyebrow.eb-blue .pin { 972 background: var(--plasma); 973 box-shadow: 0 0 10px var(--plasma) 974 } 975 976 .eyebrow.eb-coral .pin { 977 background: var(--coral); 978 box-shadow: 0 0 10px var(--coral) 979 } 980 981 /* ====== HERO ====== */ 982 /* The nav is 84px and fixed, so 160px of padding was 76px of nothing 983 above the headline. On a laptop that pushed the whole hero, and the 984 dialler beside it, most of the way down the fold before a word was 985 read. 120 keeps a comfortable 36px under the bar. */ 986 .hero { 987 position: relative; 988 padding: 120px var(--shell-pad) 80px; 989 overflow: hidden 990 } 991 992 .hero-bg { 993 position: absolute; 994 inset: 0; 995 pointer-events: none; 996 z-index: 0; 997 overflow: hidden 998 } 999 1000 .hero-bg .photo { 1001 position: absolute; 1002 inset: 0; 1003 background-image: var(--shot-dark); 1004 background-position: center right; 1005 background-size: cover; 1006 background-repeat: no-repeat; 1007 opacity: .78; 1008 filter: saturate(.85) contrast(1.05) 1009 } 1010 1011 .hero-bg .photo::after { 1012 content: ""; 1013 position: absolute; 1014 inset: 0; 1015 background: linear-gradient(90deg, var(--scrim-solid) 0%, var(--scrim-strong) 28%, var(--scrim-mid) 50%, var(--scrim-soft) 72%, var(--scrim-mid) 100%), 1016 linear-gradient(180deg, var(--scrim-soft) 0%, transparent 30%, transparent 70%, var(--scrim-mid) 100%) 1017 } 1018 1019 .hero-bg .glow1 { 1020 position: absolute; 1021 top: -20%; 1022 left: -10%; 1023 width: 80%; 1024 height: 120%; 1025 background: radial-gradient(closest-side, rgba(49, 138, 190, .20), transparent 70%); 1026 filter: blur(20px); 1027 mix-blend-mode: screen 1028 } 1029 1030 .hero-bg .glow2 { 1031 position: absolute; 1032 bottom: -30%; 1033 right: -10%; 1034 width: 70%; 1035 height: 120%; 1036 background: radial-gradient(closest-side, color-mix(in srgb, var(--accent) 12%, transparent), transparent 70%); 1037 filter: blur(20px); 1038 mix-blend-mode: screen 1039 } 1040 1041 .hero-bg .grid-lines { 1042 position: absolute; 1043 inset: 0; 1044 background-image: linear-gradient(to right, var(--line) 1px, transparent 1px), linear-gradient(to bottom, var(--line) 1px, transparent 1px); 1045 background-size: 80px 80px; 1046 mask-image: radial-gradient(ellipse at center, #000, transparent 70%); 1047 opacity: .5 1048 } 1049 1050 /* The two hero columns are rarely the same height: the copy runs long 1051 on some pages, the photo is very tall on others, and the transcript 1052 deck is short everywhere. Bottom-aligning them dropped whichever was 1053 shorter to the floor and left a hole above it, which is what the 1054 debt-collection, outbound-calls, call-centre and pricing heroes were 1055 all showing. Centred, the difference is split top and bottom instead 1056 of piling up in one corner. */ 1057 .hero-shell { 1058 position: relative; 1059 z-index: 1; 1060 display: grid; 1061 grid-template-columns:1.4fr 1fr; 1062 gap: 64px; 1063 align-items: center 1064 } 1065 1066 /* A hero photo is the exception: it is a full-bleed panel, so it fills 1067 the row rather than floating in the middle of it. */ 1068 .hero-shell > .hero-photo { 1069 align-self: stretch 1070 } 1071 1072 .hero-shell.single { 1073 grid-template-columns:1fr; 1074 max-width: 1200px 1075 } 1076 1077 /* Heroes whose right column is a tall form. Bottom-aligning them drops a 1078 dead band above the headline and top-aligning just moves it below, so 1079 the left column instead stretches to the form's height and spreads its 1080 groups over it. Needs the left column's content in group wrappers. */ 1081 .hero-shell.top { 1082 align-items: stretch 1083 } 1084 1085 .hero-shell.top > .hero-side { 1086 display: flex; 1087 flex-direction: column; 1088 justify-content: space-between 1089 } 1090 1091 h1.display { 1092 margin-top: 28px; 1093 font-family: var(--serif); 1094 font-weight: 600; 1095 font-size: var(--t-display); 1096 line-height: var(--lh-display); 1097 letter-spacing: var(--ls-head); 1098 padding-bottom: .06em 1099 } 1100 1101 /* The resting state IS the default. It used to be 1102 translateY(110%) inside overflow:hidden with a 1s animation, so the 1103 largest element on the page -- the LCP element -- was off screen 1104 until the animation ran, and never arrived at all if animations 1105 were suppressed. */ 1106 h1.display .ln { 1107 display: block; 1108 padding-bottom: .06em; 1109 padding-right: .06em 1110 } 1111 1112 h1.display .ln span { 1113 display: inline-block; 1114 padding-bottom: .04em 1115 } 1116 1117 h1.display .it, 1118 h1.display .blue { 1119 font-family: var(--serif); 1120 font-style: normal; 1121 font-weight: 600; 1122 color: var(--signal) 1123 } 1124 1125 h1.display .out { 1126 color: var(--bone) 1127 } 1128 1129 @keyframes rise { 1130 from { 1131 opacity: 0; 1132 transform: translateY(16px) 1133 } 1134 to { 1135 opacity: 1; 1136 transform: none 1137 } 1138 } 1139 1140 @media (prefers-reduced-motion: no-preference) { 1141 h1.display .ln { 1142 overflow: hidden 1143 } 1144 1145 h1.display .ln span { 1146 animation: rise .4s var(--ease-out) both 1147 } 1148 1149 .hero h1.display .ln:nth-child(1) span { animation-delay: 0s } 1150 1151 .hero h1.display .ln:nth-child(2) span { animation-delay: .06s } 1152 1153 .hero h1.display .ln:nth-child(3) span { animation-delay: .12s } 1154 1155 .hero h1.display .ln:nth-child(4) span { animation-delay: .18s } 1156 } 1157 1158 .hero-sub { 1159 margin-top: 32px; 1160 max-width: 580px; 1161 color: var(--bone); 1162 font-size: var(--t-sub); 1163 line-height: 1.45 1164 } 1165 1166 /* rise2 is the site's general "arrive" animation. It is written from 1167 the resting state outwards, so an element that never animates is 1168 already where it belongs. */ 1169 @keyframes rise2 { 1170 from { 1171 opacity: 0; 1172 transform: translateY(16px) 1173 } 1174 to { 1175 opacity: 1; 1176 transform: none 1177 } 1178 } 1179 1180 @media (prefers-reduced-motion: no-preference) { 1181 .hero-sub { 1182 animation: rise2 .4s .1s var(--ease-out) both 1183 } 1184 } 1185 1186 .hero-sub b { 1187 color: var(--paper); 1188 font-weight: 500 1189 } 1190 1191 .hero-cta { 1192 margin-top: 36px; 1193 display: flex; 1194 flex-wrap: wrap; 1195 align-items: center; 1196 gap: 14px 1197 } 1198 1199 .hero-meta { 1200 display: flex; 1201 flex-wrap: wrap; 1202 gap: 36px 56px; 1203 margin-top: 48px; 1204 padding-top: 28px; 1205 border-top: 1px dashed var(--line-2) 1206 } 1207 1208 @media (prefers-reduced-motion: no-preference) { 1209 .hero-cta { 1210 animation: rise2 .4s .16s var(--ease-out) both 1211 } 1212 1213 .hero-meta { 1214 animation: rise2 .4s .22s var(--ease-out) both 1215 } 1216 } 1217 1218 .hero-meta dt { 1219 font-family: var(--mono); 1220 font-size: var(--t-label); 1221 letter-spacing: .18em; 1222 text-transform: uppercase; 1223 color: var(--mute) 1224 } 1225 1226 .hero-meta dd { 1227 font-family: var(--serif); 1228 font-weight: 600; 1229 font-size: 30px; 1230 letter-spacing: var(--ls-head); 1231 margin-top: 4px 1232 } 1233 1234 .hero-meta dd b { 1235 color: var(--signal); 1236 font-weight: 600 1237 } 1238 1239 .hero-meta dd small { 1240 font-family: var(--mono); 1241 font-size: var(--t-small); 1242 color: var(--mute); 1243 margin-left: 4px 1244 } 1245 1246 /* Short reassurance list that sits under the hero meta, used to carry the 1247 left column down beside a tall form. */ 1248 .hero-points { 1249 margin-top: 34px; 1250 padding-top: 26px; 1251 border-top: 1px dashed var(--line-2); 1252 display: grid; 1253 gap: 14px; 1254 max-width: 560px; 1255 opacity: 0; 1256 animation: rise2 .9s 1s var(--ease-out) forwards 1257 } 1258 1259 .hero-points .pt { 1260 display: flex; 1261
1261 align-items: flex-start; 1262 gap: 12px; 1263 font-size: 14px; 1264 line-height: 1.5; 1265 color: var(--bone) 1266 } 1267 1268 .hero-points .pt svg { 1269 flex: 0 0 16px; 1270 margin-top: 3px; 1271 color: var(--signal) 1272 } 1273 1274 .hero-points .pt b { 1275 color: var(--paper); 1276 font-weight: 500 1277 } 1278 1279 /* HERO PHOTO PANEL, used on industry pages to showcase a story image as the hero visual */ 1280 .hero-photo { 1281 position: relative; 1282 border-radius: 18px; 1283 overflow: hidden; 1284 box-shadow: 0 50px 80px -40px var(--shadow-deep), 0 0 0 1px var(--surface-2) inset; 1285 aspect-ratio: 4/5; 1286 background-image: var(--shot-dark); 1287 background-size: cover; 1288 background-position: center; 1289 opacity: 0; 1290 transform: translateY(30px); 1291 animation: rise2 1s 1s var(--ease-out) forwards 1292 } 1293 1294 .hero-photo::before { 1295 content: ""; 1296 position: absolute; 1297 inset: 0; 1298 background: linear-gradient(180deg, transparent 50%, var(--scrim-mid) 100%); 1299 pointer-events: none 1300 } 1301 1302 .hero-photo::after { 1303 content: ""; 1304 position: absolute; 1305 top: 0; 1306 left: 0; 1307 right: 0; 1308 height: 1px; 1309 background: linear-gradient(90deg, transparent, var(--signal), transparent); 1310 opacity: .6 1311 } 1312 1313 .hero-photo .corner { 1314 position: absolute; 1315 top: 18px; 1316 left: 18px; 1317 display: flex; 1318 align-items: center; 1319 gap: 8px; 1320 font-family: var(--mono); 1321 font-size: var(--t-label); 1322 letter-spacing: .18em; 1323 text-transform: uppercase; 1324 color: var(--paper); 1325 padding: 6px 12px; 1326 background: var(--scrim-strong); 1327 backdrop-filter: blur(6px); 1328 border: 1px solid var(--line-2); 1329 border-radius: 999px 1330 } 1331 1332 .hero-photo .corner::before { 1333 content: ""; 1334 width: 6px; 1335 height: 6px; 1336 border-radius: 50%; 1337 background: var(--coral); 1338 box-shadow: 0 0 8px var(--coral); 1339 animation: pulse 1.6s var(--ease) infinite 1340 } 1341 1342 .hero-photo .caption { 1343 position: absolute; 1344 bottom: 24px; 1345 left: 24px; 1346 right: 24px; 1347 display: flex; 1348 justify-content: space-between; 1349 align-items: flex-end; 1350 gap: 16px; 1351 color: var(--paper); 1352 z-index: 1 1353 } 1354 1355 .hero-photo .caption .title { 1356 font-family: var(--serif); 1357 font-weight: 600; 1358 font-size: 22px; 1359 letter-spacing: -.01em; 1360 line-height: 1.1; 1361 max-width: 18ch 1362 } 1363 1364 .hero-photo .caption .title .it { 1365 font-family: var(--serif); 1366 font-weight: 600; 1367 color: var(--signal) 1368 } 1369 1370 .hero-photo .caption .stat { 1371 font-family: var(--mono); 1372 font-size: 11px; 1373 letter-spacing: .1em; 1374 text-align: right; 1375 flex: 0 0 auto 1376 } 1377 1378 .hero-photo .caption .stat b { 1379 display: block; 1380 font-family: var(--serif); 1381 font-size: 24px; 1382 font-weight: 300; 1383 color: var(--signal); 1384 letter-spacing: -.02em 1385 } 1386 1387 /* CALL DECK */ 1388 /* The live call transcript. V2 renders the same thing as a left-ruled 1389 column rather than a floating rounded panel, so the conversation 1390 reads as part of the section instead of a card dropped onto it. */ 1391 /* The live call transcript. 1392 This is a CARD, not a ruled column, and that is what /v2 does too: 1393 its hero carries .v2-livecard, which has a fill, a 10px radius and a 1394 drop shadow. Only the deck sitting inside a section (.v2-mini-deck) 1395 is left-ruled. 1396 1397 It was briefly converted to the ruled treatment everywhere, which 1398 left the transcript floating unanchored in the middle of five 1399 different heroes. The rule is: in a hero it is a card, in a section 1400 it is a ruled column (.deck.in-section below). */ 1401 .deck { 1402 position: relative; 1403 background: var(--deck-grad); 1404 border-radius: 10px; 1405 padding: 18px 18px 14px; 1406 box-shadow: 0 30px 60px -20px var(--shadow-deep); 1407 backdrop-filter: blur(6px); 1408 font-family: var(--mono); 1409 font-size: 12.5px; 1410 line-height: 1.5; 1411 color: var(--bone); 1412 overflow: hidden; 1413 opacity: 0; 1414 transform: translateY(30px); 1415 animation: rise2 1s 1s var(--ease-out) forwards 1416 } 1417 1418 /* the in-section variant, matching .v2-mini-deck */ 1419 .deck.in-section { 1420 background: none; 1421 border-radius: 0; 1422 box-shadow: none; 1423 backdrop-filter: none; 1424 border-left: 1px solid var(--line-2); 1425 padding: 6px 0 6px 28px 1426 } 1427 1428 /* This drew a green hairline across the top of the panel. The deck is 1429 ruled down its left edge now, so a top rule as well met it in a 1430 corner and read as half a box. The left rule is the deck's mark. */ 1431 .deck::before { 1432 content: none 1433 } 1434 1435 .deck-hd { 1436 display: flex; 1437 justify-content: space-between; 1438 align-items: center; 1439 padding-bottom: 12px; 1440 border-bottom: 1px solid var(--line); 1441 margin-bottom: 14px; 1442 gap: 12px 1443 } 1444 1445 .deck-hd .dots { 1446 display: flex; 1447 gap: 6px 1448 } 1449 1450 .deck-hd .dots i { 1451 width: 9px; 1452 height: 9px; 1453 border-radius: 50%; 1454 background: var(--ink-3); 1455 display: block 1456 } 1457 1458 .deck-hd .dots i:first-child { 1459 background: var(--coral) 1460 } 1461 1462 .deck-hd .dots i:nth-child(2) { 1463 background: #f5b942 1464 } 1465 1466 .deck-hd .dots i:nth-child(3) { 1467 background: var(--signal) 1468 } 1469 1470 .deck-hd .ttl { 1471 font-size: 10px; 1472 letter-spacing: .16em; 1473 text-transform: uppercase; 1474 color: var(--mute); 1475 overflow: hidden; 1476 text-overflow: ellipsis; 1477 white-space: nowrap 1478 } 1479 1480 .deck-hd .rec { 1481 display: inline-flex; 1482 gap: 6px; 1483 align-items: center; 1484 color: var(--coral); 1485 font-size: 10px; 1486 text-transform: uppercase; 1487 letter-spacing: .16em; 1488 flex: 0 0 auto 1489 } 1490 1491 .deck-hd .rec::before { 1492 content: ""; 1493 width: 6px; 1494 height: 6px; 1495 border-radius: 50%; 1496 background: var(--coral); 1497 animation: pulse 1.6s infinite 1498 } 1499 1500 .deck-row { 1501 display: flex; 1502 gap: 10px; 1503 padding: 6px 0; 1504 align-items: flex-start; 1505 opacity: 0; 1506 transform: translateY(6px); 1507 transition: opacity .55s var(--ease-out), transform .55s var(--ease-out) 1508 } 1509 1510 .deck-row.in { 1511 opacity: 1; 1512 transform: translateY(0) 1513 } 1514 1515 .deck-row .ts { 1516 color: var(--mute); 1517 min-width: 48px; 1518 flex: 0 0 48px; 1519 font-size: 11px 1520 } 1521 1522 /* Typing indicator, three dots that pulse */ 1523 .deck-typing { 1524 display: flex; 1525 gap: 10px; 1526 padding: 6px 0; 1527 align-items: center; 1528 font-family: var(--mono); 1529 opacity: 0; 1530 transition: opacity .25s ease; 1531 height: 0; 1532 overflow: hidden 1533 } 1534 1535 .deck-typing.on { 1536 opacity: 1; 1537 height: auto; 1538 overflow: visible 1539 } 1540 1541 .deck-typing .ts { 1542 color: var(--mute); 1543 min-width: 48px; 1544 flex: 0 0 48px; 1545 font-size: 11px 1546 } 1547 1548 .deck-typing .who { 1549 min-width: 64px; 1550 flex: 0 0 64px; 1551 text-transform: uppercase; 1552 font-size: 10px; 1553 letter-spacing: .12em; 1554 color: var(--signal) 1555 } 1556 1557 .deck-typing .dotset { 1558 display: inline-flex; 1559 gap: 4px; 1560 align-items: center 1561 } 1562 1563 .deck-typing .dotset i { 1564 width: 6px; 1565 height: 6px; 1566 border-radius: 50%; 1567 background: var(--signal); 1568 opacity: .4; 1569 animation: typingDot 1.2s ease-in-out infinite 1570 } 1571 1572 .deck-typing .dotset i:nth-child(2) { 1573 animation-delay: .2s 1574 } 1575 1576 .deck-typing .dotset i:nth-child(3) { 1577 animation-delay: .4s 1578 } 1579 1580 @keyframes typingDot { 1581 0%, 60%, 100% { 1582 opacity: .3; 1583 transform: scale(.8) 1584 } 1585 30% { 1586 opacity: 1; 1587 transform: scale(1.1) 1588 } 1589 } 1590 1591 /* PA floater notifications, arrive with a green flash and slide */ 1592 .pa-floater .row { 1593 opacity: 0; 1594 transform: translateY(-8px); 1595 transition: opacity .55s var(--ease-out), transform .55s var(--ease-out) 1596 } 1597 1598 .pa-floater .row.in { 1599 opacity: 1; 1600 transform: translateY(0) 1601 } 1602 1603 .pa-floater .row.ping { 1604 animation: ping 1.4s var(--ease-out) 1605 } 1606 1607 @keyframes ping { 1608 0% { 1609 box-shadow: 0 0 0 0 transparent 1610 } 1611 20% { 1612 box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 60%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 45%, transparent); 1613 background: color-mix(in srgb, var(--accent) 8%, transparent) 1614 } 1615 100% { 1616 box-shadow: 0 0 0 0 transparent; 1617 background: transparent 1618 } 1619 } 1620 1621 .pa-floater .row.fresh::before { 1622 content: "NEW"; 1623 position: absolute; 1624 right: 0; 1625 top: -4px; 1626 font-family: var(--mono); 1627 font-size: 8px; 1628 letter-spacing: .18em; 1629 color: var(--ink); 1630 background: var(--signal); 1631 padding: 2px 5px; 1632 border-radius: 3px; 1633 animation: freshFade 4s ease-out forwards 1634 } 1635 1636 .pa-floater .row { 1637 position: relative 1638 } 1639 1640 @keyframes freshFade { 1641 0%, 60% { 1642 opacity: 1 1643 } 1644 100% { 1645 opacity: 0 1646 } 1647 } 1648 1649 .deck-row .who { 1650 min-width: 64px; 1651 flex: 0 0 64px; 1652 text-transform: uppercase; 1653 font-size: 10px; 1654 letter-spacing: .12em 1655 } 1656 1657 .deck-row.caller .who { 1658 color: var(--plasma-bright) 1659 } 1660 1661 .deck-row.agent .who { 1662 color: var(--signal) 1663 } 1664 1665 .deck-row .msg { 1666 color: var(--paper); 1667 flex: 1; 1668 font-size: 12px 1669 } 1670 1671 .deck-foot { 1672 margin-top: 12px; 1673 padding-top: 12px; 1674 border-top: 1px solid var(--line); 1675 display: grid; 1676 grid-template-columns:repeat(3, 1fr); 1677 gap: 8px 1678 } 1679 1680 .deck-foot .stat { 1681 padding: 8px 10px; 1682 background: var(--surface); 1683 border: 1px solid var(--line); 1684 border-radius: 8px 1685 } 1686 1687 .deck-foot .stat span { 1688 display: block; 1689 color: var(--mute-2); 1690 font-size: 9px; 1691 text-transform: uppercase; 1692 letter-spacing: .16em; 1693 margin-bottom: 4px 1694 } 1695 1696 .deck-foot .stat b { 1697 color: var(--paper); 1698 font-weight: 500; 1699 font-size: 13px 1700 } 1701 1702 .wave { 1703 display: flex; 1704 align-items: center; 1705 gap: 2px; 1706 height: 28px; 1707 margin-top: 14px 1708 } 1709 1710 .wave i { 1711 flex: 1; 1712 background: var(--signal); 1713 border-radius: 1px; 1714 animation: wv 1.2s ease-in-out infinite; 1715 height: 30%; 1716 box-shadow: 0 0 6px var(--signal) 1717 } 1718 1719 .wave i:nth-child(2) { 1720 animation-delay: .1s 1721 } 1722 1723 .wave i:nth-child(3) { 1724 animation-delay: .2s 1725 } 1726 1727 .wave i:nth-child(4) { 1728 animation-delay: .3s 1729 } 1730 1731 .wave i:nth-child(5) { 1732 animation-delay: .4s 1733 } 1734 1735 .wave i:nth-child(6) { 1736 animation-delay: .5s 1737 } 1738 1739 .wave i:nth-child(7) { 1740 animation-delay: .6s 1741 } 1742 1743 .wave i:nth-child(8) { 1744 animation-delay: .7s 1745 } 1746 1747 .wave i:nth-child(9) { 1748 animation-delay: .8s 1749 } 1750 1751 .wave i:nth-child(10) { 1752 animation-delay: .9s 1753 } 1754 1755 .wave i:nth-child(11) { 1756 animation-delay: 1s 1757 } 1758 1759 .wave i:nth-child(12) { 1760 animation-delay: 1.1s 1761 } 1762 1763 .wave i:nth-child(13) { 1764 animation-delay: .05s 1765 } 1766 1767 .wave i:nth-child(14) { 1768 animation-delay: .15s 1769 } 1770 1771 .wave i:nth-child(15) { 1772 animation-delay: .25s 1773 } 1774 1775 .wave i:nth-child(16) { 1776 animation-delay: .35s 1777 } 1778 1779 .wave i:nth-child(17) { 1780 animation-delay: .45s 1781 } 1782 1783 .wave i:nth-child(18) { 1784 animation-delay: .55s 1785 } 1786 1787 .wave i:nth-child(19) { 1788 animation-delay: .65s 1789 } 1790 1791 .wave i:nth-child(20) { 1792 animation-delay: .75s 1793 } 1794 1795 @keyframes wv { 1796 0%, 100% { 1797 height: 20%; 1798 opacity: .4 1799 } 1800 50% { 1801 height: 95%; 1802 opacity: 1 1803 } 1804 } 1805 1806 /* ====== STRIP ====== */ 1807 /* same treatment as the V2 ticker: a faint raised surface between two 1808 hairlines, rather than a solid slab of ink */ 1809 .strip { 1810 border-top: 1px solid var(--line); 1811 border-bottom: 1px solid var(--line); 1812 background: var(--surface); 1813 overflow: hidden; 1814 padding: 18px 0; 1815 font-family: var(--serif); 1816 font-size: 36px; 1817 letter-spacing: -.02em 1818 } 1819 1820 .strip-track { 1821 display: flex; 1822 gap: 64px; 1823 white-space: nowrap; 1824 animation: slide 60s linear infinite; 1825 will-change: transform 1826 } 1827 1828 .strip-track:hover { 1829 animation-play-state: paused 1830 } 1831 1832 @media (prefers-reduced-motion: reduce) { 1833 .strip-track { 1834 animation: none 1835 } 1836 } 1837 1838 .strip-track .pip { 1839 color: var(--signal) 1840 } 1841 1842 .strip-track .it { 1843 font-family: var(--serif); 1844 font-weight: 600; 1845 color: var(--bone) 1846 } 1847 1848 .strip-track .blue { 1849 color: var(--plasma) 1850 } 1851 1852 .strip-link { 1853 color: var(--paper); 1854 text-decoration: none; 1855 display: inline-flex; 1856 align-items: center; 1857 gap: 14px; 1858 padding: 0 4px; 1859 border-radius: 6px; 1860 transition: color .25s, background .25s 1861 } 1862 1863 .strip-link.it { 1864 font-family: var(--serif); 1865 font-weight: 600; 1866 color: var(--bone) 1867 } 1868 1869 .strip-link:hover { 1870 color: var(--signal); 1871 background: color-mix(in srgb, var(--signal) 6%, transparent) 1872 } 1873 1874 /* An item with no page behind it states rather than links, so it takes 1875 no pointer and no hover. */ 1876 .strip-link.is-static { 1877 color: var(--mute); 1878 cursor: default 1879 } 1880 1881 .strip-l
1881ink.is-static:hover { 1882 color: var(--mute); 1883 background: none 1884 } 1885 1886 .strip-link:hover .pip { 1887 color: var(--paper) 1888 } 1889 1890 /* ====== SECTION SHELL ====== */ 1891 section.shell { 1892 padding: var(--space-section) var(--shell-pad); 1893 position: relative 1894 } 1895 1896 section.shell.tight { 1897 padding: var(--space-section-tight) var(--shell-pad) 1898 } 1899 1900 /* A section that butts straight onto the one above it. Pages were 1901 writing style="padding-top:0" for this, ~1,400 inline styles' worth 1902 of ad-hoc rhythm across the site; new work uses the modifier. */ 1903 section.shell.flush { 1904 padding-top: 0 1905 } 1906 1907 section.shell.flush-bottom { 1908 padding-bottom: 0 1909 } 1910 1911 .section-hd { 1912 display: flex; 1913 justify-content: space-between; 1914 align-items: flex-end; 1915 gap: 32px; 1916 margin-bottom: 64px; 1917 flex-wrap: wrap 1918 } 1919 1920 .section-hd h2 { 1921 font-family: var(--serif); 1922 font-weight: 600; 1923 font-size: var(--t-h2); 1924 line-height: var(--lh-head); 1925 letter-spacing: var(--ls-head); 1926 max-width: 18ch 1927 } 1928 1929 .section-hd h2 .it, 1930 .section-hd h2 .blue { 1931 font-family: var(--serif); 1932 font-style: normal; 1933 font-weight: 600; 1934 color: var(--signal) 1935 } 1936 1937 .section-hd .lede { 1938 max-width: 46ch; 1939 color: var(--bone); 1940 line-height: var(--lh-body); 1941 font-size: var(--t-lede) 1942 } 1943 1944 /* ====== SLAB ====== */ 1945 /* V2 design language: a ruled band rather than a filled, rounded slab */ 1946 .slab { 1947 display: grid; 1948 grid-template-columns:1.1fr 1fr; 1949 gap: 0; 1950 border-top: 1px solid var(--line-2); 1951 overflow: hidden 1952 } 1953 1954 .slab-l { 1955 padding: clamp(40px, 5vw, 64px) clamp(28px, 4vw, 56px) clamp(40px, 5vw, 64px) 0; 1956 display: flex; 1957 flex-direction: column; 1958 justify-content: center; 1959 gap: 40px 1960 } 1961 1962 .slab-l h3 { 1963 font-family: var(--serif); 1964 font-weight: 600; 1965 font-size: clamp(36px, 4.4vw, 60px); 1966 line-height: .98; 1967 letter-spacing: -.02em 1968 } 1969 1970 .slab-l h3 .it { 1971 font-family: var(--serif); 1972 font-weight: 600; 1973 color: var(--signal) 1974 } 1975 1976 .slab-l h3 .blue { 1977 font-family: var(--serif); 1978 font-weight: 600; 1979 color: var(--plasma-bright) 1980 } 1981 1982 .slab-l p { 1983 color: var(--bone); 1984 font-size: 15px; 1985 line-height: 1.6; 1986 max-width: 42ch 1987 } 1988 1989 .slab-l ul { 1990 list-style: none; 1991 display: flex; 1992 flex-direction: column; 1993 gap: 14px; 1994 font-size: 14px; 1995 color: var(--bone) 1996 } 1997 1998 .slab-l ul li { 1999 display: flex; 2000 gap: 12px; 2001 align-items: flex-start; 2002 padding-bottom: 14px; 2003 border-bottom: 1px dashed var(--line) 2004 } 2005 2006 .slab-l ul li:last-child { 2007 border-bottom: 0; 2008 padding-bottom: 0 2009 } 2010 2011 .slab-l ul li::before { 2012 content: ""; 2013 flex: 0 0 8px; 2014 width: 8px; 2015 height: 8px; 2016 border-radius: 50%; 2017 margin-top: 7px; 2018 background: var(--signal); 2019 box-shadow: 0 0 12px var(--signal) 2020 } 2021 2022 .slab-l ul li b { 2023 color: var(--paper); 2024 font-weight: 500 2025 } 2026 2027 .slab-r { 2028 position: relative; 2029 padding: 46px 0; 2030 background: radial-gradient(closest-side at 50% 30%, rgba(49, 138, 190, .18), transparent 70%); 2031 display: flex; 2032 align-items: center; 2033 justify-content: center; 2034 overflow: hidden; 2035 min-height: 520px 2036 } 2037 2038 .slab-r::before { 2039 content: ""; 2040 position: absolute; 2041 inset: 0; 2042 background-image: linear-gradient(to right, var(--line) 1px, transparent 1px), linear-gradient(to bottom, var(--line) 1px, transparent 1px); 2043 background-size: 48px 48px; 2044 mask: radial-gradient(closest-side, #000, transparent 70%) 2045 } 2046 2047 .slab-r::after { 2048 content: ""; 2049 position: absolute; 2050 inset: 0; 2051 pointer-events: none; 2052 background: linear-gradient(to bottom, var(--ink) 0, transparent 13%, transparent 87%, var(--ink) 100%) 2053 } 2054 2055 /* ====== PHONE FRAME ====== */ 2056 .phone-frame { 2057 position: relative; 2058 width: 280px; 2059 aspect-ratio: 9/19; 2060 border-radius: 38px; 2061 background: linear-gradient(180deg, #1a1d22, #0a0d10); 2062 padding: 8px; 2063 box-shadow: 0 60px 120px -30px rgba(0, 0, 0, .9), 0 0 0 1px rgba(255, 255, 255, .06) inset 2064 } 2065 2066 .phone-frame::before { 2067 content: ""; 2068 position: absolute; 2069 top: 14px; 2070 left: 50%; 2071 transform: translateX(-50%); 2072 width: 90px; 2073 height: 24px; 2074 background: #000; 2075 border-radius: 14px; 2076 z-index: 2 2077 } 2078 2079 .phone-screen { 2080 width: 100%; 2081 height: 100%; 2082 border-radius: 32px; 2083 background: linear-gradient(180deg, #0a0d12, #13171f); 2084 overflow: hidden; 2085 position: relative; 2086 display: flex; 2087 flex-direction: column; 2088 padding: 42px 14px 14px; 2089 font-family: var(--mono); 2090 font-size: var(--t-label) 2091 } 2092 2093 /* Light mode: silver handset + light app screen (text inside uses tokens, so it flips to dark) */ 2094 html[data-theme="light"] .phone-frame { 2095 background: linear-gradient(180deg, #dde0e6, #b7bcc6); 2096 box-shadow: 0 50px 90px -30px var(--shadow-deep), 0 0 0 1px rgba(0, 0, 0, .12) inset 2097 } 2098 2099 html[data-theme="light"] .phone-screen { 2100 background: linear-gradient(180deg, #ffffff, #f4f1e8) 2101 } 2102 2103 .phone-screen .stat-row { 2104 display: flex; 2105 justify-content: space-between; 2106 color: var(--bone); 2107 font-size: 9px; 2108 letter-spacing: .06em; 2109 padding: 0 6px 14px 2110 } 2111 2112 .phone-screen .ph-h { 2113 font-family: var(--serif); 2114 font-weight: 600; 2115 font-size: 24px; 2116 color: var(--paper); 2117 padding: 0 6px; 2118 letter-spacing: -.02em; 2119 line-height: 1 2120 } 2121 2122 .phone-screen .ph-h .it { 2123 font-family: var(--serif); 2124 font-weight: 600; 2125 color: var(--signal) 2126 } 2127 2128 .phone-screen .ph-h .blue { 2129 font-family: var(--serif); 2130 font-weight: 600; 2131 color: var(--plasma-bright) 2132 } 2133 2134 .phone-screen .ph-card { 2135 margin-top: 14px; 2136 background: var(--surface-2); 2137 border: 1px solid var(--line); 2138 border-radius: 14px; 2139 padding: 12px; 2140 display: flex; 2141 flex-direction: column; 2142 gap: 8px 2143 } 2144 2145 .phone-screen .ph-card .lbl { 2146 color: var(--mute); 2147 font-size: 9px; 2148 text-transform: uppercase; 2149 letter-spacing: .16em 2150 } 2151 2152 .phone-screen .ph-card .name { 2153 color: var(--paper); 2154 font-size: 12px 2155 } 2156 2157 .phone-screen .ph-card .meta { 2158 color: var(--bone); 2159 font-size: 9px; 2160 display: flex; 2161 gap: 8px 2162 } 2163 2164 .phone-screen .ph-card .meta i { 2165 font-style: normal; 2166 color: var(--signal) 2167 } 2168 2169 .phone-screen .ph-bar { 2170 margin-top: 4px; 2171 display: flex; 2172 align-items: center; 2173 gap: 6px 2174 } 2175 2176 .phone-screen .ph-bar .b { 2177 flex: 1; 2178 height: 3px; 2179 border-radius: 2px; 2180 background: var(--line) 2181 } 2182 2183 .phone-screen .ph-bar .b.on { 2184 background: var(--signal); 2185 box-shadow: 0 0 8px var(--signal) 2186 } 2187 2188 .phone-screen .ph-cta { 2189 margin-top: auto; 2190 background: var(--signal); 2191 color: var(--ink); 2192 padding: 10px; 2193 border-radius: 999px; 2194 text-align: center; 2195 font-size: 11px; 2196 font-weight: 600; 2197 font-family: var(--sans); 2198 letter-spacing: .02em 2199 } 2200 2201 /* ====== METRICS ====== */ 2202 .metrics { 2203 display: grid; 2204 grid-template-columns:repeat(12, 1fr); 2205 gap: 0 clamp(24px, 3vw, 40px) 2206 } 2207 2208 /* ruled stats, the way the V2 proof block does them */ 2209 .metric { 2210 grid-column: span 3; 2211 border-top: 1px solid var(--line-2); 2212 padding: 24px 0 0; 2213 position: relative; 2214 overflow: hidden; 2215 min-height: 170px; 2216 display: flex; 2217 flex-direction: column; 2218 justify-content: space-between; 2219 transition: border-color .3s var(--ease) 2220 } 2221 2222 .metric:hover { 2223 border-top-color: var(--signal) 2224 } 2225 2226 .metric .lbl { 2227 font-family: var(--mono); 2228 font-size: var(--t-label); 2229 letter-spacing: .16em; 2230 text-transform: uppercase; 2231 color: var(--mute) 2232 } 2233 2234 .metric .val { 2235 font-family: var(--serif); 2236 font-weight: 600; 2237 font-size: 60px; 2238 line-height: 1; 2239 letter-spacing: -.04em; 2240 } 2241 2242 .metric .val small { 2243 font-size: 18px; 2244 color: var(--mute); 2245 font-family: var(--mono); 2246 margin-left: 4px 2247 } 2248 2249 .metric .delta { 2250 font-family: var(--mono); 2251 font-size: 11px; 2252 color: var(--signal) 2253 } 2254 2255 .metric .delta.dn { 2256 color: var(--coral) 2257 } 2258 2259 .metric.wide { 2260 grid-column: span 6 2261 } 2262 2263 /* ====== TIERS ====== */ 2264 .tiers { 2265 display: grid; 2266 grid-template-columns:repeat(3, 1fr); 2267 gap: 18px 2268 } 2269 2270 /* Pricing tiers in the V2 language: a rule, a label, a number. They were 2271 rounded, filled cards, and the featured one was picked out with a 2272 masked gradient border. A plan is now marked out by the weight and 2273 colour of its rule instead, which is how the V2 price blocks do it. */ 2274 .tier { 2275 position: relative; 2276 border-top: 2px solid var(--line-2); 2277 padding: clamp(26px, 3vw, 40px) 0 0; 2278 display: flex; 2279 flex-direction: column; 2280 gap: 24px; 2281 transition: border-color .3s var(--ease) 2282 } 2283 2284 .tier:hover { 2285 border-top-color: var(--mute-2) 2286 } 2287 2288 .tier.featured { 2289 border-top-color: var(--signal) 2290 } 2291 2292 .tier.featured:hover { 2293 border-top-color: var(--signal) 2294 } 2295 2296 .tier .row1 { 2297 display: flex; 2298 justify-content: space-between; 2299 align-items: center 2300 } 2301 2302 .tier .name { 2303 font-family: var(--mono); 2304 font-size: 11px; 2305 text-transform: uppercase; 2306 letter-spacing: .18em; 2307 color: var(--bone) 2308 } 2309 2310 /* was a filled badge; the rule above already says which plan this is */ 2311 .tier .badge { 2312 font-family: var(--mono); 2313 font-size: var(--t-label); 2314 color: var(--signal); 2315 letter-spacing: .14em; 2316 text-transform: uppercase 2317 } 2318 2319 .tier .price { 2320 font-family: var(--serif); 2321 font-weight: 600; 2322 font-size: 64px; 2323 line-height: .95; 2324 letter-spacing: -.035em 2325 } 2326 2327 .tier .price small { 2328 font-family: var(--mono); 2329 font-size: 13px; 2330 color: var(--mute); 2331 margin-left: 6px 2332 } 2333
2334 .tier .desc { 2335 font-size: 14px; 2336 color: var(--bone); 2337 line-height: 1.5; 2338 border-top: 1px dashed var(--line); 2339 padding-top: 20px 2340 } 2341 2342 .tier ul { 2343 list-style: none; 2344 display: flex; 2345 flex-direction: column; 2346 gap: 10px; 2347 font-size: 14px; 2348 color: var(--bone) 2349 } 2350 2351 .tier ul li { 2352 display: flex; 2353 gap: 10px; 2354 align-items: flex-start 2355 } 2356 2357 .tier ul li svg { 2358 flex: 0 0 16px; 2359 color: var(--signal); 2360 margin-top: 3px 2361 } 2362 2363 .tier .cta { 2364 margin-top: auto 2365 } 2366 2367 /* ====== EDITORIAL QUOTE ====== */ 2368 .editorial { 2369 display: grid; 2370 grid-template-columns:1fr 1.4fr; 2371 gap: 64px; 2372 align-items: center 2373 } 2374 2375 .ed-num { 2376 font-family: var(--mono); 2377 font-size: 11px; 2378 color: var(--mute); 2379 letter-spacing: .18em; 2380 text-transform: uppercase; 2381 margin-bottom: 24px 2382 } 2383 2384 .ed-quote { 2385 font-family: var(--serif); 2386 font-weight: 600; 2387 font-size: clamp(28px, 3.4vw, 46px); 2388 line-height: 1.1; 2389 letter-spacing: -.02em; 2390 } 2391 2392 .ed-quote .it { 2393 font-family: var(--serif); 2394 font-weight: 600 2395 } 2396 2397 .ed-quote .hl { 2398 background: linear-gradient(180deg, transparent 62%, color-mix(in srgb, var(--accent) 55%, transparent) 62%); 2399 color: inherit; 2400 padding: 0 2px; 2401 -webkit-box-decoration-break: clone; 2402 box-decoration-break: clone 2403 } 2404 2405 .ed-attr { 2406 margin-top: 32px; 2407 display: flex; 2408 align-items: center; 2409 gap: 16px; 2410 color: var(--mute); 2411 font-family: var(--mono); 2412 font-size: 12px; 2413 letter-spacing: .04em 2414 } 2415 2416 .ed-attr .av { 2417 width: 46px; 2418 height: 46px; 2419 border-radius: 50%; 2420 background: var(--grad); 2421 display: grid; 2422 place-items: center; 2423 color: var(--ink); 2424 font-family: var(--serif); 2425 font-weight: 500; 2426 font-size: 18px 2427 } 2428 2429 .ed-attr b { 2430 color: var(--paper); 2431 font-weight: 500; 2432 font-family: var(--sans); 2433 text-transform: none; 2434 letter-spacing: 0 2435 } 2436 2437 /* ====== APP STRIP ====== */ 2438 /* V2 lays the app section out as a ruled band with the phone beside the 2439 copy, not as a filled panel with the whole thing inside it. */ 2440 .app { 2441 display: grid; 2442 grid-template-columns:1.2fr 1fr; 2443 gap: clamp(32px, 5vw, 80px); 2444 align-items: center; 2445 padding: clamp(48px, 6vw, 80px) 0 0; 2446 border-top: 1px solid var(--line-2); 2447 position: relative 2448 } 2449 2450 /* the glow behind the phone belonged to the filled panel this section 2451 used to sit in; a ruled band carries no lighting of its own */ 2452 .app::before { 2453 content: none 2454 } 2455 2456 .app-l { 2457 position: relative; 2458 z-index: 1 2459 } 2460 2461 /* Was a violet pill. The V2 language has no pills: a kicker is a rule, 2462 then mono caps. The leading dot in the markup is redundant against 2463 the rule, so it is not rendered. */ 2464 .app-tag { 2465 display: flex; 2466 align-items: center; 2467 gap: 12px; 2468 font-family: var(--mono); 2469 font-size: 11px; 2470 color: var(--mute-2); 2471 text-transform: uppercase; 2472 letter-spacing: .22em 2473 } 2474 2475 .app-tag::before { 2476 content: ""; 2477 flex: 0 0 28px; 2478 height: 1px; 2479 background: var(--signal) 2480 } 2481 2482 .app h2 { 2483 font-family: var(--serif); 2484 font-weight: 600; 2485 font-size: clamp(36px, 4.6vw, 68px); 2486 line-height: .98; 2487 letter-spacing: -.025em; 2488 margin-top: 24px; 2489 } 2490 2491 .app h2 .it { 2492 font-family: var(--serif); 2493 font-weight: 600; 2494 color: var(--signal) 2495 } 2496 2497 .app p { 2498 color: var(--bone); 2499 max-width: 48ch; 2500 margin-top: 20px; 2501 font-size: 15px; 2502 line-height: 1.6 2503 } 2504 2505 /* ââ Store badges (x-app-badges) âââââââââââââââââââââââââââââââââââ 2506 Apple's and Google's own artwork, which neither will let anybody 2507 redraw. What used to sit here was our own box with a hand-drawn 2508 glyph and the store name set in the site's serif, which is exactly 2509 what both sets of guidelines forbid. 2510 2511 Both files are the black badge with white type. On the light theme 2512 that is the standard treatment. On the dark theme the pill sinks 2513 into the page, so a hairline gives it its edge back; the white 2514 lettering carries either way. */ 2515 .app-stores { 2516 margin-top: 32px; 2517 display: flex; 2518 align-items: center; 2519 gap: 14px; 2520 flex-wrap: wrap 2521 } 2522 2523 .app-badge { 2524 display: inline-block; 2525 border-radius: 8px; 2526 box-shadow: 0 0 0 1px var(--line); 2527 transition: opacity .25s var(--ease), box-shadow .25s var(--ease) 2528 } 2529 2530 html[data-theme="light"] .app-badge { 2531 box-shadow: none 2532 } 2533 2534 .app-badge:hover { 2535 opacity: .82; 2536 box-shadow: 0 0 0 1px var(--line-2) 2537 } 2538 2539 .app-badge img { 2540 display: block; 2541 height: var(--app-badge-h, 56px); 2542 width: auto 2543 } 2544 2545 /* Two badges side by side stop fitting a phone at about 340px, and a 2546 badge that has to shrink stops being the store's badge. Let them
2547 stack instead. */ 2548 @media (max-width: 420px) { 2549 .app-badge img { 2550 height: calc(var(--app-badge-h, 56px) * .82) 2551 } 2552 } 2553 2554 2555 .app-r { 2556 position: relative; 2557 z-index: 1; 2558 display: flex; 2559 justify-content: center; 2560 align-items: center 2561 } 2562 2563 .app-phone { 2564 transform: rotate(-6deg) 2565 } 2566 2567 .app-phone .phone-screen { 2568 padding: 42px 12px 12px 2569 } 2570 2571 .app-phone .ph-h { 2572 font-size: 18px 2573 } 2574 2575 /* ====== FORMS ====== */ 2576 /* The demo deck and other steppers hide panels with the hidden 2577 attribute; any display rule on the element would otherwise win. */ 2578 [hidden] { 2579 display: none !important 2580 } 2581 2582 .form { 2583 display: grid; 2584 gap: 18px 2585 } 2586 2587 .form .row { 2588 display: grid; 2589 gap: 18px; 2590 grid-template-columns:1fr 1fr 2591 } 2592 2593 .form .field { 2594 display: flex; 2595 flex-direction: column; 2596 gap: 6px; 2597 position: relative 2598 } 2599 2600 .form .field label { 2601 font-family: var(--mono); 2602 font-size: var(--t-label); 2603 color: var(--mute); 2604 text-transform: uppercase; 2605 letter-spacing: .18em 2606 } 2607 2608 /* squared off; the ruled language has no rounded fields in it */ 2609 .form .field input, .form .field select, .form .field textarea { 2610 background: var(--surface); 2611 border: 1px solid var(--line); 2612 border-radius: 2px; 2613 padding: 14px 16px; 2614 color: var(--paper); 2615 font-size: 15px; 2616 font-family: var(--sans); 2617 transition: .25s var(--ease); 2618 } 2619 2620 .form .field input:focus, .form .field select:focus, .form .field textarea:focus { 2621 outline: none; 2622 border-color: var(--signal); 2623 background: var(--ink-3); 2624 box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 22%, transparent) 2625 } 2626 2627 .form .field input::placeholder, .form .field textarea::placeholder { 2628 color: var(--mute-2) 2629 } 2630 2631 .form .field textarea { 2632 min-height: 120px; 2633 resize: vertical; 2634 line-height: 1.5 2635 } 2636 2637 .form .radios { 2638 display: grid; 2639 grid-template-columns:repeat(2, 1fr); 2640 gap: 10px 2641 } 2642 2643 /* Options in the V2 language: a hairline and square corners rather than 2644 a filled, rounded card each. They keep a full border rather than only 2645 a top rule because they sit in a two-column grid and have to read as 2646 separately selectable, which a top rule alone does not convey. The 2647 control marks themselves stay round: a radio dot is an affordance 2648 people know by its shape, not decoration. */ 2649 .form .radio, 2650 .form .check { 2651 position: relative; 2652 display: flex; 2653 align-items: flex-start; 2654 gap: 12px; 2655 padding: 16px; 2656 border: 1px solid var(--line); 2657 border-radius: 2px; 2658 cursor: pointer; 2659 transition: .25s var(--ease); 2660 background: none 2661 } 2662 2663 .form .radio:hover, 2664 .form .check:hover { 2665 border-color: var(--line-2); 2666 background: var(--surface-2) 2667 } 2668 2669 .form .radio input, 2670 .form .check input { 2671 position: absolute; 2672 opacity: 0; 2673 pointer-events: none 2674 } 2675 2676 .form .radio .dot { 2677 width: 18px; 2678 height: 18px; 2679 border-radius: 50%; 2680 border: 1px solid var(--line-2); 2681 flex: 0 0 18px; 2682 display: grid; 2683 place-items: center; 2684 margin-top: 2px; 2685 transition: .25s 2686 } 2687 2688 .form .radio .dot::after { 2689 content: ""; 2690 width: 8px; 2691 height: 8px; 2692 border-radius: 50%; 2693 background: var(--signal); 2694 transform: scale(0); 2695 transition: .25s; 2696 box-shadow: 0 0 8px var(--signal) 2697 } 2698 2699 .form .radio input:checked ~ .dot {
2700 border-color: var(--signal) 2701 } 2702 2703 .form .radio input:checked ~ .dot::after { 2704 transform: scale(1) 2705 } 2706 2707 .form .radio:has(input:checked), 2708 .form .check:has(input:checked) { 2709 border-color: var(--signal); 2710 background: color-mix(in srgb, var(--signal) 6%, transparent) 2711 } 2712 2713 /* Same card as a radio, squared off with a tick so it reads as a 2714 multi-select rather than one of a set. */ 2715 .form .check .box { 2716 width: 18px; 2717 height: 18px; 2718 border-radius: 5px; 2719 border: 1px solid var(--line-2); 2720 flex: 0 0 18px; 2721 display: grid; 2722 place-items: center; 2723 margin-top: 2px; 2724 transition: .25s 2725 } 2726 2727 .form .check .box::after { 2728 content: ""; 2729 width: 10px; 2730 height: 5px; 2731 margin-top: -2px; 2732 border-left: 2px solid var(--signal); 2733 border-bottom: 2px solid var(--signal); 2734 transform: rotate(-45deg) scale(0); 2735 transition: .25s 2736 } 2737 2738 .form .check input:checked ~ .box { 2739 border-color: var(--signal) 2740 } 2741 2742 .form .check input:checked ~ .box::after { 2743 transform: rotate(-45deg) scale(1) 2744 } 2745 2746 .form .radio .ttl, 2747 .form .check .ttl { 2748 font-family: var(--serif); 2749 font-weight: 400; 2750 font-size: 18px; 2751 letter-spacing: -.01em; 2752 color: var(--paper); 2753 line-height: 1 2754 } 2755 2756 .form .radio .sub, 2757 .form .check .sub { 2758 font-size: 12px; 2759 color: var(--bone); 2760 margin-top: 4px; 2761 line-height: 1.4 2762 } 2763 2764 .form .actions { 2765 display: flex; 2766 justify-content: space-between; 2767 align-items: center; 2768 gap: 16px; 2769 flex-wrap: wrap; 2770 margin-top: 8px 2771 } 2772 2773 .form .actions .note { 2774 font-size: 12px; 2775 color: var(--mute); 2776 font-family: var(--mono); 2777 letter-spacing: .04em 2778 } 2779 2780 /* ====== PLAN DISPLAY (live price panel under agent_type radios) ====== */ 2781 /* The running total of what has been picked. Was a rounded card filled 2782 with a blue-to-green wash; in the V2 language a price is a rule and a 2783 number, so it is ruled top and bottom and carries no fill. */ 2784 .plan-display { 2785 display: grid; 2786 grid-template-columns:1fr auto; 2787 gap: 18px; 2788 align-items: center; 2789 padding: 22px 0; 2790 margin-top: 24px; 2791 border-top: 1px solid var(--line-2); 2792 border-bottom: 1px solid var(--line); 2793 position: relative; 2794 } 2795 2796 .plan-display::before { 2797 content: ""; 2798 position: absolute; 2799 top: 0; 2800 left: 0; 2801 right: 0; 2802 height: 1px; 2803 background: linear-gradient(90deg, transparent, var(--signal), transparent); 2804 opacity: .6 2805 } 2806 2807 .plan-display-label { 2808 font-family: var(--serif); 2809 font-weight: 400; 2810 font-size: 18px; 2811 letter-spacing: -.01em; 2812 color: var(--paper); 2813 line-height: 1.1 2814 } 2815 2816 .plan-display-sub { 2817 font-family: var(--sans); 2818 font-size: 12px; 2819 color: var(--bone); 2820 line-height: 1.5; 2821 margin-top: 4px; 2822 max-width: 38ch 2823 } 2824 2825 .plan-display-right { 2826 text-align: right; 2827 flex: 0 0 auto 2828 } 2829 2830 .plan-display-price { 2831 font-family: var(--serif); 2832 font-weight: 600; 2833 font-size: 34px; 2834 line-height: 1; 2835 letter-spacing: -.025em; 2836 color: var(--signal); 2837 white-space: nowrap 2838 } 2839 2840 .plan-display-price small { 2841 font-family: var(--mono); 2842 font-size: 11px; 2843 color: var(--mute); 2844 margin-left: 4px; 2845 font-weight: 400 2846 } 2847 2848 .plan-display-tier { 2849 font-family: var(--mono); 2850 font-size: 9.5px; 2851 text-transform: uppercase; 2852 letter-spacing: .16em; 2853 color: var(--mute); 2854 margin-top: 6px 2855 } 2856 2857 /* Spells out how long the quoted founding rate lasts and what it becomes. */ 2858 .plan-display-note { 2859 font-family: var(--sans); 2860 font-size: 11.5px; 2861 line-height: 1.5; 2862 color: var(--mute); 2863 margin-top: 6px; 2864 max-width: 34ch; 2865 margin-left: auto 2866 } 2867 2868 .plan-asterisk { 2869 font-family: var(--sans); 2870 font-size: 11.5px; 2871 line-height: 1.5; 2872 color: var(--mute); 2873 margin-top: 10px; 2874 padding: 0 4px 2875 } 2876 2877 .plan-asterisk span { 2878 color: var(--signal); 2879 font-weight: 600; 2880 margin-right: 2px 2881 } 2882 2883 /* Shown under "Pick your agent" only for plans that pair with another 2884 one (currently the Outgoing Agent, which wants an incoming agent to 2885 catch the return calls). Toggled by the plan-display script. */ 2886 .plan-recommend { 2887 font-family: var(--sans); 2888 font-size: 12.5px; 2889 line-height: 1.55; 2890 color: var(--bone); 2891 margin-top: 12px; 2892 padding: 10px 12px; 2893 border-left: 2px solid var(--signal); 2894 background: rgba(49, 138, 190, .07) 2895 } 2896 2897 @media (max-width: 480px) { 2898 .plan-display { 2899 grid-template-columns:1fr; 2900 gap: 10px 2901 } 2902 2903 .plan-display-right { 2904 text-align: left 2905 } 2906 2907 .plan-display-price { 2908 font-size: 30px 2909 } 2910 } 2911 2912 /* ====== END CTA ====== */ 2913 .endcta { 2914 padding: 140px var(--shell-pad); 2915 position: relative; 2916 overflow: hidden; 2917 text-align: center 2918 } 2919 2920 .endcta .endcta-photo { 2921 position: absolute; 2922 inset: 0; 2923 background-image: url('/media/frontend/nz-skyline-dusk.jpg'); 2924 background-size: cover; 2925 background-position: center bottom; 2926 opacity: .32; 2927 filter: saturate(.9) contrast(1.1); 2928 z-index: 0 2929 } 2930 2931 .endcta .endcta-photo::after { 2932 content: ""; 2933 position: absolute; 2934 inset: 0; 2935 background: linear-gradient(180deg, var(--scrim-strong) 0%, var(--scrim-mid) 30%, var(--scrim-soft) 70%, var(--scrim-strong) 100%), 2936 radial-gradient(ellipse at center, rgba(49, 138, 190, .22) 0%, transparent 60%) 2937 } 2938 2939 .endcta > * { 2940 position: relative; 2941 z-index: 1 2942 } 2943 2944 .endcta::before { 2945 content: ""; 2946 position: absolute; 2947 inset: 0; 2948 z-index: 0 2949 } 2950 2951 .endcta .stamp { 2952 font-family: var(--mono); 2953 font-size: 11px; 2954 color: var(--mute); 2955 text-transform: uppercase; 2956 letter-spacing: .2em; 2957 margin-bottom: 24px; 2958 display: flex; 2959 justify-content: center; 2960 align-items: center; 2961 gap: 14px 2962 } 2963 2964 .endcta .stamp::before, .endcta .stamp::after { 2965 content: ""; 2966 flex: 0 0 80px; 2967 height: 1px; 2968 background: var(--line) 2969 } 2970 2971 .endcta h2 { 2972 font-family: var(--serif); 2973 font-weight: 600; 2974 font-size: var(--t-display); 2975 line-height: var(--lh-display); 2976 letter-spacing: var(--ls-head) 2977 } 2978 2979 .endcta h2 .it { 2980 font-family: var(--serif); 2981 font-weight: 600; 2982 color: var(--signal) 2983 } 2984 2985 .endcta h2 .blue { 2986 font-family: var(--serif); 2987 font-weight: 600; 2988 color: var(--plasma-bright) 2989 } 2990 2991 /* The two numbers were pills with a circular icon badge each. In the V2 2992 language a number is a rule, a mono label and the figure itself: the 2993 same shape the price blocks use, so the closing line of every page 2994 rhymes with the pricing. The rule fills with the brand gradient on 2995 hover, which is the only affordance it needs. */ 2996 .endcta .num-big { 2997 margin-top: 0; 2998 position: relative; 2999 display: block; 3000 text-align: left; 3001 padding: 26px 0 0; 3002 font-family: var(--serif); 3003 font-size: clamp(30px, 3.2vw, 44px); 3004 font-weight: 600; 3005 line-height: 1.1; 3006 letter-spacing: var(--ls-head); 3007 color: var(--paper); 3008 transition: color .3s var(--ease) 3009 } 3010 3011 .endcta .num-big::before, .endcta .num-big::after { 3012 content: ""; 3013 position: absolute; 3014 top: 0; 3015 left: 0; 3016 right: 0; 3017 height: 1px 3018 } 3019 3020 .endcta .num-big::before { 3021 background: var(--line-2) 3022 } 3023 3024 .endcta .num-big::after { 3025 background: var(--grad); 3026 transform: scaleX(0); 3027 transform-origin: left; 3028 transition: transform .5s var(--ease-out) 3029 } 3030 3031 .endcta .num-big:hover::after { 3032 transform: scaleX(1) 3033 } 3034 3035 .endcta .num-big:hover { 3036 color: var(--signal) 3037 } 3038 3039 .endcta .num-big.num-blue:hover { 3040 color: var(--plasma-bright) 3041 } 3042 3043 /* the icon badges go with the pills */ 3044 .endcta .num-big .ic { 3045 display: none 3046 } 3047 3048 .endcta .num-big small { 3049 display: block; 3050 margin-bottom: 14px; 3051 font-family: var(--mono); 3052 font-size: var(--t-label); 3053 color: var(--mute); 3054 letter-spacing: .18em; 3055 text-transform: uppercase; 3056 line-height: 1.5 3057 } 3058 3059 .endcta .endcta-meta { 3060 margin-top: 32px; 3061 display: flex; 3062 justify-content: center; 3063 gap: 32px; 3064 font-family: var(--mono); 3065 font-size: 11px; 3066 color: var(--mute); 3067 text-transform: uppercase; 3068 letter-spacing: .14em; 3069 flex-wrap: wrap 3070 } 3071 3072 /* ====== FOOTER ====== */ 3073 .foot { 3074 padding: 80px var(--shell-pad) 32px; 3075 border-top: 1px solid var(--line); 3076 background: var(--ink-2) 3077 } 3078 3079 /* Brand block plus five link columns. Six tracks only pay off on a wide 3080 screen; between 1100 and 1400 the brand column gives ground and the 3081 gap tightens rather than the links wrapping to a second row. */ 3082 .foot-grid { 3083 display: grid; 3084 grid-template-columns:2fr repeat(5, 1fr); 3085 gap: 48px; 3086 margin-bottom: 64px 3087 } 3088 3089 @media (max-width: 1400px) { 3090 .foot-grid { 3091 grid-template-columns:1.4fr repeat(5, 1fr); 3092 gap: 28px 3093 } 3094 } 3095 3096 .foot h4 { 3097 font-family: var(--mono); 3098 font-size: 11px; 3099 color: var(--mute); 3100 text-transform: uppercase; 3101 letter-spacing: .16em; 3102 margin-bottom: 16px 3103 } 3104 3105 .foot ul { 3106 list-style: none; 3107 display: flex; 3108 flex-direction: column; 3109 gap: 8px; 3110 font-size: 13px; 3111 color: var(--bone) 3112 } 3113 3114 .foot ul a { 3115 transition: .25s 3116 } 3117 3118 .foot ul a:hover { 3119 color: var(--signal) 3120 } 3121 3122 .foot-brand p { 3123 margin-top: 16px; 3124 color: var(--bone); 3125 font-size: 13px; 3126 line-height: 1.55; 3127 max-width: 36ch 3128 } 3129 3130 .foot-bot { 3131 display: flex; 3132 justify-content: space-between; 3133 align-items: center; 3134 padding-top: 32px; 3135 border-top: 1px solid var(--line); 3136 font-family: var(--mono); 3137 font-size: 11px; 3138 color: var(--mute); 3139 letter-spacing: .06em; 3140 flex-wrap: wrap; 3141 gap: 16px 3142 } 3143 3144 /* ====== V2 RULED VOCABULARY ====== 3145 The shared shapes of the V2 design language, so a new section does 3146 not have to hand-roll the hairline pair again. The language is: 3147 3148 · no boxed cards. A block is a rule and the copy under it. 3149 · no icon marks, no tag pills, no lift-on-hover. 3150 · the rule fills with the brand gradient as the block scrolls in, 3151 which is the only motion a block gets. 3152 · a price, a phone number and a stat all take the same shape: 3153 a rule, a mono label, and a big serif figure. 3154 3155 Reach for these on anything new. The older components (.cap-plate, 3156 .step, .tier, .metric, .trade) carry their own copies of the same 3157 shapes because their markup predates this block; they are not worth 3158 rewriting just to share four declarations, but they must not drift. 3159 3160 <div class="ruled-set r"> 3161 <div class="ruled-col">...</div> 3162 </div> 3163 3164 .r on the container is what starts the fill: the site-wide reveal 3165 observer adds .in, and .ruled-set.in is the trigger. */ 3166 .ruled-set { 3167 display: grid; 3168 gap: clamp(20px, 2.6vw, 40px) 3169 } 3170 3171 .ruled-set.cols-2 { grid-template-columns:repeat(2, 1fr) } 3172 .ruled-set.cols-3 { grid-template-columns:repeat(3, 1fr) } 3173 .ruled-set.cols-4 { grid-template-columns:repeat(4, 1fr) } 3174 3175 .ruled-col { 3176 position: relative; 3177 padding: 30px 0 0 3178 } 3179 3180 .ruled-col::before, .ruled-col::after { 3181 content: ""; 3182 position: absolute; 3183 top: 0; 3184 left: 0; 3185 right: 0; 3186 height: 1px 3187 } 3188 3189 .ruled-col::before { background: var(--line-2) } 3190 3191 .ruled-col::after { 3192 background: var(--grad); 3193 transform: scaleX(0); 3194 transform-origin: left; 3195 transition: transform .9s var(--ease-out) 3196 } 3197 3198 /* the reveal class lands on the container in most sections and on the 3199 column itself in a few, so both spellings start the fill */ 3200 .ruled-set.in .ruled-col::after, .ruled-col.in::after { 3201 transform: scaleX(1) 3202 } 3203 3204 .ruled-set.in .ruled-col:nth-child(2)::after { transition-delay: .12s } 3205 .ruled-set.in .ruled-col:nth-child(3)::after { transition-delay: .24s } 3206 .ruled-set.in .ruled-col:nth-child(4)::after { transition-delay: .36s } 3207 3208 .ruled-col h3 { 3209 font-family: var(--serif); 3210 font-weight: 600; 3211 font-size: var(--t-h3); 3212 line-height: var(--lh-head); 3213 letter-spacing: var(--ls-head); 3214 color: var(--paper) 3215 } 3216 3217 .ruled-col h3 .it { 3218 font-family: var(--serif); 3219 font-style: normal; 3220 font-weight: 600; 3221 color: var(--signal) 3222 } 3223 3224 .ruled-col p { 3225 margin-top: 12px; 3226 color: var(--bone); 3227 font-size: var(--t-body); 3228 line-height: var(--lh-body) 3229 } 3230 3231 .ruled-col p b { color: var(--paper); font-weight: 500 } 3232 3233 .ruled-col .tag { 3234 margin-top: 18px; 3235 display: inline-block; 3236 font-family: var(--mono); 3237 font-weight: 500; 3238 font-size: var(--t-label); 3239 letter-spacing: var(--ls-label); 3240 text-transform: uppercase; 3241 color: var(--signal) 3242 } 3243 3244 /* A ruled index: numbered rows under one another, each a hairline, a 3245 name, a description and a tag. This is the /v2 service index and the 3246 shape the FAQ and the wellness escalation ladder both take. Rows may 3247 be links or plain divs; only the links get the sliding arrow. 3248 3249 <div class="rul
3249ed-index r"> 3250 <a class="ruled-row" href="..."> 3251 <span class="num">01</span> 3252 <span class="name">Fergus</span> 3253 <span class="desc">...</span> 3254 <span class="go"><span>Books visits</span><span class="arr">â</span></span> 3255 </a> 3256 </div> */ 3257 .ruled-index { 3258 margin-top: 44px; 3259 border-bottom: 1px solid var(--line-2) 3260 } 3261 3262 .ruled-row { 3263 display: grid; 3264 grid-template-columns:64px minmax(160px, 240px) 1fr auto; 3265 gap: clamp(14px, 2vw, 28px); 3266 align-items: center; 3267 padding: 22px clamp(4px, 1vw, 12px); 3268 border-top: 1px solid var(--line-2); 3269 text-decoration: none; 3270 transition: background .3s var(--ease) 3271 } 3272 3273 .ruled-row .num { 3274 font-family: var(--mono); 3275 font-size: 11px; 3276 letter-spacing: .14em; 3277 color: var(--mute-2) 3278 } 3279 3280 .ruled-row .name { 3281 font-family: var(--serif); 3282 font-weight: 600; 3283 font-size: clamp(19px, 1.8vw, 24px); 3284 letter-spacing: -.01em; 3285 color: var(--paper); 3286 transition: color .3s var(--ease) 3287 } 3288 3289 .ruled-row .desc { 3290 color: var(--bone); 3291 font-size: var(--t-small); 3292 line-height: var(--lh-body) 3293 } 3294 3295 .ruled-row .go { 3296 display: inline-flex; 3297 align-items: center; 3298 gap: 14px; 3299 font-family: var(--mono); 3300 font-size: var(--t-label); 3301 letter-spacing: .14em; 3302 text-transform: uppercase; 3303 color: var(--mute); 3304 white-space: nowrap 3305 } 3306 3307 .ruled-row .go .arr { 3308 color: var(--signal); 3309 font-size: 15px; 3310 transition: transform .3s var(--ease-out) 3311 } 3312 3313 a.ruled-row:hover { 3314 background: var(--surface-2) 3315 } 3316 3317 a.ruled-row:hover .name { 3318 color: var(--signal) 3319 } 3320 3321 a.ruled-row:hover .go .arr { 3322 transform: translateX(6px) 3323 } 3324 3325 @media (max-width: 900px) { 3326 .ruled-row { 3327 grid-template-columns:40px 1fr auto 3328 } 3329 3330 .ruled-row .desc { 3331 grid-column:2 / 3; 3332 grid-row: 2; 3333 margin-top: 2px 3334 } 3335 3336 .ruled-row .go span:not(.arr) { 3337 display: none 3338 } 3339 } 3340 3341 /* ====== INTEGRATION WALL ====== 3342 "Plugged into the software you already run", shared by the industry 3343 pages and the booking page. Replaces a bare grid of words whose cells 3344 were divided by a 1px gap, so "Microsoft" and "Outlook" ran together 3345 with nothing between one system and the next. Each system now gets 3346 its logo and room to breathe, which is the treatment /integrations 3347 already uses. Markup lives in frontend.partials.integration-wall. */ 3348 .ig-wall { 3349 margin-top: 40px; 3350 display: grid; 3351 grid-template-columns:repeat(auto-fit, minmax(210px, 1fr)); 3352 gap: clamp(20px, 2.4vw, 34px) 3353 } 3354 3355 .ig-item { 3356 display: flex; 3357 align-items: center; 3358 gap: 14px; 3359 padding: 20px 0 0; 3360 border-top: 1px solid var(--line-2); 3361 min-width: 0 3362 } 3363 3364 .ig-tile { 3365 flex: 0 0 44px; 3366 width: 44px; 3367 height: 44px; 3368 border-radius: 3px; 3369 border: 1px solid var(--line-2); 3370 display: grid; 3371 place-items: center; 3372 overflow: hidden 3373 } 3374 3375 .ig-tile.is-light { 3376 background: #fff 3377 } 3378 3379 .ig-tile img { 3380 width: 100%; 3381 height: 100%; 3382 object-fit: contain; 3383 padding: 7px 3384 } 3385 3386 .ig-tile b { 3387 font-family: var(--serif); 3388 font-size: 20px; 3389 font-weight: 400; 3390 line-height: 1 3391 } 3392 3393 .ig-name { 3394 font-family: var(--serif); 3395 font-weight: 400; 3396 font-size: 17px; 3397 line-height: 1.15; 3398 letter-spacing: -.01em; 3399 color: var(--paper); 3400 min-width: 0 3401 } 3402 3403 .ig-name small { 3404 display: block; 3405 margin-top: 4px; 3406 font-family: var(--mono); 3407 font-size: var(--t-label); 3408 letter-spacing: .14em; 3409 text-transform: uppercase; 3410 color: var(--mute) 3411 } 3412 3413 /* A price, a phone number, a headline figure: a heavier rule, a mono 3414 label and a big serif number. .is-pick marks the one being pushed. */ 3415 .ruled-figure { 3416 border-top: 2px solid var(--line-2); 3417 padding: clamp(24px, 3vw, 40px) 0 0 3418 } 3419 3420 .ruled-figure.is-pick { border-top-color: var(--signal) } 3421 3422 .ruled-figure .lbl { 3423 display: block; 3424 font-family: var(--mono); 3425 font-size: 11px; 3426 letter-spacing: .18em; 3427 text-transform: uppercase; 3428 color: var(--mute) 3429 } 3430 3431 .ruled-figure .big {
3432 display: block; 3433 margin-top: 16px; 3434 font-family: var(--serif); 3435 font-weight: 600; 3436 font-size: clamp(46px, 5vw, 72px); 3437 line-height: 1; 3438 letter-spacing: -.03em; 3439 color: var(--paper) 3440 } 3441 3442 .ruled-figure .big small { 3443 font-family: var(--mono); 3444 font-size: 12px; 3445 letter-spacing: .08em; 3446 color: var(--mute) 3447 } 3448 3449 /* A list inside the ruled language leads with an arrow in the signal 3450 colour, over a dashed rule. No bullets, no ticks in circles. */ 3451 .ruled-list { 3452 margin-top: 24px; 3453 list-style: none; 3454 display: flex; 3455 flex-direction: column; 3456 gap: 12px; 3457 border-top: 1px dashed var(--line); 3458 padding-top: 22px 3459 } 3460 3461 .ruled-list li { 3462 display: flex; 3463 gap: 12px; 3464 color: var(--bone); 3465 font-size: 14px; 3466 line-height: 1.5 3467 } 3468 3469 .ruled-list li::before { 3470 content: "\2192"; 3471 color: var(--signal); 3472 font-family: var(--mono) 3473 } 3474 3475 /* The list started life as a list of statements. The trade and town 3476 indexes use it as navigation instead, so a link inside one has to 3477 read as a link: the arrow already leads the row, and this gives the 3478 words themselves the signal colour and something on hover. */ 3479 .ruled-list li a { 3480 color: var(--signal); 3481 transition: color .2s var(--ease) 3482 } 3483 3484 .ruled-list li a:hover { color: var(--signal-warm) } 3485 3486 /* An aside is ruled down its edge rather than boxed in a tinted panel. */ 3487 .ruled-aside { 3488 padding: 4px 0 4px 18px; 3489 border-left: 2px solid var(--plasma); 3490 color: var(--bone); 3491 font-size: 14px; 3492 line-height: 1.6 3493 } 3494 3495 .ruled-aside.is-ok { border-left-color: var(--signal) } 3496 3497 @media (prefers-reduced-motion: reduce) { 3498 .ruled-col::after { transition: none; transform: scaleX(1) } 3499 } 3500 3501 @media (max-width: 1000px) { 3502 .ruled-set.cols-3, .ruled-set.cols-4 { grid-template-columns:repeat(2, 1fr) } 3503 } 3504 3505 @media (max-width: 640px) { 3506 .ruled-set.cols-2, .ruled-set.cols-3, .ruled-set.cols-4 { grid-template-columns:1fr } 3507 .ruled-set.in .ruled-col::after { transition-delay: 0s } 3508 } 3509 3510 /* ====== SCROLL REVEAL ====== 3511 .r hides a block until it scrolls into view. Two things it must never 3512 do: hold content back for a full second, and hide it for ever when the 3513 observer never runs. So the hidden state is applied only once the 3514 script has declared itself (html.js), and only where motion is wel
3514come. 3515 No JS, or reduced motion, means everything is simply visible. */ 3516 html.js .r { 3517 opacity: 0; 3518 transform: translateY(16px); 3519 transition: opacity .4s var(--ease-out), transform .4s var(--ease-out) 3520 } 3521 3522 html.js .r.in { 3523 opacity: 1; 3524 transform: none 3525 } 3526 3527 .r-1 { transition-delay: .05s } 3528 3529 .r-2 { transition-delay: .1s } 3530 3531 @media (prefers-reduced-motion: reduce) { 3532 html.js .r, html.js .r.in, .r, .r.in { 3533 opacity: 1; 3534 transform: none; 3535 transition: none 3536 } 3537 } 3538 3539 /* ====== STEPS ====== */ 3540 .steps { 3541 display: grid; 3542 grid-template-columns:repeat(3, 1fr); 3543 gap: clamp(20px, 3vw, 40px); 3544 margin-top: 56px; 3545 position: relative 3546 } 3547 3548 /* There was a connector line here, threaded through the middle of the 3549 circular step badges at a fixed 36px from the top. The badges are 3550 outlined numerals now and each step carries its own rule, so the 3551 connector had nothing left to connect and simply struck through the 3552 numbers. */ 3553 3554 /* V2 numbered steps: a hairline over each that fills with the brand 3555 gradient as it scrolls in, rather than a filled card that lifts. */ 3556 .step { 3557 position: relative; 3558 padding: 30px 0 0; 3559 display: flex; 3560 flex-direction: column; 3561 gap: 16px 3562 } 3563 3564 .step::before, .step::after { 3565 content: ""; 3566 position: absolute; 3567 top: 0; 3568 left: 0; 3569 right: 0; 3570 height: 1px 3571 } 3572 3573 .step::before { 3574 background: var(--line-2) 3575 } 3576 3577 .step::after { 3578 background: var(--grad); 3579 transform: scaleX(0); 3580 transform-origin: left; 3581 transition: transform .9s var(--ease-out) 3582 } 3583 3584 .step.in::after, .steps.in .step::after { 3585 transform: scaleX(1) 3586 } 3587 3588 .steps.in .step:nth-child(2)::after { 3589 transition-delay: .12s 3590 } 3591 3592 .steps.in .step:nth-child(3)::after { 3593 transition-delay: .24s 3594 } 3595 3596 .step:hover::after { 3597 transform: scaleX(1) 3598 } 3599 3600 /* V2 numbers a step with a big outlined italic numeral rather than a 3601 digit inside a circular badge. */ 3602 .step .num { 3603 font-family: var(--serif); 3604 font-weight: 600; 3605 font-size: 64px; 3606 line-height: 1; 3607 color: transparent; 3608 -webkit-text-stroke: 1px var(--line-2); 3609 position: relative; 3610 z-index: 1 3611 } 3612 3613 .step h4 { 3614 font-family: var(--serif); 3615 font-weight: 400; 3616 font-size: 24px; 3617 letter-spacing: -.01em; 3618 line-height: 1.1 3619 } 3620 3621 .step h4 .it { 3622 font-family: var(--serif); 3623 font-weight: 600; 3624 color: var(--mute) 3625 } 3626 3627 .step h4 { 3628 margin-top: 2px 3629 } 3630 3631 .step p { 3632 color: var(--bone); 3633 font-size: var(--t-body); 3634 line-height: 1.6 3635 } 3636 3637 .hero-steps-hd { 3638 margin-top: 34px; 3639 font-family: var(--serif); 3640 font-weight: 600; 3641 font-size: 34px; 3642 letter-spacing: -.02em; 3643 line-height: 1.1; 3644 color: var(--paper); 3645 opacity: 0; 3646 animation: rise2 .9s 1.1s var(--ease-out) forwards 3647 } 3648 3649 .hero-steps-hd .it { 3650 font-family: var(--serif); 3651 font-weight: 600; 3652 color: var(--signal) 3653 } 3654 3655 /* Vertical variant, so the steps can run down a narrow hero column 3656 beside a tall form instead of across the page. */ 3657 .steps.stack { 3658 grid-template-columns:1fr; 3659 gap: 12px; 3660 margin-top: 30px; 3661 max-width: 560px 3662 } 3663 3664 .steps.stack::before { 3665 display: none 3666 } 3667 3668 .steps.stack .step { 3669 flex-direction: row; 3670 align-items: flex-start; 3671 gap: 20px; 3672 padding: 22px 0 0 3673 } 3674 3675 .steps.stack .step .num { 3676 flex: 0 0 auto; 3677 font-size: 40px; 3678 line-height: .9 3679 } 3680 3681 .steps.stack .step .body { 3682 display: grid; 3683 gap: 8px 3684 } 3685 3686 .steps.stack .step h4 { 3687 font-size: 20px 3688 } 3689 3690 .steps.stack .step p { 3691 font-size: 13px 3692 } 3693 3694 /* ====== CAPABILITY PLATE ====== 3695 Capabilities in the V2 design language, the same vocabulary the /v2 3696 homepage and the wellness page use: top-ruled columns rather than 3697 boxed cards. Each cell is a hairline and the copy under it, and the 3698 hairline fills with the brand gradient as the plate scrolls in. 3699 3700 It was a filled, rounded plate whose cells were divided by letting a 3701 1px grid gap show the plate's own background through. That is
3701what 3702 made a short last row read as a slab of grey, and what made the set 3703 look like cards floating on the page rather than part of it. 3704 3705 Each cell still leads with the moment in the call it fires, so the 3706 set reads as a timeline rather than a feature dump. */ 3707 .cap-plate { 3708 display: grid; 3709 gap: clamp(22px, 3vw, 44px); 3710 grid-template-columns:repeat(3, 1fr) 3711 } 3712 3713 .cap { 3714 position: relative; 3715 padding: 30px 0 0; 3716 display: flex; 3717 flex-direction: column; 3718 gap: 10px 3719 } 3720 3721 /* the standing hairline, and the gradient that draws over it */ 3722 .cap::before, .cap::after { 3723 content: ""; 3724 position: absolute; 3725 top: 0; 3726 left: 0; 3727 right: 0; 3728 height: 1px 3729 } 3730 3731 .cap::before { 3732 background: var(--line-2) 3733 } 3734 3735 .cap::after { 3736 background: var(--grad); 3737 transform: scaleX(0); 3738 transform-origin: left; 3739 transition: transform .9s var(--ease-out) 3740 } 3741 3742 /* the plate carries .r, so the site-wide reveal observer is what starts 3743 the fill; the cells stagger across the row behind it */ 3744 .cap-plate.in .cap::after { 3745 transform: scaleX(1) 3746 } 3747 3748 .cap-plate .cap:nth-child(3n + 2)::after { 3749 transition-delay: .12s 3750 } 3751 3752 .cap-plate .cap:nth-child(3n)::after { 3753 transition-delay: .24s 3754 } 3755 3756 /* No icon marks in this language: the rule and the type carry the cell, 3757 and a glyph per capability was the last of the card furniture. The 3758 mark is still rendered so the components keep their contract; it just 3759 has nothing to say here. */ 3760 .cap-mark { 3761 display: none 3762 } 3763 3764 .cap .when { 3765 font-family: var(--mono); 3766 font-size: var(--t-label); 3767 letter-spacing: .16em; 3768 text-transform: uppercase; 3769 color: var(--signal); 3770 display: flex; 3771 align-items: center; 3772 justify-content: space-between; 3773 gap: 14px 3774 } 3775 3776 /* the mark is gone, so this is just the title's own line now */ 3777 .cap-hd { 3778 display: block 3779 } 3780 3781 .cap h3 { 3782 font-family: var(--serif); 3783 font-weight: 400; 3784 font-size: 24px; 3785 line-height: 1.14; 3786 letter-spacing: -.012em; 3787 color: var(--paper); 3788 padding-bottom: 2px 3789 } 3790 3791 .cap h3 .it { 3792 font-family: var(--serif); 3793 font-weight: 600; 3794 color: var(--signal) 3795 } 3796 3797 .cap h3 .blue { 3798 font-family: var(--serif); 3799 font-weight: 600; 3800 color: var(--plasma-bright) 3801 } 3802 3803 /* .green was never styled inside the old bento h4s, so it rendered as 3804 flat body text there. Carried onto the plate it gets the same 3805 treatment as .it, matching the tuner headings. */ 3806 .cap h3 .green { 3807 font-family: var(--serif); 3808 font-weight: 600; 3809 color: var(--signal) 3810 } 3811 3812 .cap p { 3813 color: var(--bone); 3814 font-size: var(--t-body); 3815 line-height: 1.62
3816 } 3817 3818 .cap p b { 3819 color: var(--paper); 3820 font-weight: 500 3821 } 3822 3823 /* The closing call to action sits under the plate rather than in it. As 3824 a cell it was three times the width of its neighbours and read as a 3825 row that had failed to fill, so it carries no fill of its own. 3826 3827 It does carry a rule across the full width, which is what closes the 3828 plate off now that the plate has no border: the cells are ruled at 3829 the top, this rules underneath them, and the set reads as one block 3830 rather than a run of columns that simply stops. */ 3831 .cap-foot { 3832 display: flex; 3833 align-items: center; 3834 justify-content: space-between; 3835 flex-wrap: wrap; 3836 gap: 20px 36px; 3837 margin-top: clamp(38px, 4vw, 56px); 3838 padding: clamp(26px, 3vw, 38px) 0 0; 3839 border-top: 1px solid var(--line-2) 3840 } 3841 3842 .cap-foot > div { 3843 max-width: 62ch; 3844 display: flex; 3845 flex-direction: column; 3846 gap: 8px 3847 } 3848 3849 .cap-foot h3 { 3850 font-family: var(--serif); 3851 font-weight: 600; 3852 font-size: 26px; 3853 line-height: 1.2; 3854 letter-spacing: -.015em; 3855 color: var(--paper); 3856 margin: 0 3857 } 3858 3859 .cap-foot h3 .it { 3860 font-family: var(--serif); 3861 font-weight: 600; 3862 } 3863 3864 .cap-foot p { 3865 font-size: var(--t-body); 3866 line-height: 1.6; 3867 color: var(--mute); 3868 margin: 0 3869 } 3870 3871 @media (max-width: 640px) { 3872 .cap-foot { 3873 margin-top: 24px 3874 } 3875 3876 .cap-foot h3 { 3877 font-size: 22px 3878 } 3879 } 3880 3881 /* Industry pages keep their own emphasis: two lead cells across the 3882 top, three underneath. A six-column track divides cleanly both ways, 3883 so neither row is left with a hole. */ 3884 .cap-plate.mixed { 3885 grid-template-columns:repeat(6, 1fr) 3886 } 3887 3888 .cap-plate.mixed .cap.half { 3889 grid-column:span 3 3890 } 3891 3892 .cap-plate.mixed .cap.third { 3893 grid-column:span 2 3894 } 3895 3896 /* There used to be a set of rules here that stretched whatever was left 3897 alone on the final row so it filled the width. That existed only 3898 because the old plate drew its rules by letting its own background 3899 through a 1px grid gap, so a row the cells did not fill showed up as 3900 a slab of grey. 3901 3902 Top-ruled columns have no fill to show through, so a short last row 3903 is simply empty space and needs no correction. Stretching a lone cell 3904 now would be actively wrong: its hairline would run three times the 3905 length of every other cell's and break the measure. The plates are 3906 still authored to fill their rows, and CapabilityPlateTest still 3907 guards that, but it is a composition rule now rather than a patch 3908 over an artefact. 3909 3910 (The old block also had a stray half-comment in it, which made the 3911 browser discard the first of the two rules outright.) */ 3912 3913 @media (max-width: 1000px) { 3914 .cap-plate { 3915 grid-template-columns:repeat(2, 1fr) 3916 } 3917 3918 .cap-plate.mixed { 3919 grid-template-columns:repeat(2, 1fr) 3920 } 3921 3922 .cap-plate.mixed .cap.half, 3923 .cap-plate.mixed .cap.third { 3924 grid-column:auto 3925 } 3926 3927 /* two across, so the three-column stagger no longer describes a row */ 3928 .cap-plate .cap:nth-child(3n + 2)::after, 3929 .cap-plate .cap:nth-child(3n)::after { 3930 transition-delay: 0s 3931 } 3932 3933 .cap-plate .cap:nth-child(even)::after { 3934 transition-delay: .12s 3935 } 3936 } 3937 3938 @media (max-width: 640px) { 3939 .cap-plate, 3940 .cap-plate.mixed { 3941 grid-template-columns:1fr 3942 } 3943 3944 /* one column, so nothing is beside anything: no stagger */ 3945 .cap-plate .cap::after { 3946 transition-delay: 0s 3947 } 3948 3949 .cap.wide { 3950 flex-direction: column; 3951 align-items: flex-start 3952 } 3953 } 3954 3955 @media (prefers-reduced-motion: reduce) { 3956 .cap::after { 3957 transition: none; 3958 transform: scaleX(1) 3959 } 3960 } 3961 3962 /* ====== HERO PHONE ====== 3963 The one device mock on the site. It earns its place by being 3964 interactive: the chips drive the notification and pause the cycle. */ 3965 .hphone { 3966 display: flex; 3967 flex-direction: column; 3968 align-items: center; 3969 gap: 20px; 3970 width: 100% 3971 } 3972 3973 .hphone-frame { 3974 width: min(268px, 72vw); 3975 aspect-ratio: 9/18.6; 3976 border-radius: 38px; 3977 padding: 9px; 3978 background: linear-gradient(160deg, #23262b, #0e1013 60%, #191c20); 3979 box-shadow: 0 30px 70px var(--shadow-deep), 0 0 0 1px rgba(255, 255, 255, .07) inset; 3980 flex: 0 0 auto 3981 } 3982 3983 .hphone-screen { 3984 position: relative; 3985 height: 100%; 3986 border-radius: 30px; 3987 overflow: hidden; 3988 background: radial-gradient(120% 80% at 50% 0%, #1c2330, #0a0d12 70%); 3989 display: flex; 3990 flex-direction: column; 3991 padding: 26px 12px 14px 3992 } 3993 3994 .hphone-notch { 3995 position: absolute; 3996 top: 8px; 3997 left: 50%; 3998 transform: translateX(-50%); 3999 width: 78px; 4000 height: 20px; 4001 border-radius: 12px; 4002 background: #05070a 4003 } 4004 4005 .hphone-clock { 4006 text-align: center; 4007 margin: 14px 0 18px; 4008 color: #fff 4009 } 4010 4011 .hphone-clock .t { 4012 font-size: 46px; 4013 font-weight: 300; 4014 letter-spacing: -.02em; 4015 line-height: 1 4016 } 4017 4018 .hphone-clock .d { 4019 font-size: 11.5px; 4020 color: rgba(255, 255, 255, .68); 4021 margin-top: 4px 4022 } 4023 4024 .hphone-stack { 4025 display: flex; 4026 flex-direction: column; 4027 gap: 7px; 4028 flex: 1 4029 } 4030 4031 .hpn { 4032 background: rgba(238, 238, 240, .93); 4033 border-radius: 16px; 4034 padding: 9px 11px 11px; 4035 opacity: 0; 4036 /* drops in from above the notch with a little overshoot, the way a 4037 push actually arrives, rather than fading on the spot */ 4038 transform: translateY(-22px) scale(.94); 4039 transition: opacity .42s var(--ease-out), 4040 transform .62s cubic-bezier(.22, 1.4, .36, 1); 4041 pointer-events: none 4042 } 4043 4044 .hpn.is-in { 4045 opacity: 1; 4046 transform: none 4047 } 4048 4049 .hpn header { 4050 display: flex; 4051 align-items: center; 4052 gap: 6px; 4053 margin-bottom: 5px 4054 } 4055 4056 .hpn header img { 4057 border-radius: 5px; 4058 display: block 4059 } 4060 4061 /* hpn- prefixed: a bare .app collides with the app showcase panel, 4062 which is an 80px-padded gradient grid, and it ate the header */ 4063 .hpn .hpn-app { 4064 font-size: 10.5px; 4065 color: #63666b; 4066 flex: 1 4067 } 4068 4069 .hpn .hpn-ago { 4070 font-size: 10.5px; 4071 color: #8b8e93 4072 } 4073 4074 .hpn h4 { 4075 font-size: 13.5px; 4076 font-weight: 600; 4077 color: #14171a; 4078 letter-spacing: -.005em 4079 } 4080 4081 .hpn p { 4082 font-size: 11.5px; 4083 color: #4e5155;
4084 margin-top: 1px; 4085 line-height: 1.35 4086 } 4087 4088 .hphone-bar { 4089 width: 96px; 4090 height: 4px; 4091 border-radius: 4px; 4092 background: rgba(255, 255, 255, .55); 4093 margin: 8px auto 0 4094 } 4095 4096 /* A LOCK SCREEN THAT PLAYS. Used by the PA and reception panels, which 4097 tell the same story with different notifications. See 4098 partials/agent-phone.blade.php. 4099 4100 --ag-tilt and --ag-sheen are written by the scroll handler; the 4101 values here are the resting state before it runs and whenever motion 4102 is refused. The two panels lean opposite ways so the pair reads as a 4103 spread rather than as the same picture twice. */ 4104 .agent-phone { 4105 transform: rotate(var(--ag-tilt, 3deg)); 4106 transition: transform .25s linear 4107 } 4108 4109 .agent-phone--left { 4110 --ag-tilt: -3deg 4111 } 4112 4113 .agent-phone .hphone-frame { 4114 position: relative; 4115 overflow: hidden 4116 } 4117 4118 /* The sheen is what sells the front as glass rather than as a 4119 rectangle. Decorative only: nothing sits under it. */ 4120 .agent-phone .hphone-frame::after { 4121 content: ""; 4122 position: absolute; 4123 inset: -30%; 4124 pointer-events: none; 4125 z-index: 3; 4126 background: linear-gradient(105deg, 4127 transparent 38%, 4128 rgba(255, 255, 255, .13) 47%, 4129 rgba(255, 255, 255, .22) 50%, 4130 rgba(255, 255, 255, .13) 53%, 4131 transparent 62%); 4132 transform: translateX(var(--ag-sheen, -20%)); 4133 transition: transform .25s linear 4134 } 4135 4136 /* iOS shrinks the clock and lifts it the moment something lands on a 4137 locked screen. Doing the same is what makes the notifications read as 4138 arriving rather than as part of the wallpaper. */ 4139 .agent-phone .hphone-clock { 4140 transition: margin .55s var(--ease-out) 4141 } 4142 4143 .agent-phone .hphone-clock .t { 4144 transition: font-size .55s var(--ease-out) 4145 } 4146 4147 .agent-phone .hphone-clock .d { 4148 transition: font-size .55s var(--ease-out), opacity .4s var(--ease) 4149 } 4150 4151 .agent-phone .hphone-clock.is-compact { 4152 margin: 2px 0 12px 4153 } 4154 4155 .agent-phone .hphone-clock.is-compact .t { 4156 font-size: 21px 4157 } 4158 4159 .agent-phone .hphone-clock.is-compact .d { 4160 font-size: 10px; 4161 opacity: .8 4162 } 4163 4164 @media (prefers-reduced-motion: reduce) { 4165 .agent-phone, 4166 .agent-phone .hphone-clock, 4167 .agent-phone .hphone-clock .t, 4168 .agent-phone .hphone-clock .d, 4169 .agent-phone .hphone-frame::after { 4170 transition: none 4171 } 4172 4173 .agent-phone { 4174 transform: none 4175 } 4176 4177 .agent-phone .hphone-frame::after { 4178 display: none 4179 } 4180 } 4181 4182 .hphone-chips { 4183 display: flex; 4184 flex-wrap: wrap; 4185 justify-content: center; 4186 gap: 7px; 4187 max-width: 340px 4188 } 4189 4190 .hpc { 4191 font-family: var(--mono); 4192 font-size: var(--t-label); 4193 letter-spacing: .1em; 4194 text-transform: uppercase; 4195 /* --bone not --mute: the label is 10px, so it needs AA, and mute 4196 only clears 3:1 against the chip fill in light theme */ 4197 color: var(--bone); 4198 background: var(--surface-2); 4199 border: 1px solid var(--line); 4200 border-radius: 7px; 4201 padding: 6px 9px; 4202 cursor: pointer; 4203 transition: color .25s var(--ease), border-color .25s var(--ease), background .25s var(--ease) 4204 } 4205 4206 .hpc:hover { 4207 color: var(--paper); 4208 border-color: var(--line-2) 4209 } 4210 4211 .hpc.is-on { 4212 /* fixed dark ink rather than --on-accent: it has to clear AA on 4213 both the light-theme green and the brighter dark-theme one */ 4214 color: #0b0d0a; 4215 background: var(--signal); 4216 border-color: transparent 4217 } 4218 4219 .hpc:focus-visible { 4220 outline: 2px solid var(--plasma-bright); 4221 outline-offset: 2px 4222 } 4223 4224 @media (max-width: 900px) { 4225 .hphone { 4226 margin-top: 34px 4227 } 4228 4229 .hphone-frame { 4230 width: min(232px, 62vw) 4231 } 4232 } 4233 4234 @media (prefers-reduced-motion: reduce) { 4235 .hpn { 4236 transition: none 4237 } 4238 } 4239 4240 /* ====== TRADE INDEX ====== 4241 Photographic directory. The tiles were held inside one rounded, 4242 filled container and ruled off each other by letting its background 4243 through a 1px grid gap. In the V2 language the container goes and the 4244 tiles are ruled individually, so the set sits on the page rather than 4245 on a plate laid over it. The photography stays: V2 keeps photographs, 4246 it is the boxes around them it does without. */ 4247 .trade-plate { 4248 display: grid; 4249 gap: clamp(20px, 2.6vw, 36px) 4250 } 4251 4252 .trade-plate.cols-3 { 4253 grid-template-columns:repeat(3, 1fr) 4254 } 4255 4256 .trade-plate.cols-4 { 4257 grid-template-columns:repeat(4, 1fr) 4258 } 4259 4260 /* four across is tighter, so the type steps down with it */ 4261 .trade-plate.cols-4 .body { 4262 padding: 19px 20px 18px; 4263 gap: 8px 4264 } 4265 4266 .trade-plate.cols-4 h3 { 4267 font-size: 20px 4268 } 4269 4270 .trade-plate.cols-4 p { 4271 font-size: 13px; 4272 line-height: 1.55 4273 } 4274 4275 .trade-plate.cols-4 .go { 4276 padding-top: 13px; 4277 font-size: 10px 4278 } 4279 4280 .trade { 4281 position: relative; 4282 display: flex; 4283 flex-direction: column; 4284 text-decoration: none; 4285 color: inherit; 4286 transition: background .35s var(--ease) 4287 } 4288 4289 .trade:hover { 4290 background: var(--surface-2) 4291 } 4292 4293 .trade .shot { 4294 position: relative; 4295 aspect-ratio: 16/10; 4296 overflow: hidden; 4297 /* the notification card inside is sized in cqw against this */ 4298 container-type: inline-size 4299 } 4300 4301 /* THE NOTIFICATION ON A PHOTOGRAPH. See components/frontend/shot-alert. 4302 It used to be composited into the JPEG, which pinned it to one spot 4303 in a portrait frame and froze an old mark inside it. Drawn here it 4304 takes the mark from the brand component and sits where each context 4305 needs it. 4306 4307 Everything is derived from one unit, --u, so the whole card scales 4308 together: type, padding, corner radius, mark and tail all stay in 4309 proportion at every tile size. The card is 56 units wide, and .75cqw 4310 makes that 42% of the photo, which is the proportion the composited 4311 card had and the one the crops were framed around. 4312 4313 The clamp holds both ends of that. Below about a 350px tile a strict 4314 42% would put the subtitle under 10px, so the card is allowed to take 4315 a larger share of a small photo rather than become unreadable on it. 4316 Above about a 730px tile it stops growing, because past that the card 4317 has stopped reading as a notification and started reading as a 4318 banner. Anything holding a .shot-alert needs container-type: 4319 inline-size for cqw to resolve. 4320 4321 Light in both themes on purpose: it sits on a daylight photograph, 4322 not on the page. */ 4323 .shot-alert { 4324 --u: clamp(3.1px, .75cqw, 5.5px); 4325 --alert-ground: rgba(244, 244, 242, .93); 4326 position: absolute; 4327 z-index: 2; 4328 display: flex; 4329 flex-direction: column; 4330 gap: calc(1.1 * var(--u)); 4331 width: calc(56 * var(--u)); 4332 padding: calc(3.6 * var(--u)) calc(4 * var(--u)) calc(4 * var(--u)); 4333 border-radius: calc(4.4 * var(--u)); 4334 background: var(--alert-ground); 4335 backdrop-filter: blur(7px); 4336 -webkit-backdrop-filter: blur(7px); 4337 box-shadow: 0 calc(3 * var(--u)) calc(6 * var(--u)) calc(-2 * var(--u)) rgba(8, 12, 16, .32); 4338 color: #101820; 4339 font-family: var(--sans); 4340 line-height: 1.25; 4341 text-wrap: balance; 4342 pointer-events: none 4343 } 4344 4345 /* the tail, on the side the card is anchored to */ 4346 .shot-alert::after { 4347 content: ""; 4348 position: absolute; 4349 bottom: calc(-2.6 * var(--u)); 4350 width: 0; 4351 height: 0; 4352 border-top: calc(3 * var(--u)) solid var(--alert-ground); 4353 border-right: calc(3.4 * var(--u)) solid transparent 4354 } 4355 4356 /* Insets stay a fraction of the photo rather than of the card, so the 4357 gap to the frame edge reads the same on a tile and on a hero. */ 4358 .shot-alert.at-top-left, .shot-alert.at-bottom-left { 4359 left: min(4cqw, 24px) 4360 } 4361 4362 .shot-alert.at-top-right, .shot-alert.at-bottom-right { 4363 right: min(4cqw, 24px) 4364 } 4365 4366 .shot-alert.at-top-left, .shot-alert.at-top-right { 4367 top: min(4.5cqw, 26px) 4368 } 4369 4370 .shot-alert.at-bottom-left, .shot-alert.at-bottom-right { 4371 bottom: min(7cqw, 40px) 4372 } 4373 4374 .shot-alert.at-top-left::after, .shot-alert.at-bottom-left::after { 4375 left: calc(9 * var(--u)) 4376 } 4377 4378 .shot-alert.at-top-right::after, .shot-alert.at-bottom-right::after { 4379 right: calc(9 * var(--u)); 4380 border-right: 0; 4381 border-left: calc(3.4 * var(--u)) solid transparent 4382 } 4383 4384 /* a card anchored to the bottom points its tail upward instead */ 4385 .shot-alert.at-bottom-left::after, .shot-alert.at-bottom-right::after { 4386 bottom: auto; 4387 top: calc(-2.6 * var(--u)); 4388 border-top: 0; 4389 border-bottom: calc(3 * var(--u)) solid var(--alert-ground) 4390 } 4391 4392 .shot-alert-hd { 4393 display: flex; 4394 align-items: center; 4395 gap: calc(1.8 * var(--u)) 4396 } 4397 4398 .shot-alert-mark { 4399 width: calc(5.2 * var(--u)); 4400 height: calc(5.2 * var(--u)); 4401 flex: none 4402 } 4403 4404 .shot-alert-app { 4405 font-size: calc(2.8 * var(--u)); 4406 font-weight: 500; 4407 color: #5b6570 4408 } 4409 4410 .shot-alert-stamp { 4411 margin-left: auto; 4412 font-size: calc(2.66 * var(--u)); 4413 color: #8c949d 4414 } 4415 4416 .shot-alert-title { 4417 font-size: calc(3.86 * var(--u)); 4418 font-weight: 600; 4419 letter-spacing: -.01em 4420 } 4421 4422 .shot-alert-body { 4423 font-size: calc(3.06 * var(--u));
4424 color: #3d4650 4425 } 4426 4427 /* Four across on a small laptop makes a tile barely wider than the card 4428 itself. The floor has already stopped the type shrinking, so the only 4429 thing left to give is the detail line: below this the card keeps the 4430 headline and drops the rest, the way a notification does when the 4431 space it has is one line deep. */ 4432 @container (max-width: 300px) { 4433 .shot-alert-body { 4434 display: none 4435 } 4436 } 4437 4438 /* inner layer carries the photo so the scale-on-hover never touches type */ 4439 .trade .shot i { 4440 position: absolute; 4441 inset: 0; 4442 background-image: var(--shot-dark); 4443 background-size: cover; 4444 /* --pos is set per entry: the source photos are a mix of portrait 4445 and landscape, so each one gets its own crop anchor to keep the 4446 face and the phone in frame */ 4447 background-position: var(--pos, center); 4448 filter: saturate(.8) contrast(1.03); 4449 transform: scale(1.01); 4450 transition: transform .9s var(--ease-out), filter .5s var(--ease) 4451 } 4452 4453 html[data-theme="light"] .trade .shot i { 4454 background-image: var(--shot-light, var(--shot-dark)); 4455 /* two of the day shots are portrait where their night twin is 4456 landscape, so they need their own anchor */ 4457 background-position: var(--pos-light, var(--pos, center)) 4458 } 4459 4460 .trade:hover .shot i { 4461 transform: scale(1.06); 4462 filter: none 4463 } 4464 4465 /* brand rule wipes along the photo edge, standing in for a hover lift */ 4466 .trade .shot::after { 4467 content: ""; 4468 position: absolute; 4469 top: 0; 4470 left: 0; 4471 right: 0; 4472 height: 2px; 4473 background: var(--grad); 4474 transform: scaleX(0); 4475 transform-origin: left; 4476 transition: transform .55s var(--ease-out) 4477 } 4478 4479 .trade:hover .shot::after { 4480 transform: scaleX(1) 4481 } 4482 4483 .trade .body { 4484 flex: 1; 4485 display: flex; 4486 flex-direction: column; 4487 gap: 9px; 4488 padding: 22px 24px 20px 4489 } 4490 4491 .trade .hd { 4492 display: flex; 4493 align-items: flex-start; 4494 justify-content: space-between; 4495 gap: 18px 4496 } 4497 4498 .trade h3 { 4499 font-family: var(--serif); 4500 font-weight: 400; 4501 font-size: 23px; 4502 line-height: 1.14; 4503 letter-spacing: -.012em; 4504 padding-bottom: 2px 4505 } 4506 4507 .trade h3 .it { 4508 font-family: var(--serif); 4509 font-weight: 600; 4510 color: var(--signal) 4511 } 4512 4513 .trade h3 .blue { 4514 font-family: var(--serif); 4515 font-weight: 600; 4516 color: var(--plasma-bright) 4517 } 4518 4519 /* the mark: bare glyph, no tile, no fill, muted until you reach for it. 4520 --mute not --mute-2: mute-2 only clears 2.8:1 on the light paper 4521 ground, which fails both the AA text and the 3:1 graphics minimum */ 4522 .trade .mark { 4523 flex: 0 0 auto; 4524 color: var(--mute); 4525 transition: color .35s var(--ease) 4526 } 4527 4528 .trade:hover .mark { 4529 color: var(--signal) 4530 } 4531 4532 .trade p { 4533 color: var(--bone); 4534 font-size: var(--t-small); 4535 line-height: 1.58 4536 } 4537 4538 .trade .go { 4539 margin-top: auto; 4540 padding-top: 16px; 4541 display: flex; 4542 align-items: center; 4543 gap: 9px; 4544 font-family: var(--mono); 4545 font-size: var(--t-label); 4546 letter-spacing: .16em; 4547 text-transform: uppercase; 4548 color: var(--mute); 4549 transition: color .35s var(--ease) 4550 } 4551 4552 .trade:hover .go { 4553 color: var(--paper) 4554 } 4555 4556 .trade .go em { 4557 font-style: normal; 4558 transition: transform .35s var(--ease-out) 4559 } 4560 4561 .trade:hover .go em { 4562 transform: translateX(5px) 4563 } 4564 4565 /* full-width entry: photo becomes a left band, rule wipes down its edge */ 4566 .trade.wide { 4567 grid-column:1 / -1; 4568 flex-direction: row; 4569 align-items: stretch 4570 } 4571 4572 .trade.wide .shot { 4573 flex: 0 0 36%; 4574 aspect-ratio: auto; 4575 min-height: 216px 4576 } 4577 4578 .trade.wide .shot::after { 4579 top: 0; 4580 bottom: 0; 4581 left: 0; 4582 right: auto; 4583 width: 2px; 4584 height: auto; 4585 transform: scaleY(0); 4586 transform-origin: top 4587 } 4588
4589 .trade.wide:hover .shot::after { 4590 transform: scaleY(1) 4591 } 4592 4593 .trade.wide .body { 4594 justify-content: center; 4595 padding: 34px 38px; 4596 max-width: 62ch 4597 } 4598 4599 .trade.wide h3 { 4600 font-size: 30px 4601 } 4602 4603 .trade.wide p { 4604 font-size: var(--t-body) 4605 } 4606 4607 /* compact ruled entries for the non-trade set: no photo, mark leads the row */ 4608 /* The row variant carries no photo, so it is the V2 service index: a 4609 hairline over each row, the name, the description, and the tag with 4610 an arrow that slides on hover. It used to be a filled bar with a 4611 gradient stripe running down its left edge and an icon opposite. */ 4612 .trade-plate:has(.trade.row) { 4613 gap: 0; 4614 border-bottom: 1px solid var(--line-2) 4615 } 4616 4617 .trade.row { 4618 flex-direction: row; 4619 align-items: center; 4620 gap: clamp(14px, 2vw, 28px); 4621 padding: 22px clamp(4px, 1vw, 12px); 4622 border-top: 1px solid var(--line-2) 4623 } 4624 4625 /* the icon mark goes with the boxes */ 4626 .trade.row .mark { 4627 display: none 4628 } 4629 4630 .trade.row h3 { 4631 flex: 0 0 clamp(190px, 21vw, 270px); 4632 font-family: var(--serif); 4633 font-weight: 400; 4634 font-size: clamp(19px, 1.8vw, 24px); 4635 letter-spacing: -.01em; 4636 color: var(--paper); 4637 transition: color .3s var(--ease) 4638 } 4639 4640 .trade.row:hover h3 { 4641 color: var(--signal) 4642 } 4643 4644 .trade.row .go em { 4645 display: inline-block; 4646 color: var(--signal); 4647 font-style: normal; 4648 transition: transform .3s var(--ease-out) 4649 } 4650 4651 .trade.row:hover .go em { 4652 transform: translateX(6px) 4653 } 4654 4655 .trade.row p { 4656 flex: 1 4657 } 4658 4659 .trade.row .go { 4660 margin: 0; 4661 padding: 0; 4662 flex: 0 0 auto 4663 } 4664 4665 @media (max-width: 1240px) { 4666 .trade-plate.cols-4 { 4667 grid-template-columns:repeat(3, 1fr) 4668 } 4669 } 4670 4671 @media (max-width: 940px) { 4672 .trade-plate.cols-4 { 4673 grid-template-columns:repeat(2, 1fr) 4674 } 4675 } 4676 4677 @media (max-width: 1100px) { 4678 .trade-plate.cols-3 { 4679 grid-template-columns:repeat(2, 1fr) 4680 } 4681 4682 .trade.row h3 { 4683 flex-basis: 210px 4684 } 4685 4686 .trade.row .go span { 4687 display: none 4688 } 4689 } 4690 4691 @media (max-width: 640px) { 4692 .trade-plate.cols-4 { 4693 grid-template-columns:1fr 4694 } 4695 4696 .trade-plate.cols-3 { 4697 grid-template-columns:1fr 4698 } 4699 4700 .trade.wide { 4701 flex-direction: column 4702 } 4703 4704 .trade.wide .shot { 4705 flex: none; 4706 aspect-ratio: 16/9; 4707 min-height: 0 4708 } 4709 4710 .trade.wide .shot::after { 4711 top: 0; 4712 bottom: auto; 4713 left: 0; 4714 right: 0; 4715 width: auto; 4716 height: 2px; 4717 transform: scaleX(0); 4718 transform-origin: left 4719 } 4720 4721 .trade.wide:hover .shot::after { 4722 transform: scaleX(1) 4723 } 4724 4725 .trade.wide .body { 4726 padding: 22px 24px 20px 4727 } 4728 4729 .trade.wide h3 { 4730 font-size: 24px 4731 } 4732 4733 .trade.row { 4734 flex-direction: column; 4735 align-items: flex-start; 4736 gap: 10px; 4737 padding: 22px 24px 4738 } 4739 4740 .trade.row h3 { 4741 flex: none 4742 } 4743 4744 .trade.row .go span { 4745 display: inline 4746 } 4747 } 4748 4749 @media (prefers-reduced-motion: reduce) { 4750 .trade, .trade .shot i, .trade .shot::after, .trade .mark, .trade .go, .trade .go em, .trade.row::before { 4751 transition: none 4752 } 4753
4754 .trade:hover .shot i { 4755 transform: scale(1.01) 4756 } 4757 } 4758 4759 /* ====== CONVO ====== */ 4760 .convo { 4761 display: flex; 4762 flex-direction: column; 4763 gap: 14px; 4764 max-width: 760px; 4765 margin: 0 auto; 4766 font-family: var(--mono); 4767 font-size: 13px 4768 } 4769 4770 .convo .bub { 4771 padding: 14px 18px; 4772 border-radius: 14px; 4773 border: 1px solid var(--line); 4774 max-width: 78%; 4775 line-height: 1.55; 4776 position: relative; 4777 opacity: 0; 4778 transform: translateY(12px) scale(.97); 4779 transition: opacity .55s var(--ease-out), transform .55s var(--ease-out) 4780 } 4781 4782 .convo .bub.in { 4783 opacity: 1; 4784 transform: translateY(0) scale(1) 4785 } 4786 4787 .convo .bub.caller { 4788 align-self: flex-start; 4789 background: rgba(49, 138, 190, .06); 4790 border-color: rgba(49, 138, 190, .25); 4791 color: var(--paper); 4792 border-bottom-left-radius: 4px 4793 } 4794 4795 .convo .bub.agent { 4796 align-self: flex-end; 4797 background: color-mix(in srgb, var(--signal) 6%, transparent); 4798 border-color: color-mix(in srgb, var(--signal) 25%, transparent); 4799 color: var(--paper); 4800 border-bottom-right-radius: 4px 4801 } 4802 4803 .convo .bub .lbl { 4804 font-size: 9px; 4805 color: var(--mute); 4806 text-transform: uppercase; 4807 letter-spacing: .2em; 4808 display: block; 4809 margin-bottom: 6px 4810 } 4811 4812 .convo .bub.caller .lbl { 4813 color: var(--plasma-bright) 4814 } 4815 4816 .convo .bub.agent .lbl { 4817 color: var(--signal) 4818 } 4819 4820 /* Typing indicator inside .convo */ 4821 .convo-typing { 4822 align-self: flex-end; 4823 background: color-mix(in srgb, var(--signal) 6%, transparent); 4824 border: 1px solid color-mix(in srgb, var(--signal) 25%, transparent); 4825 border-radius: 14px; 4826 border-bottom-right-radius: 4px; 4827 padding: 14px 18px; 4828 display: none; 4829 align-items: center; 4830 gap: 10px; 4831 opacity: 0; 4832 transition: opacity .25s ease 4833 } 4834 4835 .convo-typing.on { 4836 display: inline-flex; 4837 opacity: 1 4838 } 4839 4840 .convo-typing.caller { 4841 align-self: flex-start; 4842 background: rgba(49, 138, 190, .06); 4843 border-color: rgba(49, 138, 190, .25); 4844 border-bottom-left-radius: 4px; 4845 border-bottom-right-radius: 14px 4846 } 4847 4848 .convo-typing .lbl { 4849 font-size: 9px; 4850 color: var(--signal); 4851 text-transform: uppercase; 4852 letter-spacing: .2em 4853 } 4854 4855 .convo-typing.caller .lbl { 4856 color: var(--plasma-bright) 4857 } 4858 4859 .convo-typing .dotset { 4860 display: inline-flex; 4861 gap: 4px; 4862 align-items: center 4863 } 4864 4865 .convo-typing .dotset i { 4866 width: 6px; 4867 height: 6px; 4868 border-radius: 50%; 4869 background: var(--signal); 4870 opacity: .4; 4871 animation: typingDot 1.2s ease-in-out infinite 4872 } 4873 4874 .convo-typing.caller .dotset i { 4875 background: var(--plasma) 4876 } 4877 4878 .convo-typing .dotset i:nth-child(2) { 4879 animation-delay: .2s 4880 } 4881 4882 .convo-typing .dotset i:nth-child(3) { 4883 animation-delay: .4s 4884 } 4885 4886 /* ====== INTEGRATION LOGOS ROW ====== */ 4887 .integrations { 4888 display: grid; 4889 grid-template-columns:repeat(6, 1fr); 4890 gap: 1px; 4891 background: var(--line); 4892 border-top: 1px solid var(--line); 4893 border-bottom: 1px solid var(--line); 4894 overflow: hidden 4895 } 4896 4897 .integrations .ig { 4898 padding: 24px; 4899 background: var(--ink); 4900 display: flex; 4901 align-items: center; 4902 justify-content: center; 4903 font-family: var(--serif); 4904 font-size: 18px; 4905 color: var(--bone); 4906 transition: .25s; 4907 text-align: center 4908 } 4909 4910 .integrations .ig:hover { 4911 background: var(--ink-3); 4912 color: var(--paper) 4913 } 4914 4915 .integrations .ig small { 4916 font-family: var(--mono); 4917 font-size: var(--t-label); 4918 color: var(--mute); 4919 letter-spacing: .14em; 4920 text-transform: uppercase; 4921 display: block; 4922 margin-top: 4px 4923 } 4924 4925 /* ====== PAGE INDICATORS ====== */ 4926 .crumb { 4927 font-family: var(--mono); 4928 font-size: 11px; 4929 color: var(--mute); 4930 text-transform: uppercase; 4931 letter-spacing: .18em; 4932 display: flex; 4933 gap: 10px; 4934 align-items: center 4935 } 4936 4937 .crumb a { 4938 color: var(--mute); 4939 transition: .25s 4940 } 4941 4942 .crumb a:hover { 4943 color: var(--signal) 4944 } 4945 4946 /* ====== RESPONSIVE ====== */ 4947 @media (max-width: 1100px) { 4948 .hero-shell, .slab, .editorial, .app { 4949 grid-template-columns:1fr; 4950 gap: 48px 4951 } 4952 4953 .metric { 4954 grid-column: span 6 4955 } 4956 4957 .metric.wide { 4958 grid-column: span 12 4959 } 4960 4961 .tiers { 4962 grid-template-columns:1fr 4963 } 4964 4965 .nav ul { 4966 display: none 4967 } 4968 4969 /* Collapsed nav: the Agents menu stops being a floating panel and 4970 becomes an inline accordion inside the stacked menu, opened by 4971 tapping (never by hover, which does not exist on touch). */ 4972 .nav-drop { 4973 width: 100% 4974 } 4975 4976 .nav-drop-btn { 4977 width: 100%; 4978 justify-content: flex-start 4979 } 4980 4981 .nav-drop-chev { 4982 margin-left: auto 4983 } 4984 4985 .nav-drop:hover .nav-drop-panel, 4986 .nav-drop:focus-within .nav-drop-panel { 4987 display: none 4988 } 4989 4990 .nav-drop.is-open .nav-drop-panel { 4991 display: grid 4992 } 4993 4994 /* No hover on touch, and the panel is inline here, so the bridge 4995 has nothing to bridge. */ 4996 .nav-drop-panel::before { 4997 display: none 4998 } 4999 5000 .nav-drop-panel { 5001 position: static; 5002 min-width: 0; 5003 width: 100%; 5004 grid-template-columns: 1fr; 5005 gap: 14px; 5006 margin: 6px 0 4px; 5007 padding: 12px; 5008 max-height: min(58vh, 460px); 5009 overflow-y: auto; 5010 -webkit-overflow-scrolling: touch; 5011 box-shadow: none; 5012 background: var(--ink-3) 5013 } 5014 5015 .nav ul .nav-drop-panel a { 5016 padding: 10px 5017 } 5018 5019 /* Stacked on mobile, so there is no second column to line up with. */ 5020 .nav ul .nav-drop-all { 5021 margin-top: 6px 5022 } 5023 5024 /* Descriptions are noise on a small screen; the labels carry it. */ 5025 .nav ul .nav-drop-panel a em { 5026 display: none 5027 } 5028 5029 /* Collapsed nav: the wide signup-plus-number pill gives way to a 5030 compact call button that actually dials (this is a phone), and 5031 the full number stays in the footer. Sign in + CTA keep their 5032 places. */ 5033 .nav .actions .num-signup { 5034 display: none 5035 } 5036 5037 .nav .actions .num-call { 5038 display: inline-flex 5039 } 5040 5041 .menu-btn { 5042 display: inline-flex; 5043 align-items: center; 5044 justify-content: center; 5045 width: 38px; 5046 height: 38px; 5047 border: 1px solid var(--line-2); 5048 border-radius: 8px 5049 } 5050 5051 .foot-grid { 5052 grid-template-columns:1fr 1fr; 5053 gap: 32px 5054 } 5055 5056 .steps { 5057 grid-template-columns:1fr 5058 } 5059 5060 .steps::before { 5061 display: none 5062 } 5063 5064 .integrations { 5065 grid-template-columns:repeat(3, 1fr) 5066 } 5067 5068 .form .row { 5069 grid-template-columns:1fr 5070 } 5071 5072 .form .radios { 5073 grid-template-columns:1fr 5074 } 5075 } 5076 5077 @media (max-width: 640px) { 5078 .nav { 5079 grid-template-columns:1fr auto; 5080 gap: 12px; 5081 padding: 14px var(--shell-pad) 5082 } 5083 5084 /* Small phones: also drop Sign in (still in the footer), leaving 5085 toggle + call icon + Start free + menu. The call icon stays: a 5086 phone is the one place the number can actually be rung. */ 5087 .nav .actions .num { 5088 display: none 5089 } 5090 5091 .nav .actions .num-call { 5092 display: inline-flex 5093 } 5094 5095 /* Tighter again on a short screen, where the fold is the whole 5096 argument and every pixel above the headline is spent. */ 5097 .hero { 5098 padding-top: 96px 5099 } 5100 5101 .hero-meta { 5102 gap: 24px 32px 5103 } 5104 5105 .hero-meta dd { 5106 font-size: 24px 5107 } 5108 5109 .slab-l, .app { 5110 padding: 36px 28px 5111 } 5112 5113 .slab-r { 5114 padding: 48px 0; 5115 min-height: 480px 5116 } 5117 5118 .metric { 5119 grid-column: span 12 5120 } 5121 5122 .foot-grid { 5123 grid-template-columns:1fr 5124 } 5125 5126 .editorial { 5127 gap: 32px 5128 } 5129 5130 .endcta .num-big { 5131 font-size: 32px; 5132 padding: 16px 24px 5133 } 5134 5135 .strip { 5136 font-size: 24px 5137 } 5138 5139 /* Pricing tier cards on phones: tighter padding + smaller price so $ 5140 129/mo fits */ 5141 .tier { 5142 padding: 28px 22px; 5143 gap: 18px 5144 } 5145 5146 .tier .price { 5147 font-size: 48px 5148 } 5149 5150 .tier .price small { 5151 font-size: 12px 5152 } 5153 5154 .tier .name { 5155 font-size: 10px 5156 } 5157
5158 .tier .desc { 5159 padding-top: 16px 5160 } 5161 5162 .tier ul { 5163 font-size: 13px 5164 } 5165 5166 .tier ul li { 5167 gap: 8px 5168 } 5169 5170 /* Pricing FAQ */ 5171 .pricing-faq-grid { 5172 grid-template-columns:1fr !important 5173 } 5174 } 5175 </style> 5176 5177 <link rel="preload" as="image" type="image/webp" fetchpriority="high" 5178 href="https://talkify.nz/media/frontend/hero-phone-day.webp"> 5179 5180 <style> 5181 .hero-film { display: inline-flex; align-items: center; gap: 14px; margin-top: 22px; color: inherit; text-decoration: none; } 5182 .hero-film__thumb { position: relative; width: 104px; aspect-ratio: 16 / 9; border-radius: 10px; background: #0a1016 center / cover no-repeat; 5183 box-shadow: 0 8px 24px rgba(0, 0, 0, .25); display: grid; place-items: center; color: #fff; flex: none; } 5184 .hero-film__thumb::after { content: ''; position: absolute; inset: 0; border-radius: inherit; background: rgba(10, 16, 22, .35); transition: background .2s; } 5185 .hero-film__thumb svg { position: relative; z-index: 1; width: 26px; height: 26px; filter: drop-shadow(0 1px 4px rgba(0, 0, 0, .5)); } 5186 .hero-film:hover .hero-film__thumb::after, .hero-film:focus-visible .hero-film__thumb::after { background: rgba(49, 138, 190, .55); } 5187 .hero-film__text { display: grid; gap: 2px; line-height: 1.25; } 5188 .hero-film__text b { font-weight: 600; text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 3px; transition: text-decoration-color .2s; } 5189 .hero-film:hover .hero-film__text b { text-decoration-color: currentColor; } 5190 .hero-film__text small { font-family: var(--mono); font-size: 12px; letter-spacing: .06em; text-transform: uppercase; opacity: .7; } 5191 /* The grid centres its columns, and the copy column is the taller one, 5192 so the demo sat low with a dead band above it. Top it out level with 5193 the headline instead (h1.display's own 28px top margin). */ 5194 .hero-demo { align-self: start; margin-top: 28px; } 5195 .hero-demo .hero-film { margin-top: 18px; } 5196 </style> 5197 <style> 5198 /* Outbound demo stepper: calling/done visuals on the site palette */ 5199 .od-ringwrap { 5200 position: relative; 5201 width: 110px; 5202 height: 110px; 5203 margin: 6px auto 0; 5204 display: grid; 5205 place-items: center 5206 } 5207 5208 .od-core { 5209 width: 54px; 5210 height: 54px; 5211 border-radius: 50%; 5212 background: var(--signal); 5213 color: var(--ink-2); 5214 display: grid; 5215 place-items: center; 5216 animation: od-pulse 1.3s ease-in-out infinite 5217 } 5218 5219 .od-ring { 5220 position: absolute; 5221 width: 54px; 5222 height: 54px; 5223 border-radius: 50%; 5224 border: 2px solid var(--signal); 5225 opacity: .7; 5226 animation: od-rip 2.4s ease-out infinite 5227 } 5228 5229 .od-ring.od-r2 { 5230 animation-delay: .8s 5231 } 5232 5233 .od-ring.od-r3 { 5234 animation-delay: 1.6s 5235 } 5236 5237 @keyframes od-rip { 5238 0% { 5239 transform: scale(1); 5240 opacity: .7 5241 } 5242 100% { 5243 transform: scale(2.1); 5244 opacity: 0 5245 } 5246 } 5247 5248 @keyframes od-pulse { 5249 0%, 100% { 5250 transform: scale(1) 5251 } 5252 50% { 5253 transform: scale(1.08) 5254 } 5255 } 5256 5257 .od-check { 5258 width: 72px; 5259 height: 72px; 5260 margin: 6px auto 0; 5261 border-radius: 50%; 5262 display: grid; 5263 place-items: center; 5264 border: 2px solid var(--signal); 5265 color: var(--signal); 5266 background: color-mix(in srgb, var(--signal) 10%, transparent) 5267 } 5268 5269 .od-dots::after { 5270 content: ''; 5271 animation: od-dots 1.4s steps(4, end) infinite 5272 } 5273 5274 @keyframes od-dots { 5275 0% { 5276 content: '' 5277 } 5278 25% { 5279 content: '.' 5280 } 5281 50% { 5282 content: '..' 5283 } 5284 75% { 5285 content: '...' 5286 } 5287 } 5288 5289 #odSteps .on { 5290 color: var(--signal) 5291 } 5292 5293 /* ============ PHONE ============ 5294 This is the thing on the homepage that lets somebody hear the product, 5295 and on a phone it was the weakest part of the page: a squashed action 5296 row with the button jammed against the caption, the step indicator 5297 overflowing, and 28px of padding eating a 375px screen. 5298 5299 Nothing below changes the desktop layout. */ 5300 /* The card is the one thing on the hero a visitor can actually use, 5301 and it sat on the photograph as a soft-edged panel that the eye slid 5302 off. It has an edge now: a hairline all the way round and the brand 5303 gradient across the top, the same rule the ruled blocks use, so it 5304 reads as a thing to fill in rather than another pane of the image 5305 behind it. */ 5306 .od-deck { 5307 position: relative; 5308 border: 1px solid var(--line); 5309 /* Two shadows: a tight one for the edge so the card reads as a 5310 real surface, and a wide soft one for the lift off the photo. */ 5311 box-shadow: 0 1px 2px rgba(16, 24, 32, .07), 5312 0 28px 70px -28px rgba(16, 24, 32, .38); 5313 overflow: hidden; 5314 } 5315 5316 .od-title { 5317 font-family: var(--serif); 5318 font-size: clamp(19px, 1.7vw, 22px); 5319 font-weight: 600; 5320 letter-spacing: var(--ls-head); 5321 line-height: 1.2; 5322 color: var(--paper); 5323 } 5324 5325 .od-deck::before { 5326 content: ""; 5327 position: absolute; 5328 inset: 0 0 auto; 5329 height: 3px; 5330 background: var(--grad); 5331 } 5332 5333 @media (max-width: 640px) { 5334 /* The padding is set inline by the caller, so this has to outrank it. */ 5335 .od-deck { 5336 padding: 22px 18px !important; 5337 } 5338 5339 /* The action row is a caption and a button held apart by 5340 space-between. At this width there is nothing to hold apart, so 5341 they stacked into a ragged two-line mess. The button leads, 5342 full width, and the caption sits under it as a footnote. */ 5343 .od-deck .actions { 5344 flex-direction: column-reverse; 5345 align-items: stretch; 5346 gap: 12px; 5347 } 5348 5349 .od-deck .actions .btn { 5350 width: 100%; 5351 justify-content: center; 5352 } 5353
5354 .od-deck .actions .note { 5355 text-align: center; 5356 justify-content: center; 5357 } 5358 5359 /* Three steps and two connectors do not fit across 375px. */ 5360 .od-deck #odSteps { 5361 flex-wrap: wrap; 5362 gap: 6px 8px; 5363 font-size: 9.5px; 5364 letter-spacing: .1em; 5365 } 5366 5367 /* Give the block a proper heading rather than a 11px mono label, so 5368 it reads as an invitation instead of a form caption. */ 5369 .od-deck > div:first-child { 5370 margin-bottom: 18px; 5371 padding-bottom: 14px; 5372 } 5373 5374 .od-deck > div:first-child > span:first-child { 5375 font-family: var(--serif) !important; 5376 font-size: 21px !important; 5377 letter-spacing: -.01em !important; 5378 text-transform: none !important; 5379 color: var(--paper) !important; 5380 } 5381 5382 .od-deck > p { 5383 font-size: 14.5px !important; 5384 line-height: 1.6 !important; 5385 } 5386 5387 /* The code field is 24px with .4em of tracking, which ran past the 5388 edge of the field on a narrow screen. */ 5389 .od-deck #od-code { 5390 font-size: 20px !important; 5391 letter-spacing: .28em !important; 5392 } 5393 5394 /* Touch targets. These are bare buttons styled as links. */ 5395 .od-deck #odChangeBtn, 5396 .od-deck #odResendBtn, 5397 .od-deck #odAgainBtn { 5398 padding: 8px 2px !important; 5399 } 5400 5401 .od-deck .od-ringwrap { 5402 width: 92px; 5403 height: 92px; 5404 } 5405 } 5406 </style> 5407<style> 5408 .pv { scroll-margin-top: 90px; } 5409 .pv-frame { position:relative; max-width:1120px; margin:0 auto; border-radius:18px; overflow:hidden; background:#0a1016; 5410 border:1px solid rgba(255,255,255,0.08); box-shadow:0 30px 80px rgba(0,0,0,0.35); aspect-ratio:16/9; } 5411 .pv-frame video { display:block; width:100%; height:100%; object-fit:cover; background:#0a1016; } 5412 .pv-sound { position:absolute; right:16px; top:16px; display:inline-flex; align-items:center; gap:8px; padding:10px 16px; border:0; border-radius:10px; 5413 background:rgba(10,16,22,0.78); color:#fff; font:600 15px/1 inherit; cursor:pointer; backdrop-filter:blur(4px); } 5414 .pv-sound svg { width:18px; height:18px; } 5415 .pv-sound:hover, .pv-sound:focus-visible { background:rgba(49,138,190,0.95); outline:none; } 5416 .pv-transcript { max-width:1120px; margin:18px auto 0; font-size:15px; line-height:1.6; color:var(--muted, #8a9aa8); } 5417 .pv-transcript summary { cursor:pointer; width:max-content; max-width:100%; } 5418 .pv-transcript p { margin:10px 0 0; max-width:70ch; } 5419</style> 5420<style> 5421 /* Six named rows, and every profile is a subgrid spanning all six. That is 5422 what makes the portraits, the names, the bios, the quotes and the prices 5423 line up across the row: each row takes the height of the tallest profile, 5424 so a long bio pushes every quote down together rather than only its own. 5425 Doing it with padding would need the copy to stay the length it is today. */ 5426 .roster{margin-top:clamp(28px,4vw,46px);display:grid; 5427 grid-template-columns:repeat(5,minmax(0,1fr)); 5428 grid-template-rows:auto auto auto auto auto auto; 5429 column-gap:clamp(18px,2.2vw,32px)} 5430 5431 /* Ruled, not boxed: a hairline along the top that fills with the brand 5432 gradient when the block reveals, and no fill or radius on the column 5433 itself. Nothing lifts on hover. */ 5434 .ag{position:relative;grid-row:span 6;display:grid;grid-template-rows:subgrid; 5435 color:inherit;padding-top:18px;border-top:1px solid var(--line)} 5436 5437 /* Safari before 16 and Firefox before 71 have no subgrid. They fall back to 5438 the old column, which reads correctly, just without the shared baselines. */ 5439 @supports not (grid-template-rows: subgrid){ 5440 .roster{grid-template-rows:none;row-gap:clamp(18px,2.2vw,32px)} 5441 .ag{grid-row:auto;display:flex;flex-direction:column} 5442 } 5443 .ag::before{content:"";position:absolute;
5443left:0;top:-1px;height:1px;width:0; 5444 background:var(--grad);transition:width .7s var(--ease-out)} 5445 .roster.in .ag::before{width:100%} 5446 .roster.in .ag:nth-child(1)::before{transition-delay:0.08s} 5447 .roster.in .ag:nth-child(2)::before{transition-delay:0.16s} 5448 .roster.in .ag:nth-child(3)::before{transition-delay:0.24s} 5449 .roster.in .ag:nth-child(4)::before{transition-delay:0.32s} 5450 .roster.in .ag:nth-child(5)::before{transition-delay:0.4s} 5451 /* The name is the link, stretched over the whole profile; the button sits 5452 above the stretch so it is a control of its own. */ 5453 .ag-link{color:inherit;text-decoration:none} 5454 .ag-link::after{content:"";position:absolute;inset:0;z-index:1} 5455 .ag-link:focus-visible{outline:none} 5456 .ag:has(.ag-link:focus-visible){outline:2px solid var(--signal);outline-offset:4px} 5457 5458 /* "Hear it": a quiet mono control, not a pill. */ 5459 .ag-hear{position:relative;z-index:2;align-self:start;display:inline-flex;align-items:center;gap:8px; 5460 padding:7px 12px 7px 9px;border:1px solid var(--line);border-radius:4px;background:transparent; 5461 color:var(--paper);font-family:var(--mono);font-size:10px;letter-spacing:var(--ls-label); 5462 text-transform:uppercase;cursor:pointer;transition:border-color .25s var(--ease),color .25s var(--ease)} 5463 .ag-hear svg{width:14px;height:14px;color:var(--signal)} 5464 .ag-hear small{font-size:9px;color:var(--mute);letter-spacing:var(--ls-label)} 5465 .ag-hear:hover,.ag-hear:focus-visible{border-color:var(--signal)} 5466 .ag-hear:focus-visible{outline:2px solid var(--signal);outline-offset:2px} 5467 .ag-hear .ag-hear-stop{display:none} 5468 .ag.speaking .ag-hear{border-color:var(--signal)} 5469 .ag.speaking .ag-hear .ag-hear-play{display:none} 5470 .ag.speaking .ag-hear .ag-hear-stop{display:inline} 5471 5472 /* What the voice is saying, over the bottom of the portrait while it 5473 speaks: a dark band, each word dim until said. Over the art rather than 5474 in the copy, so nothing in the row moves. */ 5475 .ag-shot > .ag-cap{position:absolute;left:0;right:0;bottom:0;width:auto;height:auto;z-index:1; 5476 padding:46px 14px 13px;background:linear-gradient(180deg,rgba(8,14,20,0),rgba(8,14,20,.9) 42%); 5477 font-size:12.5px;line-height:1.45;color:rgba(255,255,255,.38);text-align:left; 5478 opacity:0;transition:opacity .25s var(--ease)} 5479 .ag-cap .w{transition:color .18s var(--ease)} 5480 .ag-cap .w.on{color:#fff} 5481 .ag.speaking .ag-cap{opacity:1} 5482 5483 /* The portrait wakes: its ground comes up as on hover, the figure floats, 5484 and a waveform runs along the bottom while anyone is speaking. */ 5485 .ag-shot > .ag-wave{position:absolute;left:0;right:0;top:12px;width:auto;height:26px; 5486 display:flex;align-items:center;justify-content:center;gap:4px;opacity:0;transition:opacity .25s var(--ease)} 5487 .ag-wave i{display:block;width:4px;height:6px;border-radius:2px;background:#fff} 5488 .ag.speaking .ag-wave{opacity:.9} 5489 .ag.speaking .ag-wave i{animation:ag-wave .9s ease-in-out infinite} 5490 .ag-wave i:nth-child(1){animation-delay:0s} 5491 .ag-wave i:nth-child(2){animation-delay:0.32s} 5492 .ag-wave i:nth-child(3){animation-delay:0.12s} 5493 .ag-wave i:nth-child(4){animation-delay:0.5s} 5494 .ag-wave i:nth-child(5){animation-delay:0.2s} 5495 .ag-wave i:nth-child(6){animation-delay:0.4s} 5496 .ag-wave i:nth-child(7){animation-delay:0.06s} 5497 @keyframes ag-wave{0%,100%{height:5px}50%{height:22px}} 5498 .ag.speaking .tk-ground-hot{opacity:1} 5499 .ag.speaking .tk-figure{animation:tk-float 1.6s ease-in-out infinite} 5500 5501 /* Square, and never anything else: the art is composed to a 1:1 crop with 5502 the figure running to the bottom edge, so letterboxing it cuts the 5503 drawing. The brief also sets a 120px floor, below which the badge closes 5504 up, which is why the phone thumbnail is 120 and not smaller. */ 5505 .ag-shot{position:relative;aspect-ratio:1/1;overflow:hidden;border-radius:4px; 5506 background:var(--ink-2);display:grid;place-items:center} 5507 .ag-shot > *{display:block;width:100%;height:100%} 5508 5509 /* the stand-in: the agent's initial on the brand gradient */ 5510 .ag-mono{display:grid;place-items:center;width:100%;height:100%; 5511 background:var(--grad);color:var(--on-accent); 5512 font-family:var(--serif);font-size:clamp(44px,5vw,64px);font-weight:600; 5513 letter-spacing:-.03em;line-height:1} 5514 5515 .ag-name{font-size:clamp(18px,1.5vw,21px);font-weight:600;letter-spacing:var(--ls-head); 5516 color:var(--paper);margin:16px 0 0;display:flex;align-items:baseline;gap:8px; 5517 transition:color .3s var(--ease)} 5518 /* the qualifier is a mono word, not a pill: the guide has no pills */ 5519 .ag-name em{font-family:var(--mono);font-style:normal;font-size:9px;font-weight:500; 5520 letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--signal)} 5521 .ag:hover .ag-name{color:var(--signal)} 5522 5523 .ag-role{font-family:var(--mono);font-size:10px;letter-spacing:var(--ls-label); 5524 text-transform:uppercase;color:var(--mute);margin:7px 0 0} 5525 5526 .ag-bio{font-size:var(--t-small);line-height:1.55;color:var(--bone);margin:13px 0 0} 5527 5528 /* the agent in its own voice, ruled down the left the way the guide rules a 5529 quote, so a profile carries a line of proof rather than only a claim */ 5530 .ag-said{margin:15px 0 0;padding-left:13px;border-left:2px solid var(--blue); 5531 font-size:13px;line-height:1.5;color:var(--paper)} 5532 .ag-said::before{content:"\201C"} 5533 .ag-said::after{content:"\201D"} 5534 5535 .ag-foot{align-self:end;padding-top:18px;display:flex;flex-direction:column;gap:9px} 5536 .ag-price{font-family:var(--mono);font-size:var(--t-label);letter-spacing:var(--ls-label); 5537 text-transform:uppercase;color:var(--mute)} 5538 .ag-price b{font-family:var(--serif);font-size:16px;font-weight:600;letter-spacing:-.01em; 5539 color:var(--paper);text-transform:none} 5540 .ag-go{font-family:var(--mono);font-size:10px;letter-spacing:var(--ls-label); 5541 text-transform:uppercase;color:var(--mute);display:inline-flex;align-items:center;gap:8px; 5542 transition:color .3s var(--ease)} 5543 .ag-go .arr{font-style:normal;transition:transform .3s var(--ease-out)} 5544 .ag:hover .ag-go{color:var(--paper)} 5545 .ag:hover .ag-go .arr{transform:translateX(4px)} 5546 5547 /* row-gap would open a gap between every one of the six subgrid rows, not 5548 just between bands of profiles, so the space under a profile is carried by 5549 its own last row instead. */ 5550 .ag-foot{padding-bottom:6px} 5551 5552 @media (max-width:1180px){ 5553 .roster{grid-template-columns:repeat(3,minmax(0,1fr))} 5554 .ag-foot{padding-bottom:38px} 5555 } 5556 @media (max-width:820px){ 5557 .roster{grid-template-columns:repeat(2,minmax(0,1fr))} 5558 .ag-bio{font-size:13.5px} 5559 } 5560 @media (max-width:520px){ 5561 /* One per row on a phone, with the portrait beside the copy rather than 5562 five full-width images to scroll past. Subgrid is dropped here: with one 5563 profile per row there is nothing left to line up against. */ 5564 .roster{grid-template-columns:1fr;grid-template-rows:none} 5565 .ag{grid-row:auto; 5566 grid-template-columns:120px minmax(0,1fr); 5567 grid-template-rows:auto auto auto auto; 5568 grid-template-areas:"shot name" "shot role" "shot bio" "foot foot";
5569 column-gap:16px;padding:18px 0 0} 5570 .ag-shot{grid-area:shot;align-self:start} 5571 .ag-name{grid-area:name;margin-top:0} 5572 .ag-role{grid-area:role} 5573 .ag-bio{grid-area:bio} 5574 .ag-said{display:none} 5575 .ag-foot{grid-area:foot;padding-top:14px;padding-bottom:18px; 5576 flex-direction:row;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:12px 16px} 5577 .ag-hear{flex-basis:100%;justify-content:center} 5578 } 5579 5580 /* Hover lives inside the drawing: the figure floats. 5581 transform-box:fill-box is not optional -- without it a CSS transform on an 5582 SVG group is measured against the whole SVG viewport rather than the 5583 element, so the float travels the wrong distance. 5584 5585 The star wink went with the artwork that had a face. The figure is a 5586 plain silhouette now and carries no star to wink. 5587 5588 The card itself does not lift. The brief asks for translateY(-8px), but 5589 "nothing lifts on hover" is a rule of the site's design language 5590 (docs/frontend-design-language.md), and the float and the ground 5591 cross-fade already make the tile feel live. Say the word and it goes on. */ 5592 .ag .tk-figure{transform-box:fill-box} 5593 .ag:hover .tk-figure{animation:tk-float 2.4s ease-in-out infinite} 5594 5595 /* The ground cross-fade. Each tile sits on slate and carries a second 5596 full-bleed rect of brand blue at opacity 0; hovering brings it up. The 5597 inline opacity="0" in the file is a presentation attribute, so any CSS 5598 rule outranks it and this needs no !important. */ 5599 .tk-ground-hot{opacity:0;transition:opacity 340ms ease} 5600 .ag:hover .tk-ground-hot{opacity:1} 5601 5602 @keyframes tk-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}} 5603 5604 @media (prefers-reduced-motion: reduce){ 5605 .ag::before{transition:none} 5606 .ag-go,.ag-go .arr,.ag-name{transition:none} 5607 .ag:hover .tk-figure,.ag.speaking .tk-figure{animation:none} 5608 .ag.speaking .ag-wave i{animation:none;height:12px} 5609 /* the ground still changes on hover, it just stops sliding there */ 5610 .tk-ground-hot{transition:none} 5611 } 5612</style> 5613<style> 5614 /* The sector kicker: a 28px rule then mono caps, which is how the guide 5615 sets a kicker. Four groups in the same order as the Industries menu, so 5616 somebody who found their trade in the nav finds it in the same place 5617 here. Twenty-two tiles in one alphabetical run meant a plumber read past 5618 the Chinese takeaways to reach their own trade. */ 5619 .trade-sector{margin:clamp(34px,4vw,54px) 0 clamp(16px,1.8vw,24px); 5620 font-family:var(--mono);font-size:var(--t-label);font-weight:500; 5621 letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--mute); 5622 display:flex;align-items:center;gap:14px} 5623 .trade-sector::before{content:"";flex:0 0 28px;height:1px;background:var(--signal)} 5624 .trade-sector:first-of-type{margin-top:clamp(24px,3vw,36px)} 5625</style> 5626 <style> 5627 .tst { 5628 position: relative 5629 } 5630 5631 /* scroll-snap does the paging, so the rail still works with JS off and keeps 5632 native touch momentum on mobile */ 5633 .tst-track { 5634 display: flex; 5635 gap: 36px; 5636 overflow-x: auto; 5637 scroll-snap-type: x mandatory; 5638 scroll-behavior: smooth; 5639 padding: 2px 2px 6px; 5640 margin: 0 -2px; 5641 scrollbar-width: none; 5642 -ms-overflow-style: none 5643 } 5644 5645 .tst-track::-webkit-scrollbar {
5646 display: none 5647 } 5648 5649 /* V2 design language: a review is a top-ruled column, not a filled card. 5650 The rule fills with the brand gradient on hover, the way every other 5651 ruled block on the site does. */ 5652 .tst-card { 5653 position: relative; 5654 flex: 0 0 calc((100% - 72px) / 3); 5655 scroll-snap-align: start; 5656 padding: 28px 0 0; 5657 display: flex; 5658 flex-direction: column; 5659 gap: 16px 5660 } 5661 5662 .tst-card::before, .tst-card::after { 5663 content: ""; 5664 position: absolute; 5665 top: 0; 5666 left: 0; 5667 right: 0; 5668 height: 1px 5669 } 5670 5671 .tst-card::before { 5672 background: var(--line-2) 5673 } 5674 5675 .tst-card::after { 5676 background: var(--grad); 5677 transform: scaleX(0); 5678 transform-origin: left; 5679 transition: transform .5s var(--ease-out) 5680 } 5681 5682 .tst-card:hover::after { 5683 transform: scaleX(1) 5684 } 5685 5686 .tst-top { 5687 display: flex; 5688 justify-content: space-between; 5689 align-items: center 5690 } 5691 5692 .tst-stars { 5693 color: var(--signal); 5694 font-size: 13px; 5695 letter-spacing: 2px 5696 } 5697 5698 .tst-badge { 5699 font-family: var(--mono); 5700 font-size: 9.5px; 5701 letter-spacing: .16em; 5702 text-transform: uppercase; 5703 color: var(--mute) 5704 } 5705 5706 .tst-quote { 5707 font-family: var(--serif); 5708 font-weight: 300; 5709 font-size: 17.5px; 5710 line-height: 1.45; 5711 letter-spacing: -.008em; 5712 color: var(--paper); 5713 margin: 0; 5714 flex: 1 5715 } 5716 5717 .tst-quote mark { 5718 background: linear-gradient(180deg, transparent 62%, color-mix(in srgb, var(--signal) 55%, transparent) 62%); 5719 color: inherit; 5720 padding: 0 2px; 5721 -webkit-box-decoration-break: clone; 5722 box-decoration-break: clone 5723 } 5724 5725 /* clamped rather than cut in the markup, so the whole review stays in the DOM 5726 for search engines and screen readers */ 5727 .tst-quote.is-clamped { 5728 display: -webkit-box; 5729 -webkit-line-clamp: 7; 5730 -webkit-box-orient: vertical; 5731 overflow: hidden; 5732 flex: 0 0 auto 5733 } 5734 5735 .tst-more-btn { 5736 align-self: flex-start; 5737 font-family: var(--mono); 5738 font-size: 10px; 5739 letter-spacing: .14em; 5740 text-transform: uppercase; 5741 color: var(--mute); 5742 background: none; 5743 border: 0; 5744 border-bottom: 1px solid var(--line-2); 5745 padding: 0 0 3px; 5746 cursor: pointer; 5747 transition: color .25s var(--ease) 5748 } 5749 5750 .tst-more-btn:hover { 5751 color: var(--paper) 5752 } 5753 5754 .tst-more-btn:focus-visible { 5755 outline: 2px solid var(--plasma-bright); 5756 outline-offset: 3px 5757 } 5758 5759 .tst-foot { 5760 display: flex; 5761 align-items: center; 5762 gap: 14px; 5763 margin-top: auto; 5764 border-top: 1px dashed var(--line); 5765 padding-top: 18px 5766 } 5767 5768 .tst-init { 5769 width: 40px; 5770 height: 40px; 5771 border-radius: 50%; 5772 background: var(--grad); 5773 display: grid; 5774 place-items: center; 5775 color: var(--on-accent); 5776 font-family: var(--serif); 5777 font-weight: 500; 5778 font-size: 15px; 5779 flex: 0 0 40px 5780 } 5781 5782 .tst-name { 5783 font-family: var(--sans); 5784 font-size: 14px; 5785 color: var(--paper); 5786 font-weight: 500 5787 } 5788 5789 .tst-role { 5790 font-family: var(--mono); 5791 font-size: 10.5px; 5792 color: var(--mute); 5793 letter-spacing: .04em 5794 } 5795 5796 .tst-controls { 5797 display: flex; 5798 align-items: center; 5799 justify-content: center; 5800 gap: 16px; 5801 margin-top: 26px 5802 } 5803 5804 .tst-arrow { 5805 width: 38px; 5806 height: 38px; 5807 border-radius: 50%; 5808 border: 1px solid var(--line); 5809 background: none; 5810 color: var(--mute); 5811 cursor: pointer; 5812 font-size: 15px; 5813 transition: color .25s var(--ease), border-color .25s var(--ease) 5814 } 5815 5816 .tst-arrow:hover { 5817 color: var(--paper); 5818 border-color: var(--line-2) 5819 } 5820 5821 .tst-arrow:focus-visible { 5822 outline: 2px solid var(--plasma-bright); 5823 outline-offset: 2px 5824 } 5825 5826 .tst-dots { 5827 display: flex; 5828 gap: 8px 5829 } 5830 5831 .tst-dot { 5832 width: 7px; 5833 height: 7px; 5834 border-radius: 50%; 5835 border: 0; 5836 padding: 0; 5837 cursor: pointer; 5838 background: var(--line-2); 5839 transition: background .25s var(--ease), width .25s var(--ease) 5840 } 5841 5842 .tst-dot.is-on { 5843 background: var(--signal);
5844 width: 20px; 5845 border-radius: 4px 5846 } 5847 5848 .tst-dot:focus-visible { 5849 outline: 2px solid var(--plasma-bright); 5850 outline-offset: 3px 5851 } 5852 5853 .tst-more { 5854 margin-top: 26px; 5855 text-align: center 5856 } 5857 5858 .tst-more a { 5859 font-family: var(--mono); 5860 font-size: 11px; 5861 letter-spacing: .16em; 5862 text-transform: uppercase; 5863 color: var(--mute); 5864 display: inline-flex; 5865 align-items: center; 5866 gap: 9px; 5867 padding: 11px 0 6px; 5868 border-bottom: 1px solid var(--line-2); 5869 transition: color .3s var(--ease), border-color .3s var(--ease) 5870 } 5871 5872 .tst-more a:hover { 5873 color: var(--paper); 5874 border-bottom-color: var(--signal) 5875 } 5876 5877 .tst-more .arr { 5878 transition: transform .3s var(--ease-out) 5879 } 5880 5881 .tst-more a:hover .arr { 5882 transform: translateX(4px) 5883 } 5884 5885 @media (max-width: 1100px) { 5886 .tst-card { 5887 flex-basis: calc((100% - 36px) / 2) 5888 } 5889 } 5890 5891 @media (max-width: 720px) { 5892 .tst-card { 5893 flex-basis: 100% 5894 } 5895 } 5896 5897 @media (prefers-reduced-motion: reduce) { 5898 .tst-track { 5899 scroll-behavior: auto 5900 } 5901 5902 .tst-card::after, .tst-arrow, .tst-dot, .tst-more a, .tst-more .arr, .tst-more-btn { 5903 transition: none 5904 } 5905 } 5906 </style> 5907</head> 5908<body data-page="home"> 5909<!-- Google Tag Manager (noscript) -->
vendor: 73 bytes, lines 5909-5911
5909 5910<noscript> 5911 <iframe src="https://www.googletagmanager.com/ns.html?id=
5911GTM-TTGHDLQ4
vendor: 97 bytes, lines 5911-5914
5911" 5912 height="0" width="0" style="display:none;visibility:hidden"></iframe> 5913</noscript> 5914
5915<!-- End Google Tag Manager (noscript) --> 5916<div class="grain"></div> 5917<div class="scanlines"></div> 5918<div class="vignette"></div> 5919 5920<nav class="nav"> 5921 5922 <a href="https://talkify.nz" class="logo" aria-label="Talkify, home"> 5923 <svg class="tk-logo" viewBox="-3 -3 317.81 106" 5924 width="113.93" height="38" 5925 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 5926 <defs> 5927 <linearGradient id="tkgXIGJlH" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 5928 <stop offset="0" stop-color="#318abe"/> 5929 <stop offset="1" stop-color="#a3d654"/> 5930 </linearGradient> 5931 </defs> 5932 <circle cx="50" cy="50" r="50" fill="url(#tkgXIGJlH)"/> 5933 5934 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 5935 <path d="M34 26 V54 C34 74 62 80 76 62"/> 5936 <path d="M20 40 H46"/> 5937 </g> 5938 5939 <g transform="translate(56 20) scale(0.30)"> 5940 <g class="tk-eye"> 5941 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 5942 </g> 5943 </g> 5944 <path d="M271.37 19.44 L274.1 19.47 L276.98 20.13 L279.56 21.51 L281.93 23.58 L276.86 28.65 L275.24 27.45 L274.04 26.97 L273.32 26.85 L270.62 26.97 L269.6 27.27 L268.28 28.05 L267.23 29.28 L266.57 30.96 L266.39 32.28 L266.39 37.38 L284.84 37.41 L293.66 59.85 L302.99 37.5 L311.81 37.44 L289.55 86.04 L289.34 86.37 L288.98 86.37 L280.61 86.34 L289.25 68.4 L276.89 39.18 L276.8 44.61 L266.39 44.64 L266.36 71.97 L258.47 71.94 L258.47 44.64 L250.19 44.58 L250.19 37.44 L258.44 37.41 L258.47 32.28 L258.71 30 L259.49 27.36 L260.69 25.14 L262.52 23.01 L264.98 21.21 L267.8 20.01 L270.08 19.53ZM190.01 20.16 L197.93 20.16 L197.93 71.94 L190.01 71.94ZM204.53 20.16 L212.45 20.16 L212.48 53.61 L226.46 37.41 L235.85 37.44 L221.33 53.94 L230.24 64.47 L236.57 71.94 L226.52 71.97 L212.48 55.05 L212.45 71.94 L204.53 71.94ZM131.63 23.04 L139.55 23.04 L139.58 37.41 L147.83 37.44 L147.8 44.61 L139.55 44.64 L139.55 71.94 L131.63 71.94 L131.63 44.64 L123.35 44.58 L123.38 37.41 L131.63 37.38ZM164.09 36.72 L167.06 36.81 L170.24 37.59 L171.92 38.37 L173.42 39.33 L175.4 41.19 L175.52 37.41 L183.41 37.44 L183.41 71.94 L175.52 71.97 L175.46 68.25 L174.08 69.57 L172.85 70.44 L170.84 71.55 L169.34 72.09 L167.84 72.45 L165.8 72.69 L163.76 72.69 L161.84 72.45 L159.92 71.97 L158.48 71.43 L156.44 70.35 L154.76 69.15 L152.27 66.66 L150.47 63.96 L149.57 62.04 L148.91 60.06 L148.55 58.5 L148.25 55.86 L148.37 52.2 L148.79 49.86 L149.39 47.88 L149.93 46.56 L151.01 44.58 L152.33 42.72 L153.65 41.28 L156.5 39.03 L158.54 37.95 L159.98 37.41 L161.9 36.93ZM239.21 37.44 L247.13 37.44 L247.13 71.94 L239.21 71.94ZM165.2 44.19 L163.04 44.61 L161.48 45.27 L159.98 46.29 L158.51 47.82 L157.73 49.02 L156.83 51.18 L156.41 53.52 L156.41 55.86 L156.65 57.48 L157.31 59.52 L158.51 61.56 L160.04 63.15 L161.48 64.11 L163.46 64.89 L165.32 65.19 L167.12 65.13 L169.34 64.77 L171.14 63.99 L172.34 63.15 L173.99 61.38 L175.01 59.64 L175.67 57.66 L175.97 55.44 L175.91 53.1 L175.49 51 L174.53 48.78 L173.81 47.7 L172.52 46.35 L170.84 45.21 L169.16 44.55 L167.18 44.19Z" fill="var(--tk-word, #101820)" fill-rule="evenodd"/> 5945 5946 <g transform="translate(231.30 6.84) scale(0.216)"> 5947 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" 5948 fill="#a3d654"/> 5949 </g> 5950 </svg> 5951 </a> 5952 <ul> 5953 <li class="nav-drop" data-nav-drop> 5954 <button type="button" class="nav-drop-btn " 5955 aria-expanded="false" aria-controls="nav-agents-menu" aria-haspopup="true"> 5956 <span class="dot"></span>Agents 5957 <svg class="nav-drop-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg> 5958 </button> 5959 5960 5961 <div class="nav-drop-panel" id="nav-agents-menu"> 5962 <div class="nav-drop-col"> 5963 <span class="nav-drop-hd">Answering calls</span> 5964 <a href="https://talkify.nz/reception"><span>Reception</span><em>Answers every call, books the job</em></a> 5965 <a href="https://talkify.nz/personal-assistant"><span>Personal Assistant</span><em>Your own PA on the phone</em></a> 5966 <a href="https://talkify.nz/booking-service"><span>Booking Service</span><em>Fills the diary while you work</em></a> 5967 <a href="https://talkify.nz/front-counter"><span>Front Counter</span><em>Orders and bookings on a screen by the till</em></a> 5968 <a href="https://talkify.nz/ai-call-centre"><span>AI Call Centre</span><em>5, 10 or 15 lines at once</em></a>
5969 <span class="nav-drop-hd" style="margin-top:18px">Other channels</span> 5970 <a href="https://talkify.nz/website-chat"><span>Website Chat</span><em>The same agent, in a chat box on your site</em></a> 5971 <a href="https://talkify.nz/calendar"><span>Calendar</span><em>The diary the agent books into</em></a> 5972 <a href="https://talkify.nz/lead-management"><span>Leads</span><em>Every enquiry on one board, whatever door it came through</em></a> 5973 <a href="https://talkify.nz/agent-coach"><span>Coach</span><em>Your agent listens back to its own calls</em></a> 5974 </div> 5975 <div class="nav-drop-col"> 5976 <span class="nav-drop-hd">Ringing out</span> 5977 <a href="https://talkify.nz/sales-agent"><span>Sales Agent</span><em>Qualifies and follows up leads</em></a> 5978 <a href="https://talkify.nz/outbound-calls"><span>Outbound Calls</span><em>Campaigns, reminders, win-backs</em></a> 5979 <a href="https://talkify.nz/ai-marketing-campaigns"><span>Marketing Campaigns</span><em>Offers, launches and reviews, by phone</em></a> 5980 <a href="https://talkify.nz/ai-phone-surveys"><span>Campaign Agent</span><em>Rings your list, asks your questions, reports back</em></a> 5981 <a href="https://talkify.nz/debt-collection"><span>Debt Collection</span><em>Chases overdue invoices from Xero</em></a> 5982 <a href="https://talkify.nz/ai-wellness-checks"><span>Wellness Checks</span><em>Rings to check somebody is alright</em></a> 5983 5984 <a href="https://talkify.nz/dialler"><span>Dialler</span><em>Your own team ringing out, from the browser</em></a> 5985 <a href="https://talkify.nz/agents" class="nav-drop-all">See all agents <span class="arr">→</span></a> 5986 </div> 5987 </div> 5988 </li> 5989 5990 <li class="nav-drop" data-nav-drop> 5991 <button type="button" class="nav-drop-btn " 5992 aria-expanded="false" aria-controls="nav-industries-menu" aria-haspopup="true"> 5993 <span class="dot"></span>Industries 5994 <svg class="nav-drop-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg> 5995 </button> 5996 5997 5998 <div class="nav-drop-panel nav-drop-panel--industries" id="nav-industries-menu"> 5999 <div class="nav-drop-col"> 6000 <span class="nav-drop-hd">Trades</span> 6001 <a href="https://talkify.nz/tradesman">All Trades</a> 6002 <a href="https://talkify.nz/builder">Builders</a> 6003 <a href="https://talkify.nz/electrician">Electricians</a> 6004 <a href="https://talkify.nz/hvac">Heat Pump & HVAC</a> 6005 <a href="https://talkify.nz/landscaping">Landscaping</a> 6006 <a href="https://talkify.nz/automotive">Mechanics</a> 6007 <a href="https://talkify.nz/pest-control">Pest Control</a> 6008 <a href="https://talkify.nz/plumber">Plumbing</a> 6009 </div> 6010 <div class="nav-drop-col"> 6011 <span class="nav-drop-hd">Health & beauty</span> 6012 <a href="https://talkify.nz/barber">Barbers</a> 6013 <a href="https://talkify.nz/beauty">Beauty & Wellness</a> 6014 <a href="https://talkify.nz/gym">Gyms & Studios</a> 6015 <a href="https://talkify.nz/personal-trainer">Personal Trainers</a> 6016 <a href="https://talkify.nz/physio">Physio & Clinics</a> 6017 <span class="nav-drop-hd" style="margin-top:18px">Office & property</span> 6018 <a href="https://talkify.nz/accountant">Accountants</a> 6019 <a href="https://talkify.nz/professional-services">Professional Services</a> 6020 <a href="https://talkify.nz/real-estate">Real Estate</a> 6021 <a href="https://talkify.nz/retail">Retail</a> 6022 </div> 6023 <div class="nav-drop-col"> 6024 <span class="nav-drop-hd">Food & hospitality</span> 6025 <a href="https://talkify.nz/cafe">Cafes</a> 6026 <a href="https://talkify.nz/chinese-takeaway">Chinese Takeaways</a> 6027 <a href="https://talkify.nz/fish-and-chip-shop">Fish & Chip Shops</a> 6028 <a href="https://talkify.nz/hotel">Hotels & Motels</a> 6029 <a href="https://talkify.nz/pizza-shop">Pizza Shops</a> 6030 <a href="https://talkify.nz/restaurant-bookings">Restaurants</a> 6031 <a href="https://talkify.nz/industries" class="nav-drop-all">See all industries <span class="arr">→</span></a> 6032 </div> 6033 </div> 6034 </li> 6035 <li class="nav-drop" data-nav-drop> 6036 <button type="button" class="nav-drop-btn " 6037 aria-expanded="false" aria-controls="nav-integrations-menu" aria-haspopup="true">
6038 <span class="dot"></span>Integrations 6039 <svg class="nav-drop-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg> 6040 </button> 6041 6042 <div class="nav-drop-panel nav-drop-panel--single" id="nav-integrations-menu"> 6043 <div class="nav-drop-col"> 6044 <span class="nav-drop-hd">Plugs into</span> 6045 <a href="https://talkify.nz/integrations"><span>All integrations</span><em>The software the agent already talks to</em></a> 6046 <a href="https://talkify.nz/business-phone-lines"><span>Phone Lines</span><em>Numbers, porting and how calls reach us</em></a> 6047 </div> 6048 </div> 6049 </li> 6050 <li><a href="https://talkify.nz/pricing" class=""><span class="dot"></span>Pricing</a></li> 6051 <li><a href="https://talkify.nz/blog" class=""><span class="dot"></span>Journal</a></li> 6052 <li><a href="https://talkify.nz/signup" class=""><span class="dot"></span>Get started</a></li> 6053 </ul> 6054 <div class="actions"> 6055 <button type="button" class="theme-toggle" data-theme-toggle aria-label="Switch between light and dark theme" title="Switch theme"> 6056 <svg class="icon-sun" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></svg> 6057 <svg class="icon-moon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg> 6058 </button> 6059 6060 <a href="https://talkify.nz/signup" class="num num-signup" title="Sign up online, or ring 0800 002 967">Sign up · <b>0800 002 967</b></a> 6061 <a href="tel:+64800002967" class="num num-call" title="Call us on 0800 002 967" aria-label="Call us on 0800 002 967"> 6062 <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07 19.5 19.5 0 01-6-6 19.79 19.79 0 01-3.07-8.67A2 2 0 014.11 2h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L8.09 9.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z"/></svg> 6063 </a> 6064 <a href="https://talkify.nz/login" class="num" style="font-family:var(--sans);font-size:13px;color:var(--bone)">Sign in</a> 6065 <a href="https://talkify.nz/signup" class="btn btn-primary">Start free <span class="arr">â</span></a> 6066 <button class="menu-btn" aria-label="Open menu"> 6067 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7h16M4 12h16M4 17h16"/></svg> 6068 </button> 6069 </div> 6070</nav> 6071 6072 6073 <section class="hero"> 6074 <div class="hero-bg"> 6075 6076 <div class="photo" 6077 style="--shot-dark:image-set(url('https://talkify.nz/media/frontend/hero-phone-night.webp') type('image/webp'), url('https://talkify.nz/media/frontend/hero-phone-night.jpg') type('image/jpeg'));--shot-light:image-set(url('https://talkify.nz/media/frontend/hero-phone-day.webp') type('image/webp'), url('https://talkify.nz/media/frontend/hero-phone-day.jpg') type('image/jpeg'))"></div> 6078 <div class="glow1"></div> 6079 <div class="glow2"></div> 6080 <div class="grid-lines"></div> 6081 </div> 6082 6083 <div class="hero-shell"> 6084 <div> 6085 6086 6087 <h1 class="display"> 6088 <span class="ln"><span>The AI receptionist</span></span> 6089 <span class="ln"><span class="out">built for</span></span> 6090 <span class="ln"><span class="it">New Zealand.</span></span> 6091 </h1> 6092 6093 <p class="hero-sub"> 6094 Talkify answers your business phone 24/7 in a real Kiwi voice. It greets callers in your tone, 6095 answers their questions, qualifies leads, books straight into your calendar, and escalates to a 6096 human when it should. The phone is the last unsolved interface, and this is a 6097 <b>voice operating system</b> sitting across it. It works while you don't. 6098 </p> 6099 6100 <div class="hero-cta"> 6101 <a href="https://talkify.nz/contact" class="btn btn-primary btn-lg">Start your agent free <span 6102 class="arr">â</span></a> 6103 <a href="tel:+6432421262" data-talkify-agent="default" class="btn btn-ghost btn-lg">Or hear it live · 6104 03 242 1262</a> 6105 <a href="sms:+64272048827" class="btn btn-ghost btn-lg" 6106 title="Text us instead of ringing"> 6107 <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" 6108 stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="flex:none">
6109 <path d="M21 11.5a8.4 8.4 0 01-9 8.4 9.5 9.5 0 01-2.6-.4L3 21l1.6-4.2A8.2 8.2 0 013 11.5 8.4 8.4 0 0112 3a8.4 8.4 0 019 8.5z"/> 6110 </svg> 6111 Text our agent · 027 204 8827 </a> 6112 </div> 6113 6114 <dl class="hero-meta"> 6115 <div> 6116 <dt>Pickup latency</dt> 6117 <dd><b>from 0.4s</b></dd> 6118 </div> 6119 6120 <div> 6121 <dt>Voices</dt> 6122 <dd>80+ <small>30+ NZ & AU</small></dd> 6123 </div> 6124 6125 <div> 6126 <dt>Languages</dt> 6127 <dd>30+ <small>detected on the call</small></dd> 6128 </div> 6129 6130 <div> 6131 <dt>Reception from</dt> 6132 <dd>$129<small>/mo · or pay as you go</small></dd> 6133 </div> 6134 6135 <div> 6136 <dt>Answering NZ calls since</dt> 6137 <dd>2024<small>built in Christchurch</small></dd> 6138 </div> 6139 </dl> 6140 </div> 6141 6142 6143 6144 <div class="hero-demo"> 6145 <aside class="deck od-deck" style="padding:28px" aria-label="Live demo dialler"> 6146 <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;padding-bottom:18px;border-bottom:1px solid var(--line)"> 6147 6148 <span class="od-title">Hear it for yourself</span> 6149 <span style="font-family:var(--mono);font-size:11px;color:var(--signal)" id="odStatus">â Online</span> 6150 </div> 6151 6152 <p style="margin:-6px 0 20px;color:var(--bone);font-size:14px;line-height:1.55">Enter your name and mobile, verify the code we text you, and our AI agent rings you within seconds. Free, about two minutes.</p> 6153 6154 6155 <div id="odSteps" 6156 style="display:flex;align-items:center;gap:10px;margin-bottom:20px;font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute)"> 6157 <span data-step="details">1 · Details</span> 6158 <span style="flex:0 0 18px;height:1px;background:var(--line)"></span> 6159 <span data-step="verify">2 · Verify</span> 6160 <span style="flex:0 0 18px;height:1px;background:var(--line)"></span> 6161 <span data-step="call">3 · Your call</span> 6162 </div> 6163 6164 <div id="odErr" hidden 6165 style="margin-bottom:18px;padding:14px 16px;border:1px solid var(--coral);background:rgba(255,94,58,.08);border-radius:10px;font-family:var(--mono);font-size:12px;color:var(--paper);letter-spacing:.04em"></div> 6166 6167 6168 <form class="form od-panel" id="odDetails" method="POST" action="https://talkify.nz/demo" autocomplete="on"> 6169 <div class="field"> 6170 <label>Your first name</label> 6171 <input type="text" name="name" id="od-name" required minlength="2" maxlength="80" 6172 placeholder="Your first name" autocomplete="given-name"> 6173 </div> 6174 6175 <div class="field"> 6176 6177 <label>NZ or AU mobile number</label> 6178 <input type="tel" name="mobile" id="od-mobile" required 6179 placeholder="Your mobile" 6180 autocomplete="tel" inputmode="tel" 6181 pattern="^((\+?64|0)\s?2[0127]\s?[0-9 \-]{6,11}|(\+?61|0)\s?4[0-9 \-]{7,11})$" 6182 title="A New Zealand mobile starting 020, 021, 022 or 027, or an Australian mobile starting 04"> 6183 <span style="font-family:var(--mono);font-size:10px;color:var(--mute);letter-spacing:.06em;margin-top:4px">020, 021, 022, 027, or AU 04 · We text a code, then call you.</span> 6184 </div> 6185 6186 6187 <div style="position:absolute;left:-9999px;top:-9999px;height:0;width:0;overflow:hidden" aria-hidden="true"> 6188 <label>Leave blank</label> 6189 <input type="text" name="company_reference" id="od-company-reference" tabindex="-1" autocomplete="off"> 6190 </div> 6191 6192 6193 <div class="actions">
6194 <span class="note">â NZ & AU mobiles · 3 calls per number</span> 6195 <button type="submit" disabled class="btn btn-primary btn-lg" id="odSendBtn">Text me my code 6196 <span class="arr">â</span></button> 6197 </div> 6198 </form> 6199 6200 6201 <form class="form od-panel" id="odVerify" hidden autocomplete="off"> 6202 <p style="font-family:var(--mono);font-size:12px;color:var(--bone);letter-spacing:.04em;margin:0 0 6px"> 6203 Code sent to <b id="odMobileShown" style="color:var(--paper)">your mobile</b>. 6204 Enter it below and the call starts straight away.</p> 6205 6206 <div class="field"> 6207 <label>6 digit verification code</label> 6208 <input type="text" name="code" id="od-code" required inputmode="numeric" 6209 autocomplete="one-time-code" pattern="\d{6}" maxlength="6" placeholder="â¢â¢â¢â¢â¢â¢" 6210 style="font-family:var(--mono);font-size:24px;letter-spacing:.4em;text-align:center"> 6211 <span style="font-family:var(--mono);font-size:10px;color:var(--mute);letter-spacing:.06em;margin-top:4px">Expires in 10 minutes.</span> 6212 </div> 6213 6214 <div class="actions"> 6215 <span class="note" style="display:flex;gap:14px"> 6216 <button type="button" id="odChangeBtn" 6217 style="appearance:none;background:none;border:none;cursor:pointer;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--mute);padding:0">â Change details</button> 6218 <button type="button" id="odResendBtn" disabled 6219 style="appearance:none;background:none;border:none;cursor:pointer;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--bone);padding:0">Resend (<span 6220 id="odResendCount">30</span>)</button> 6221 </span> 6222 <button type="submit" disabled class="btn btn-primary btn-lg" id="odVerifyBtn">Verify + call me 6223 <span class="arr">â</span></button> 6224 </div> 6225 </form> 6226 6227 6228 <div class="od-panel" id="odCalling" hidden style="text-align:center;padding:12px 0 6px"> 6229 <div class="od-ringwrap"> 6230 <span class="od-ring"></span><span class="od-ring od-r2"></span><span class="od-ring od-r3"></span> 6231 <span class="od-core"><svg width="26" height="26" viewBox="0 0 24 24" fill="none" 6232 stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path 6233 d="M3 5a2 2 0 012-2h2.5a1 1 0 01.96.73l1.2 4.2a1 1 0 01-.5 1.16l-1.94.97a11 11 0 005.7 5.7l.97-1.94a1 1 0 011.16-.5l4.2 1.2a1 1 0 01.73.96V19a2 2 0 01-2 2A16 16 0 013 5z"/></svg></span> 6234 </div> 6235 <div style="font-family:var(--mono);font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--signal);margin:18px 0 8px"> 6236 Calling you now<span class="od-dots"></span></div> 6237 <p style="color:var(--bone);font-size:14px;line-height:1.55;margin:0">Pick up your phone, <b 6238 id="odCallingName" style="color:var(--paper)">there</b>. Say hello and the agent takes it from there.</p> 6239 </div> 6240 6241 6242 <div class="od-panel" id="odDone" hidden style="text-align:center;padding:12px 0 6px"> 6243 <div class="od-check"> 6244 <svg width="30" height="30" viewBox="0 0 24 24" fill="none" stroke="currentColor" 6245 stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"> 6246 <path d="M4 12.5l5 5L20 6"/> 6247 </svg> 6248 </div> 6249 <div style="font-family:var(--mono);font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--signal);margin:18px 0 8px"> 6250 Call complete 6251 </div> 6252 <p style="color:var(--bone);font-size:14px;line-height:1.55;margin:0 0 14px">Thanks <b id="odDoneName" 6253 style="color:var(--paper)">there</b>. That agent, and ones like it, can be working your phones within 6254 days.</p> 6255 <div id="odSummary" hidden 6256 style="text-align:left;margin:0 0 18px;padding:14px 16px;border:1px solid var(--line);background:var(--ink-2);border-radius:10px;font-size:13px;line-height:1.6;color:var(--bone)"></div> 6257 <div style="display:flex;flex-direction:column;gap:10px;align-items:center"> 6258 <a href="https://talkify.nz/pricing" class="btn btn-primary btn-lg" 6259 style="width:100%;justify-content:center">
6259See plans + pricing <span class="arr">â</span></a> 6260 <button type="button" id="odAgainBtn" 6261 style="appearance:none;background:none;border:none;cursor:pointer;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--mute);padding:4px">Run 6262 another demo 6263 </button> 6264 </div> 6265 </div> 6266</aside> 6267 6268 6269 6270 <a href="#film" class="hero-film" data-play-film="film"> 6271 <span class="hero-film__thumb" style="background-image:url('https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-224afe26.jpg')" aria-hidden="true"> 6272 <svg viewBox="0 0 24 24"><path fill="currentColor" d="M8 5.14v13.72a1 1 0 0 0 1.52.85l10.92-6.86a1 1 0 0 0 0-1.7L9.52 4.29A1 1 0 0 0 8 5.14z"/></svg> 6273 </span> 6274 <span class="hero-film__text"><b>Watch a day of calls</b><small>1 min, with sound</small></span> 6275 </a> 6276 </div> 6277 </div> 6278 </section> 6279 6280 <div class="strip"> 6281 <div class="strip-track"> 6282 <a href="https://talkify.nz/reception" class="strip-link" > 6283 Reception <span class="pip">â</span> </a> 6284 <a href="https://talkify.nz/personal-assistant" class="strip-link it" > 6285 Personal Assistant </a> 6286 <a href="https://talkify.nz/booking-service" class="strip-link" > 6287 Booking Service <span class="pip">â</span> </a> 6288 <a href="https://talkify.nz/sales-agent" class="strip-link it" > 6289 Sales Qualification </a> 6290 <a href="https://talkify.nz/tradesman" class="strip-link it" > 6291 Tradesman Dispatcher </a> 6292 <a href="https://talkify.nz/real-estate" class="strip-link" > 6293 Real Estate Enquiry <span class="pip">â</span> </a> 6294 <a href="https://talkify.nz/beauty" class="strip-link it" > 6295 Beauty & Wellness </a> 6296 <a href="https://talkify.nz/plumber" class="strip-link" > 6297 Plumbing Dispatch <span class="pip">â</span> </a> 6298 <a href="https://talkify.nz/retail" class="strip-link it" > 6299 Retail </a> 6300 <a href="https://talkify.nz/professional-services" class="strip-link" > 6301 Professional Services <span class="pip">â</span> </a> 6302 <a href="https://talkify.nz/reception" class="strip-link" aria-hidden="true" tabindex="-1" > 6303 Reception <span class="pip">â</span> </a> 6304 <a href="https://talkify.nz/personal-assistant" class="strip-link it" aria-hidden="true" tabindex="-1" > 6305 Personal Assistant </a> 6306 <a href="https://talkify.nz/booking-service" class="strip-link" aria-hidden="true" tabindex="-1" > 6307 Booking Service <span class="pip">â</span> </a> 6308 <a href="https://talkify.nz/sales-agent" class="strip-link it" aria-hidden="true" tabindex="-1" > 6309 Sales Qualification </a> 6310 <a href="https://talkify.nz/tradesman" class="strip-link it" aria-hidden="true" tabindex="-1" > 6311 Tradesman Dispatcher </a> 6312 <a href="https://talkify.nz/real-estate" class="strip-link" aria-hidden="true" tabindex="-1" > 6313 Real Estate Enquiry <span class="pip">â</span> </a> 6314 <a href="https://talkify.nz/beauty" class="strip-link it" aria-hidden="true" tabindex="-1" > 6315 Beauty & Wellness </a> 6316 <a href="https://talkify.nz/plumber" class="strip-link" aria-hidden="true" tabindex="-1" > 6317 Plumbing Dispatch <span class="pip">â</span> </a> 6318 <a href="https://talkify.nz/retail" class="strip-link it" aria-hidden="true" tabindex="-1" > 6319 Retail </a> 6320 <a href="https://talkify.nz/professional-services" class="strip-link" aria-hidden="true" tabindex="-1" > 6321 Professional Services <span class="pip">â</span> </a> 6322 </div> 6323</div> 6324 6325 6326 <section class="shell tight pv" id="film" aria-labelledby="pv-hd-homepage-b" data-pv-autoplay > 6327 <div class="section-hd"> 6328 <h2 class="r" id="pv-hd-homepage-b">
6328A day of calls, <span class="blue">all answered.</span></h2> 6329 <p class="lede r r-1">From the six o'clock class to the two in the morning burst pipe: what Talkify does with every call, in just over a minute.</p> 6330 </div> 6331 <div class="pv-frame r"> 6332 <video controls preload="none" playsinline 6333 data-video-id="PROMO-home-b" data-video-kind="promo" data-video-title="Talkify: a day of calls" 6334 poster="https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-224afe26.jpg" width="1920" height="1080" 6335 aria-label="Talkify: a day of calls, 1 minute 20 second video"> 6336 <source src="https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-d7aa3f1f.mp4" type="video/mp4"> 6337 <track kind="captions" src="https://talkify.nz/videos/promos/homepage-b/captions.vtt" srclang="en" label="English"> 6338 <p>Your browser cannot play this video. <a href="https://dl4puxmxmzsfo.cloudfront.net/videos/promos/PROMO-home-b-d7aa3f1f.mp4">Download it</a>.</p> 6339 </video> 6340 <button type="button" class="pv-sound" hidden> 6341 <svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05A4.5 4.5 0 0 0 16.5 12zM14 3.23v2.06a7 7 0 0 1 0 13.42v2.06a9 9 0 0 0 0-17.54z"/></svg> 6342 Tap for sound 6343 </button> 6344 </div> 6345 </section>
6346<script> 6347 (() => { 6348 if (window.__tkVideoTracking) return; 6349 window.__tkVideoTracking = true; 6350 6351 const endpoint = "\/videos\/plays"; 6352 const uuid = () => (window.crypto && crypto.randomUUID) 6353 ? crypto.randomUUID() 6354 : 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { 6355 const r = Math.random() * 16 | 0; 6356 return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16); 6357 }); 6358 // A random id for this browser, so anonymous plays can be told apart. 6359 const visitor = (() => { 6360 try { 6361 let v = localStorage.getItem('tk-visitor'); 6362 if (!v) { v = uuid(); localStorage.setItem('tk-visitor', v); } 6363 return v; 6364 } catch (_) { return null; } 6365 })(); 6366 6367 const plays = new WeakMap(); 6368 6369 const report = (s) => { 6370 const body = new FormData(); 6371 body.append('play_id', s.play); 6372 body.append('video_id', s.id); 6373 body.append('kind', s.kind); 6374 body.append('percent', String(s.percent)); 6375 body.append('watched', String(Math.round(s.watched))); 6376 if (s.duration) body.append('duration', String(Math.round(s.duration))); 6377 body.append('page', location.pathname); 6378 if (visitor) body.append('visitor', visitor); 6379 if (s.autoplay) body.append('autoplay', '1'); 6380 s.dirty = false; 6381 try { 6382 if (navigator.sendBeacon && navigator.sendBeacon(endpoint, body)) return; 6383 } catch (_) {} 6384 fetch(endpoint, { method: 'POST', body, keepalive: true, credentials: 'same-origin' }).catch(() => {}); 6385 }; 6386 6387 const analytics = (name, s, percent) => { 6388 const params = { 6389 video_title: s.title, 6390 video_url: s.src, 6391 video_provider: 'talkify', 6392 video_percent: percent, 6393 video_id: s.id, 6394 video_kind: s.kind, 6395 video_autoplay: s.autoplay, 6396 }; 6397 if (typeof window.gtag === 'function') window.gtag('event', name, params); 6398 else if (Array.isArray(window.dataLayer)) window.dataLayer.push({ event: name, ...params }); 6399 }; 6400 6401 const current = (v) => { 6402 if (!(v instanceof HTMLMediaElement) || !v.dataset.videoId) return null; 6403 let s = plays.get(v); 6404 const nonce = v.dataset.playNonce || ''; 6405 if (!s || s.nonce !== nonce || s.ended || s.src !== v.currentSrc || (s.autoplay && v.dataset.autoplay !== '1' && v.paused)) { 6406 s = { 6407 play: uuid(), nonce, id: v.dataset.videoId, kind: v.dataset.videoKind || 'help', 6408 title: v.dataset.videoTitle || '', src: v.currentSrc, percent: 0, milestones: new Set(), 6409 watched: 0, last: null, duration: 0, ended: false, started: false, dirty: false, 6410 // Started silently by the page, not by the viewer (promo-video autoplay-on-view). 6411 autoplay: v.dataset.autoplay === '1', 6412 }; 6413 plays.set(v, s); 6414 } 6415 return s; 6416 }; 6417 6418 document.addEventListener('play', (e) => { 6419 const s = current(e.target); 6420 if (!s || s.started) return; 6421 s.started = true; 6422 s.duration = isFinite(e.target.duration) ? e.target.duration : 0; 6423 report(s); 6424 analytics('video_start', s, 0); 6425 }, true); 6426 6427 document.addEventListener('timeupdate', (e) => { 6428 const v = e.target; 6429 const s = v instanceof HTMLMediaElement ? plays.get(v) : null; 6430 if (!s || !s.started || s.ended) return; 6431 const t = v.currentTime; 6432 // Seconds actually watched: small forward steps only, so a seek 6433 // does not count as watching what it skipped. 6434 if (s.last !== null && t > s.last && t - s.last < 2) { s.watched += t - s.last; s.dirty = true; } 6435 s.last = t; 6436 if (isFinite(v.duration) && v.duration > 0) { 6437 s.duration = v.duration; 6438 const pct = Math.floor((t / v.duration) * 100); 6439 for (const m of [25, 50, 75]) { 6440 if (pct >= m && !s.milestones.has(m)) { 6441 s.milestones.add(m); 6442 s.percent = Math.max(s.percent, m); 6443 report(s); 6444 analytics('video_progress', s, m); 6445 } 6446 } 6447 } 6448 }, true); 6449 6450 document.addEventListener('seeking', (e) => { 6451 const s = e.target instanceof HTMLMediaElement ? plays.get(e.target) : null; 6452 if (s) s.last = null; 6453 }, true); 6454 6455 document.addEventListener('ended', (e) => { 6456 const s = e.target instanceof HTMLMediaElement ? plays.get(e.target) : null; 6457 if (!s || s.ended) return; 6458 s.percent = 100; 6459 s.ended = true; 6460 report(s); 6461 analytics('video_complete', s, 100); 6462 }, true); 6463 6464 // Leaving mid-play: send the seconds watched since the last report. 6465 const flush = () => { 6466 document.querySelectorAll('video[data-video-id], audio[data-video-id]').forEach((v) => { 6467 const s = plays.get(v); 6468 if (s && s.started && s.dirty) report(s); 6469 }); 6470 }; 6471 document.addEventListener('pause', (e) => { 6472 const s = e.target instanceof HTMLMediaElement ? plays.get(e.target) : null; 6473 if (s && s.started && s.dirty && !s.ended) report(s); 6474 }, true); 6475 addEventListener('pagehide', flush); 6476 document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') flush(); }); 6477 })(); 6478</script>
6478 6479 6480 6481 <section class="shell" id="agents"> 6482 <div class="section-hd"> 6483 <h2 class="r">Meet everyone <span class="it">who answers.</span></h2> 6484 <p class="lede r r-1">Each Talkify agent ships with its own persona, knowledge base, calendar bindings and 6485 escalation rules. Run one, or run the set: they share a dashboard, and every call lands in the same place.</p> 6486 </div> 6487 6488 <div class="roster r"> 6489 6490 <article class="ag" data-agent-voice > 6491 <div class="ag-shot"> 6492 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest"> 6493 <title>Talkify Reception</title> 6494 <defs> 6495 <linearGradient id="tkGround-reception" x1="0" y1="1" x2="1" y2="0"> 6496 <stop offset="0" stop-color="#1b2a33"></stop> 6497 <stop offset="0.55" stop-color="#2c3f4a"></stop> 6498 <stop offset="1" stop-color="#3e5460"></stop> 6499 </linearGradient> 6500 <linearGradient id="tkHot-reception" x1="0" y1="1" x2="1" y2="0"> 6501 <stop offset="0" stop-color="#22648c"></stop> 6502 <stop offset="0.55" stop-color="#318abe"></stop> 6503 <stop offset="1" stop-color="#63aed3"></stop> 6504 </linearGradient> 6505 </defs> 6506 <rect width="100" height="100" fill="url(#tkGround-reception)"></rect> 6507 <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-reception)" opacity="0"></rect> 6508 <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3"> 6509 <path d="M6 72 A20 20 0 0 1 26 92"></path> 6510 <path d="M6 63 A29 29 0 0 1 35 92"></path> 6511 <path d="M6 54 A38 38 0 0 1 44 92"></path> 6512 </g> 6513 <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle> 6514 <g class="tk-figure"> 6515 <g fill="#ffffff"> 6516 <circle cx="50" cy="42" r="13"></circle> 6517 <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path> 6518 </g> 6519 <circle cx="74" cy="72" r="16" fill="#ffffff"></circle> 6520 <g transform="translate(61 59) scale(0.26)"><path d="M22 30 H78 A10 10 0 0 1 88 40 V64 A10 10 0 0 1 78 74 H50 L34 88 V74 H22 A10 10 0 0 1 12 64 V40 A10 10 0 0 1 22 30 Z" fill="#318abe"></path></g> 6521 </g> 6522</svg> 6523 <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span> 6524 6525 <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Kia</span> <span class="w" data-at="0.54">ora!</span> <span class="w" data-at="1.16">I'm</span> <span class="w" data-at="1.3">one</span> <span class="w" data-at="1.46">of</span> <span class="w" data-at="1.56">the</span> <span class="w" data-at="1.74">voices</span> <span class="w" data-at="1.96">you</span> <span class="w" data-at="2.2">can</span> <span class="w" data-at="2.42">choose</span> <span class="w" data-at="2.64">for</span> <span class="w" data-at="2.86">your</span> <span class="w" data-at="3.12">Talkify</span> <span class="w" data-at="3.44">receptionist.</span> <span class="w" data-at="4.74">I'll</span> <span class="w" data-at="5.02">answer</span> <span class="w" data-at="5.22">every</span> <span class="w" data-at="5.78">call</span> <span class="w" data-at="6.02">in</span> <span class="w" data-at="6.14">your</span> <span class="w" data-at="6.3">business's</span> <span class="w" data-at="7.08">name,</span> <span class="w" data-at="7.4">day</span> <span class="w" data-at="7.64">or</span> <span class="w" data-at="7.92">night,</span> <span class="w" data-at="8.4">and</span> <span class="w" data-at="8.62">get</span> <span class="w" data-at="8.76">the</span> <span class="w" data-at="8.96">job</span> <span class="w" data-at="9.18">booked</span> <span class="w" data-at="9.4">in.</span></span> 6526 </div> 6527 6528 6529 <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/reception">Reception</a></h3> 6530 <p class="ag-role">Answers the business line</p> 6531 <p class="ag-bio">Greets, qualifies, books the job and escalates what cannot wait, exactly how you would train a good receptionist. Then does it at 3am on a public holiday.</p> 6532 <p class="ag-said">We are, eight till two. I can get someone out to you at nine, what is the address?</p> 6533 6534 <div class="ag-foot"> 6535 <button type="button" class="ag-hear" aria-pressed="false" 6536 aria-label="Hear a Reception agent voice: Kia ora! I'm one of the voices you can choose for your Talkify receptionist. I'll answer every call in your business's name, day or night, and get the job booked in."> 6537 <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6538 <span class="ag-hear-label">Hear it</span> 6539 <small>NZ voice</small> 6540 </button> 6541 <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/reception-nz-59e303a0.mp3" 6542 data-video-id="VOICE-reception-nz" data-video-kind="voice" 6543 data-video-title="Reception agent voice"></audio> 6544 <span class="ag-price">From <b>$129</b>/mo</span> 6545 <span class="ag-go">See the reception agent <em class="arr">→</em></span> 6546 </div> 6547 </article> 6548 6549 <article class="ag" data-agent-voice > 6550 <div class="ag-shot"> 6551 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest"> 6552 <title>Talkify Personal Assistant</title> 6553 <defs> 6554 <linearGradient id="tkGround-personal-assistant" x1="0" y1="1" x2="1" y2="0"> 6555 <stop offset="0" stop-color="#1b2a33"></stop> 6556 <stop offset="0.55" stop-color="#2c3f4a"></stop> 6557 <stop offset="1" stop-color="#3e5460"></stop> 6558 </linearGradient> 6559 <linearGradient id="tkHot-personal-assistant" x1="0" y1="1" x2="1" y2="0"> 6560 <stop offset="0" stop-color="#22648c"></stop> 6561 <stop offset="0.55" stop-color="#318abe"></stop> 6562 <stop offset="1" stop-color="#63aed3"></stop> 6563 </linearGradient> 6564 </defs> 6565 <rect width="100" height="100" fill="url(#tkGround-personal-assistant)"></rect> 6566 <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-personal-assistant)" opacity="0"></rect> 6567 <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3"> 6568 <path d="M6 72 A20 20 0 0 1 26 92"></path> 6569 <path d="M6 63 A29 29 0 0 1 35 92"></path> 6570 <path d="M6 54 A38 38 0 0 1 44 92"></path> 6571 </g> 6572 <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle> 6573 <g class="tk-figure"> 6574 <g fill="#ffffff"> 6575 <circle cx="50" cy="42" r="13"></circle> 6576 <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path> 6577 </g> 6578 <circle cx="74" cy="72" r="16" fill="#ffffff"></circle> 6579 <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"><rect x="34" y="20" width="32" height="60" rx="9"></rect><path d="M50 68 H50.5"></path></g></g> 6580 </g> 6581</svg> 6582 <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span> 6583 6584 <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Kia</span> <span class="w" data-at="0.38">ora.</span> <span class="w" data-at="1.26">I'm</span> <span class="w" data-at="1.38">one</span> <span class="w" data-at="1.52">of</span> <span class="w" data-at="1.6">the</span> <span class="w" data-at="1.78">voices</span> <span class="w" data-at="2.04">you</span> <span class="w" data-at="2.28">can</span> <span class="w" data-at="2.48">pick</span> <span class="w" data-at="2.68">for</span> <span class="w" data-at="2.9">your</span> <span class="w" data-at="3.12">Talkify</span> <span class="w" data-at="3.6">personal</span> <span class="w" data-at="4.16">assistant.</span> <span class="w" data-at="5.24">I'll</span> <span class="w" data-at="5.44">screen</span> <span class="w" data-at="5.66">your</span> <span class="w" data-at="5.9">calls,</span> <span class="w" data-at="6.7">take</span> <span class="w" data-at="6.76">proper</span> <span class="w" data-at="7.08">messages,</span> <span class="w" data-at="7.88">and</span> <span class="w" data-at="8.1">text</span> <span class="w" data-at="8.28">you</span> <span class="w" data-at="8.44">the</span> <span class="w" data-at="8.6">ones</span> <span class="w" data-at="8.8">that</span> <span class="w" data-at="9.08">really</span> <span class="w" data-at="9.52">need</span> <span class="w" data-at="9.74">
6584you.</span></span> 6585 </div> 6586 6587 6588 <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/personal-assistant">Personal Assistant</a></h3> 6589 <p class="ag-role">Screens your own mobile</p> 6590 <p class="ag-bio">Stands between you and the ninety calls a week that are not worth your time. Screens by your rules, remembers everyone who has ever rung, and texts you the two that need you.</p> 6591 <p class="ag-said">She is on site till three, Marcus. I will get her to call you straight after.</p> 6592 6593 <div class="ag-foot"> 6594 <button type="button" class="ag-hear" aria-pressed="false" 6595 aria-label="Hear a Personal Assistant agent voice: Kia ora. I'm one of the voices you can pick for your Talkify personal assistant. I'll screen your calls, take proper messages, and text you the ones that really need you."> 6596 <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg> 6597 <span class="ag-hear-label">Hear it</span> 6598 <small>NZ voice</small> 6599 </button> 6600 <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/personal-assistant-nz-6a183642.mp3" 6601 data-video-id="VOICE-personal-assistant-nz" data-video-kind="voice" 6602 data-video-title="Personal Assistant agent voice"></audio> 6603 <span class="ag-price">From <b>$89</b>/mo</span> 6604 <span class="ag-go">See the personal assistant <em class="arr">→</em></span> 6605 </div> 6606 </article> 6607 6608 <article class="ag" data-agent-voice > 6609 <div class="ag-shot"> 6610 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest"> 6611 <title>Talkify Booking Service</title> 6612 <defs> 6613 <linearGradient id="tkGround-booking-service" x1="0" y1="1" x2="1" y2="0"> 6614 <stop offset="0" stop-color="#1b2a33"></stop> 6615 <stop offset="0.55" stop-color="#2c3f4a"></stop> 6616 <stop offset="1" stop-color="#3e5460"></stop> 6617 </linearGradient> 6618 <linearGradient id="tkHot-booking-service" x1="0" y1="1" x2="1" y2="0"> 6619 <stop offset="0" stop-color="#22648c"></stop> 6620 <stop offset="0.55" stop-color="#318abe"></stop> 6621 <stop offset="1" stop-color="#63aed3"></stop> 6622 </linearGradient> 6623 </defs> 6624 <rect width="100" height="100" fill="url(#tkGround-booking-service)"></rect> 6625 <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-booking-service)" opacity="0"></rect> 6626 <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3"> 6627 <path d="M6 72 A20 20 0 0 1 26 92"></path> 6628 <path d="M6 63 A29 29 0 0 1 35 92"></path> 6629 <path d="M6 54 A38 38 0 0 1 44 92"></path> 6630 </g> 6631 <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle> 6632 <g class="tk-figure"> 6633 <g fill="#ffffff"> 6634 <circle cx="50" cy="42" r="13"></circle> 6635 <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path> 6636 </g> 6637 <circle cx="74" cy="72" r="16" fill="#ffffff"></circle> 6638 <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="7" stroke-linecap="round" stroke-linejoin="round"><rect x="22" y="30" width="56" height="48" rx="12"></rect><path d="M22 46 H78"></path><path d="M36 22 V36"></path><path d="M64 22 V36"></path></g></g> 6639 </g> 6640</svg> 6641 <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span> 6642 6643 <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Hi</span> <span class="w" data-at="0.4">there!</span> <span class="w" data-at="1.1">I'm</span> <span class="w" data-at="1.28">one</span> <span class="w" data-at="1.42">of</span> <span class="w" data-at="1.52">the</span> <span class="w" data-at="1.66">voices</span> <span class="w" data-at="1.96">you</span> <span class="w" data-at="2.18">can</span> <span class="w" data-at="2.4">choose</span> <span class="w" data-at="2.64">for</span> <span class="w" data-at="2.84">your</span> <span class="w" data-at="3.06">Talkify</span> <span class="w" data-at="3.4">booking</span> <span class="w" data-at="3.74">agent.</span> <span class="w" data-at="4.78">I'll</span> <span class="w" data-at="4.98">check</span> <span class="w" data-at="5.14">your</span> <span class="w" data-at="5.4">diary,</span> <span class="w" data-at="6.04">then</span> <span class="w" data-at="6.22">book,</span> <span class="w" data-at="7.08">move</span> <span class="w" data-at="7.08">or</span> <span class="w" data-at="7.36">cancel</span> <span class="w" data-at="7.72">appointments</span> <span class="w" data-at="8.24">while</span> <span class="w" data-at="8.54">your</span> <span class="w" data-at="8.68">customer's</span> <span class="w" data-at="9.26">still</span> <span class="w" data-at="9.42">on</span> <span class="w" data-at="9.6">the</span> <span class="w" data-at="9.66">line.</span></span> 6644 </div> 6645 6646 6647 <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/booking-service">Booking Service</a></h3> 6648 <p class="ag-role">Keeps the diary</p> 6649 <p class="ag-bio">Reads your live availability before it speaks, so every time it offers is a time that exists. Books, moves and cancels without ever double-booking you.</p> 6650 <p class="ag-said">No trouble. Same time on the fourteenth? I will text you the new booking.</p> 6651 6652 <div class="ag-foot"> 6653 <button type="button" class="ag-hear" aria-pressed="false" 6654 aria-label="Hear a Booking Service agent voice: Hi there! I'm one of the voices you can choose for your Talkify booking agent. I'll check your diary, then book, move or cancel appointments while your customer's still on the line."> 6655 <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6656 <span class="ag-hear-label">Hear it</span> 6657 <small>NZ voice</small> 6658 </button> 6659 <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/booking-service-nz-de40d0e6.mp3" 6660 data-video-id="VOICE-booking-service-nz" data-video-kind="voice" 6661 data-video-title="Booking Service agent voice"></audio> 6662 <span class="ag-price">From <b>$129</b>/mo</span> 6663 <span class="ag-go">See the booking agent <em class="arr">→</em></span> 6664 </div> 6665 </article> 6666 6667 <article class="ag" data-agent-voice > 6668 <div class="ag-shot"> 6669 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest"> 6670 <title>Talkify Accounts</title> 6671 <defs> 6672 <linearGradient id="tkGround-accounts" x1="0" y1="1" x2="1" y2="0"> 6673 <stop offset="0" stop-color="#1b2a33"></stop> 6674 <stop offset="0.55" stop-color="#2c3f4a"></stop> 6675 <stop offset="1" stop-color="#3e5460"></stop> 6676 </linearGradient> 6677 <linearGradient id="tkHot-accounts" x1="0" y1="1" x2="1" y2="0"> 6678 <stop offset="0" stop-color="#22648c"></stop> 6679 <stop offset="0.55" stop-color="#318abe"></stop> 6680 <stop offset="1" stop-color="#63aed3"></stop> 6681 </linearGradient> 6682 </defs> 6683 <rect width="100" height="100" fill="url(#tkGround-accounts)"></rect> 6684 <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-accounts)" opacity="0"></rect> 6685 <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3"> 6686 <path d="M6 72 A20 20 0 0 1 26 92"></path> 6687 <path d="M6 63 A29 29 0 0 1 35 92"></path> 6688 <path d="M6 54 A38 38 0 0 1 44 92"></path> 6689 </g> 6690 <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle> 6691 <g class="tk-figure"> 6692 <g fill="#ffffff"> 6693 <circle cx="50" cy="42" r="13"></circle> 6694 <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path> 6695 </g> 6696 <circle cx="74" cy="72" r="16" fill="#ffffff"></circle> 6697 <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"><rect x="28" y="20" width="44" height="60" rx="10"></rect><path d="M40 42 H60"></path><path d="M40 58 H60"></path></g></g> 6698 </g> 6699</svg> 6700 <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span> 6701 6702 <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Hi!</span> <span class="w" data-at="0.9">I'm</span> <span class="w" data-at="1.18">one</span> <span class="w" data-at="1.32">of</span> <span class="w" data-at="1.4">the</span> <span class="w" data-at="1.6">voices</span> <span class="w" data-at="1.84">you</span> <span class="w" data-at="2.1">can</span> <span class="w" data-at="2.3">choose</span> <span class="w" data-at="2.58">for</span> <span class="w" data-at="2.78">your</span> <span class="w" data-at="2.98">Talkify</span> <span class="w" data-at="3.38">accounts</span> <span class="w" data-at="3.8">agent.</span> <span class="w" data-at="4.88">When</span> <span class="w" data-at="4.92">a</span> <span class="w" data-at="5.16">customer</span> <span class="w" data-at="5.38">rings</span> <span class="w" data-at="5.7">about</span> <span class="w" data-at="5.98">their</span> <span class="w" data-at="6.2">account,</span> <span class="w" data-at="6.96">I</span> <span class="w" data-at="7.08">can</span> <span class="w" data-at="7.28">tell</span> <span class="w" data-at="7.44">them</span> <span class="w" data-at="7.6">what's</span> <span class="w" data-at="7.88">outstanding,</span> <span class="w" data-at="8.88">straight</span> <span class="w" data-at="9.04">from</span> <span class="w" data-at="9.24">your</span> <span class="w" data-at="9.46">Xero.</span></span> 6703 </div> 6704 6705 6706 <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/debt-collection">Accounts</a><em>New</em></h3> 6707 <p class="ag-role">Answers on the account</p> 6708 <p class="ag-bio">Connected to your Xero, it knows the caller from your contacts and can say what is outstanding and how much has gone overdue. It will not discuss an account with a number it does not recognise.</p> 6709 <p class="ag-said">You are sitting at $1,240, and $380 of that went overdue on Tuesday.</p> 6710 6711 <div class="ag-foot"> 6712 <button type="button" class="ag-hear" aria-pressed="false" 6713 aria-label="Hear a Accounts agent voice: Hi! I'm one of the voices you can choose for your Talkify accounts agent. When a customer rings about their account, I can tell them what's outstanding, straight from your Xero."> 6714 <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6715 <span class="ag-hear-label">Hear it</span> 6716 <small>NZ voice</small> 6717 </button> 6718 <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/accounts-nz-7547196b.mp3" 6719 data-video-id="VOICE-accounts-nz" data-video-kind="voice" 6720 data-video-title="Accounts agent voice"></audio> 6721 <span class="ag-price">Add-on <b>$10</b>/mo</span> 6722 <span class="ag-go">See overdue invoice calls <em class="arr">→</em></span> 6723 </div> 6724 </article> 6725 6726 <article class="ag" data-agent-voice > 6727 <div class="ag-shot"> 6728 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false" xmlns:c2pa="http://c2pa.org/manifest"> 6729 <title>Talkify Sales Agent</title> 6730 <defs> 6731 <linearGradient id="tkGround-sales-agent" x1="0" y1="1" x2="1" y2="0"> 6732 <stop offset="0" stop-color="#1b2a33"></stop> 6733 <stop offset="0.55" stop-color="#2c3f4a"></stop> 6734 <stop offset="1" stop-color="#3e5460"></stop> 6735 </linearGradient> 6736 <linearGradient id="tkHot-sales-agent" x1="0" y1="1" x2="1" y2="0"> 6737 <stop offset="0" stop-color="#22648c"></stop> 6738 <stop offset="0.55" stop-color="#318abe"></stop> 6739 <stop offset="1" stop-color="#63aed3"></stop> 6740 </linearGradient> 6741 </defs> 6742 <rect width="100" height="100" fill="url(#tkGround-sales-agent)"></rect> 6743 <rect class="tk-ground-hot" width="100" height="100" fill="url(#tkHot-sales-agent)" opacity="0"></rect> 6744 <g stroke="#ffffff" fill="none" stroke-width="2.6" opacity="0.3"> 6745 <path d="M6 72 A20 20 0 0 1 26 92"></path> 6746 <path d="M6 63 A29 29 0 0 1 35 92"></path> 6747 <path d="M6 54 A38 38 0 0 1 44 92"></path> 6748 </g> 6749 <circle cx="50" cy="44" r="30" fill="#ffffff" opacity="0.13"></circle> 6750 <g class="tk-figure"> 6751 <g fill="#ffffff"> 6752 <circle cx="50" cy="42" r="13"></circle> 6753 <path d="M22 100 C22 74 34 64 50 64 C66 64 78 74 78 100 Z"></path> 6754 </g> 6755 <circle cx="74" cy="72" r="16" fill="#ffffff"></circle> 6756 <g transform="translate(61 59) scale(0.26)"><g fill="none" stroke="#318abe" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"><path d="M24 64 L44 44 L56 54 L76 30"></path><path d="M60 30 H76 V46"></path></g></g> 6757 </g> 6758</svg> 6759 <span class="ag-wave" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span> 6760 6761 <span class="ag-cap" aria-hidden="true"><span class="w" data-at="0.1">Kia</span> <span class="w" data-at="0.44">ora!</span> <span class="w" data-at="1.12">I'm</span> <span class="w" data-at="1.22">one</span> <span class="w" data-at="1.34">of</span> <span class="w" data-at="1.42">the</span> <span class="w" data-at="1.6">voices</span> <span class="w" data-at="1.8">you</span> <span class="w" data-at="2.02">can</span> <span class="w" data-at="2.2">pick</span> <span class="w" data-at="2.36">for</span> <span class="w" data-at="2.54">your</span> <span class="w" data-at="2.76">Talkify</span> <span class="w" data-at="3.1">sales</span> <span class="w" data-at="3.54">agent.</span> <span class="w" data-at="4.42">I'll</span> <span class="w" data-at="4.64">answer</span> <span class="w" data-at="4.8">every</span> <span class="w" data-at="5.51">enquiry,</span> <span class="w" data-at="6.22">ask</span> <span class="w" data-at="6.22">the</span> <span class="w" data-at="6.4">right</span> <span class="w" data-at="6.7">questions,</span> <span class="w" data-at="7.36">and</span> <span class="w" data-at="7.6">tell</span> <span class="w" data-at="7.68">you</span> <span class="w" data-at="7.88">which</span> <span class="w" data-at="8.12">leads</span> <span class="w" data-at="8.4">are</span> <span class="w" data-at="8.68">hot.</span></span> 6762 </div> 6763 6764 6765 <h3 class="ag-name"><a class="ag-link" href="https://talkify.nz/sales-agent">Sales Agent</a></h3> 6766 <p class="ag-role">Works the enquiry</p> 6767 <p class="ag-bio">Every enquiry gets the same pitch, the same questions and the same follow-through, whether it lands at 9am or 9pm. Scores the lead while the conversation is still happening.</p> 6768 <p class="ag-said">Yes, it suits a busy salon well. How many calls a week are you missing at the moment?</p> 6769 6770 <div class="ag-foot"> 6771 <button type="button" class="ag-hear" aria-pressed="false" 6772 aria-label="Hear a Sales Agent agent voice: Kia ora! I'm one of the voices you can pick for your Talkify sales agent. I'll answer every enquiry, ask the right questions, and tell you which leads are hot."> 6773 <svg viewBox="0 0 24 24" aria-hidden="true"><path class="ag-hear-play" fill="currentColor" d="M8 5.5v13l10.5-6.5z"/><path class="ag-hear-stop" fill="currentColor" d="M7 7h10v10H7z"/></svg>
6774 <span class="ag-hear-label">Hear it</span> 6775 <small>NZ voice</small> 6776 </button> 6777 <audio preload="none" src="https://dl4puxmxmzsfo.cloudfront.net/videos/agents/sales-agent-nz-a755d497.mp3" 6778 data-video-id="VOICE-sales-agent-nz" data-video-kind="voice" 6779 data-video-title="Sales Agent agent voice"></audio> 6780 <span class="ag-price">From <b>$129</b>/mo</span> 6781 <span class="ag-go">See the sales agent <em class="arr">→</em></span> 6782 </div> 6783 </article> 6784 </div> 6785</section> 6786 6787 6788
6789<script> 6790 // "Hear it": one voice at a time. While it plays, the profile is marked 6791 // speaking (the portrait wakes, the waveform runs) and what it is saying 6792 // lights up word by word over the portrait, on the clip's own timings. 6793 document.addEventListener('DOMContentLoaded', () => { 6794 const cards = [...document.querySelectorAll('.ag[data-agent-voice]')]; 6795 cards.forEach((card) => { 6796 const btn = card.querySelector('.ag-hear'); 6797 const audio = card.querySelector('audio'); 6798 const label = btn.querySelector('.ag-hear-label'); 6799 const words = [...card.querySelectorAll('.ag-cap .w')]; 6800 let raf = 0; 6801 6802 const update = () => { 6803 const t = audio.currentTime; 6804 words.forEach((w) => w.classList.toggle('on', t >= Number(w.dataset.at))); 6805 }; 6806 // Every frame for a smooth light-up; timeupdate as well, because a tab 6807 // the browser treats as hidden stops animation frames. 6808 const tick = () => { update(); raf = requestAnimationFrame(tick); }; 6809 audio.addEventListener('timeupdate', update); 6810 const stop = () => { 6811 cancelAnimationFrame(raf); 6812 card.classList.remove('speaking'); 6813 words.forEach((w) => w.classList.remove('on')); 6814 btn.setAttribute('aria-pressed', 'false'); 6815 label.textContent = 'Hear it'; 6816 }; 6817 6818 btn.addEventListener('click', (e) => { 6819 e.preventDefault(); 6820 if (!audio.paused) { audio.pause(); audio.currentTime = 0; return; } 6821 cards.forEach((other) => { 6822 const a = other.querySelector('audio'); 6823 if (a !== audio && !a.paused) { a.pause(); a.currentTime = 0; } 6824 }); 6825 audio.currentTime = 0; 6826 audio.play().catch(stop); 6827 }); 6828 audio.addEventListener('play', () => { 6829 card.classList.add('speaking'); 6830 btn.setAttribute('aria-pressed', 'true'); 6831 label.textContent = 'Stop'; 6832 cancelAnimationFrame(raf); 6833 tick(); 6834 }); 6835 audio.addEventListener('pause', stop); 6836 audio.addEventListener('ended', stop); 6837 }); 6838 }); 6839</script>
6839 6840 6841 6842 6843 <section class="shell tight" id="how" style="padding-top:0"> 6844 <div class="spot r"> 6845 <div class="spot-glow" aria-hidden="true"></div> 6846 <div class="rcta"> 6847 <div class="rcta-copy"> 6848 6849 <h2 class="r">Reception that books<br><span class="it">straight into your system.</span></h2> 6850 6851 <p class="lede r r-1">The agent answers your business line, works out what the caller needs, checks 6852 what is actually free, and writes the job into the software your team already opens every 6853 morning. Not a message to action later: the booking, made.</p> 6854 6855 <p class="lede r r-1">Forward your existing number and it is live. No port-out, no hardware, and 6856 reversible the moment you want it back.</p> 6857 6858 <ul class="rcta-points r r-2"> 6859 <li><strong>Books into your diary.</strong> Google Calendar, Outlook, Calendly and the trade 6860 systems below, checked live before anything is promised.</li> 6861 <li><strong>Writes the job up.</strong> Site address, the fault, the caller, attached to the 6862 job rather than typed in again on Monday.</li> 6863 <li><strong>Escalates what cannot wait.</strong> Burst pipes and gas leaks reach a person by 6864 text inside a minute.</li> 6865 </ul> 6866 6867 <div class="rcta-cta r r-3"> 6868 <a href="https://talkify.nz/reception" class="btn btn-primary btn-lg">See the reception agent 6869 <span class="arr">→</span></a> 6870 <a href="tel:+6432421262" data-talkify-agent="default" 6871 class="btn btn-ghost btn-lg">Hear it live · 03 242 1262</a> 6872 </div> 6873 </div> 6874 6875 <div class="rcta-phone r r-1"> 6876 <div class="hphone agent-phone agent-phone--left" data-agent-phone="reception" 6877 aria-label="A phone showing the jobs the reception agent booked into the systems this business runs"> 6878 <div class="hphone-frame"> 6879 <div class="hphone-screen"> 6880 <div class="hphone-notch" aria-hidden="true"></div> 6881 6882 <div class="hphone-clock" data-agent-clock> 6883 <div class="t" data-agent-time></div> 6884 <div class="d" data-agent-date></div> 6885 </div> 6886 6887 <div class="hphone-stack"> 6888 <article class="hpn"> 6889 <header> 6890 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 6891 <span class="hpn-app">Talkify</span> 6892 <span class="hpn-ago" data-agent-ago="9"></span> 6893 </header> 6894 <h4>Booked into Fergus</h4> 6895 <p>Hot water cylinder · Thu 8:00am</p> 6896 </article> 6897 <article class="hpn"> 6898 <header> 6899 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 6900 <span class="hpn-app">Talkify</span> 6901 <span class="hpn-ago" data-agent-ago="38"></span> 6902 </header> 6903 <h4>Quote logged in Simpro</h4> 6904 <p>Bathroom reline · 14 Ngatai Rd</p> 6905 </article> 6906 <article class="hpn"> 6907 <header> 6908 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 6909 <span class="hpn-app">Talkify</span> 6910 <span class="hpn-ago" data-agent-ago="74"></span> 6911 </header> 6912 <h4>Job sent to ServiceM8</h4> 6913 <p>RCD tripping · today, 2:00pm</p> 6914 </article> 6915 <article class="hpn"> 6916 <header> 6917 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 6918 <span class="hpn-app">Talkify</span> 6919 <span class="hpn-ago" data-agent-ago="133"></span> 6920 </header> 6921 <h4>Added to your calendar</h4> 6922 <p>Site visit · Fri 11:30am</p> 6923 </article> 6924 </div> 6925 6926 <div class="hphone-bar" aria-hidden="true"></div> 6927 </div> 6928 </div> 6929</div> 6930 6931 <p class="rcta-cap">Booked, written up, <span class="it">already in the system.</span> 6932 <em>Reception · from $129/mo</em></p> 6933 </div> 6934 </div> 6935 </div> 6936 </section> 6937 6938 6939 <style> 6940 /* The services marquee is off on a phone. It is a decorative band that 6941 scrolls sideways under a thumb that is trying to scroll down, it 6942 costs a row of the fold on the smallest screens, and every n
6942ame in 6943 it is a tap away in the Agents and Industries menus anyway. This 6944 rule lives on the homepage rather than in the layout because the 6945 strip is on 36 pages and only this one is being changed. 6946 6947 640px is the breakpoint the hero already uses. */ 6948 @media (max-width: 640px) { 6949 .strip { 6950 display: none 6951 } 6952 } 6953 6954 /* The showcase panel. Reception and the PA are both this shape: one 6955 rounded surface with a soft brand glow behind the device. They are 6956 the deliberate exception to the site's "ruled, not boxed" rule, 6957 because they are the page's two arguments rather than furniture, and 6958 they are the only two blocks allowed to wear it. */ 6959 .spot { 6960 position: relative; 6961 border: 1px solid var(--line); 6962 border-radius: 24px; 6963 overflow: hidden; 6964 background: var(--panel-grad); 6965 padding: 80px 6966 } 6967 6968 .spot-glow { 6969 position: absolute; 6970 top: -30%; 6971 right: -15%; 6972 width: 60%; 6973 height: 160%; 6974 background: radial-gradient(closest-side, rgba(49, 138, 190, .18), transparent 70%); 6975 pointer-events: none; 6976 z-index: 0 6977 } 6978 6979 /* The same track as .rcta below it, so the phone lands in the same 6980 place in both panels. It used to be 1.2fr 1fr, which gave the PA a 6981 590px right column for a 300px phone: the device floated in the 6982 middle of its column while reception's sat hard right, and the pair 6983 did not line up. */ 6984 .spot-cols { 6985 display: grid; 6986 grid-template-columns: 1fr minmax(0, 330px); 6987 gap: clamp(36px, 6vw, 90px); 6988 align-items: center 6989 } 6990 6991 /* After hours is the third .spot panel, and the only one that is not 6992 blue. An emergency at a quarter to midnight is the one thing on this 6993 page with a colour of its own, so the glow, the eyebrow pin and the 6994 first notification on the phone are all --coral. Nothing else on the 6995 site uses red at panel scale, which is what makes it read as urgent 6996 rather than as decoration. */ 6997 .spot--urgent { 6998 border-color: color-mix(in srgb, var(--coral) 20%, var(--line)) 6999 } 7000 7001 .spot-glow--urgent { 7002 background: radial-gradient(closest-side, 7003 color-mix(in srgb, var(--coral) 15%, transparent), transparent 70%) 7004 } 7005 7006 .ah-copy, 7007 .ah-phone { 7008 position: relative; 7009 z-index: 1 7010 } 7011 7012 /* the live dot on the eyebrow goes red with the rest of it */ 7013 #after-hours .eyebrow .pin { 7014 background: var(--coral); 7015 box-shadow: 0 0 8px var(--coral) 7016 } 7017 7018 /* The emergency is the first notification to land, and the only one 7019 marked. The three under it are the ladder doing its job, which is 7020 reassurance rather than alarm, so they stay as they are. */ 7021 #after-hours .hpn:first-child { 7022 box-shadow: inset 3px 0 0 var(--coral) 7023 } 7024 7025 #after-hours .hpn:first-child h4 { 7026 color: var(--coral) 7027 } 7028 7029 .ah-copy h2 { 7030 margin-top: 22px; 7031 font-size: var(--t-h2); 7032 font-weight: 600; 7033 letter-spacing: var(--ls-head); 7034 line-height: 1.05 7035 } 7036 7037 /* The guide's accent is weight AND colour, Outfit 600 in --signal. 7038 Without the colour the span is 600 against a 700 heading, so the 7039 accent reads lighter than the words it is meant to lift. */ 7040 .ah-copy h2 .it { 7041 color: var(--signal) 7042 } 7043 7044 .ah-copy .lede { 7045 margin-top: 20px; 7046 max-width: 54ch 7047 } 7048 7049 .ah-points { 7050 margin-top: 32px; 7051 list-style: none; 7052 display: flex; 7053 flex-direction: column; 7054 max-width: 54ch 7055 } 7056 7057 .ah-points li { 7058 padding: 15px 0; 7059 border-top: 1px solid var(--line); 7060 font-size: var(--t-small); 7061 color: var(--bone); 7062 line-height: 1.55 7063 } 7064 7065 .ah-points li:last-child { 7066 border-bottom: 1px solid var(--line) 7067 } 7068 7069 .ah-points strong { 7070 color: var(--paper); 7071 font-weight: 600 7072 } 7073 7074 .ah-cta { 7075 margin-top: 32px; 7076 display: flex; 7077 flex-wrap: wrap; 7078 gap: 14px 7079 } 7080 7081 /* Only the label is mono caps. A whole sentence set in uppercase mono 7082 is a shout and three lines of it is hard to read; the guide uses 7083 that face for eyebrows and labels, not running copy. */ 7084 .ah-price { 7085 margin-top: 22px; 7086 max-width: 54ch; 7087 font-size: var(--t-small); 7088 color: var(--mute); 7089 line-height: 1.6 7090 } 7091 7092 .ah-price .lbl { 7093 font-family: var(--mono); 7094 font-size: var(--t-label); 7095 letter-spacing: var(--ls-label); 7096 text-transform: uppercase; 7097 color: var(--mute); 7098 margin-right: 4px 7099 } 7100 7101 .ah-price b { 7102 font-family: var(--serif); 7103 font-size: 16px; 7104 font-weight: 600; 7105 letter-spacing: -.01em; 7106 color: var(--paper); 7107 text-transform: none 7108 } 7109 7110 @media (max-width: 1100px) { 7111 .ah-phone { 7112 display: flex; 7113 flex-direction: column; 7114 align-items: center 7115 } 7116 } 7117 7118 .rcta { 7119 position: relative; 7120 z-index: 1; 7121 display: grid; 7122 grid-template-columns: 1fr minmax(0, 330px); 7123 gap: clamp(36px, 6vw, 90px); 7124 align-items: center 7125 } 7126 7127 .rcta-copy h2 { 7128 margin-top: 22px; 7129 font-size: var(--t-h2); 7130 letter-spacing: var(--ls-head); 7131 line-height: 1.05 7132 } 7133 7134 .rcta-copy .lede { 7135 margin-top: 20px; 7136 max-width: 54ch 7137 } 7138 7139 .rcta-points { 7140 margin-top: 32px; 7141 list-style: none; 7142 display: flex; 7143 flex-direction: column; 7144 max-width: 54ch 7145 } 7146 7147 .rcta-points li { 7148 padding: 15px 0; 7149 border-top: 1px solid var(--line); 7150 font-size: var(--t-small); 7151 color: var(--bone); 7152 line-height: 1.55 7153 } 7154 7155 .rcta-points li:last-child { 7156 border-bottom: 1px solid var(--line) 7157 } 7158 7159 .rcta-points strong { 7160 color: var(--paper); 7161 font-weight: 600 7162 } 7163 7164 .rcta-cta { 7165 margin-top: 32px; 7166 display: flex; 7167 flex-wrap: wrap; 7168 gap: 14px 7169 } 7170 7171 .rcta-cap { 7172 margin: 26px auto 0; 7173 max-width: 320px; 7174 text-align: center; 7175 font-family: var(--serif); 7176 font-size: 20px; 7177 font-weight: 600; 7178 letter-spacing: -.01em; 7179 line-height: 1.25; 7180 color: var(--paper) 7181 } 7182 7183 .rcta-cap em { 7184 display: block; 7185 margin-top: 8px; 7186 font-family: var(--mono); 7187 font-style: normal; 7188 font-size: var(--t-label); 7189 letter-spacing: .13em; 7190 text-transform: uppercase; 7191 color: var(--mute) 7192 } 7193 7194 @media (max-width: 1100px) { 7195 .spot { 7196 padding: 48px 28px 7197 } 7198 7199 .spot-cols { 7200 grid-template-columns: 1fr; 7201 gap: 40px 7202 } 7203 } 7204 7205 @media (max-width: 1000px) { 7206 .rcta { 7207 grid-template-columns: 1fr; 7208 gap: 44px 7209 } 7210 7211 .rcta-phone { 7212 display: flex; 7213 flex-direction: column; 7214 align-items: center 7215 } 7216 } 7217 </style> 7218 7219 7220 7221 <section class="shell" id="why-talkify" aria-labelledby="apart-heading" style="padding-top:0"> 7222 <div class="apart"> 7223 <div class="apart-intro r">
7224 <span class="eyebrow"><span class="pin"></span>The Talkify difference</span> 7225 <h2 id="apart-heading">Built <span class="it">here.</span><br>Not badged here.</h2> 7226 <p class="apart-lede"> 7227 Most AI answering services sold in New Zealand are overseas platforms with a local logo. 7228 Talkify runs on our own local SIP network, keeps data in New Zealand and Australian data 7229 centres, and answers in voices your callers actually recognise. That changes how every 7230 call sounds, and where every recording lives. 7231 </p> 7232 <div class="apart-proof" aria-hidden="true"> 7233 <div><b>from 0.4s</b><span>pickup on the local network</span></div> 7234 <div><b>NZ + AU</b><span>regional numbers & accents</span></div> 7235 <div><b>NZ + AU</b><span>data centres only</span></div> 7236 <div><b>te reo</b><span>greetings, plus 31 languages</span></div> 7237 </div> 7238 7239 7240 7241 <div class="apart-try"> 7242 <span class="apart-try-k">Judge it yourself</span> 7243 <a class="apart-try-no" href="tel:+6432421262" data-talkify-agent="default">03 242 1262</a> 7244 <p>Our own agent answers this line, around the clock. No form, no sales call, no card. Listen for the 7245 accent, interrupt it, ask it something awkward.</p> 7246 </div> 7247 7248 <a href="https://talkify.nz/contact" class="btn btn-primary" style="align-self:flex-start">Hear the difference <span class="arr">â</span></a> 7249 <p class="apart-fine">Flat NZD <a href="https://talkify.nz/pricing">pricing, published on the site</a>. No setup fee. No lock-in. 7250 Built in Åtautahi Christchurch and operated by Talkify Limited.</p> 7251 </div> 7252 7253 <ol class="apart-ledger r r-1"> 7254 <li> 7255 <a class="row" href="https://talkify.nz/ai-answering-service"> 7256 <span class="idx">01</span> 7257 <div class="body"> 7258 <h3>Calls never leave the neighbourhood.</h3> 7259 <p>We run our own local SIP carrier network, so your calls connect close to home. Less lag, no talking over each other, and the clear, close sound of a local call.</p> 7260 </div> 7261 <span class="spec">Local SIP · pickup from 0.4s</span> 7262 </a> 7263 </li> 7264 <li> 7265 <a class="row" href="https://talkify.nz/demo"> 7266 <span class="idx">02</span> 7267 <div class="body"> 7268 <h3>Voices from here, for callers from here.</h3> 7269 <p>A full range of Kiwi and Aussie voices, not an American accent doing its best. Callers relax when the voice sounds like them, and relaxed callers book.</p> 7270 </div> 7271 <span class="spec">EN-NZ · EN-AU · 32 voices</span> 7272 </a> 7273 </li> 7274 <li> 7275 <div class="row"> 7276 <span class="idx">03</span> 7277 <div class="body"> 7278 <h3>A local number in every region.</h3> 7279 <p>Regional phone numbers across New Zealand and Australia, so a Christchurch caller rings 03 and an Auckland caller rings 09. Local numbers get answered; unknown ones get screened.</p> 7280 </div> 7281 <span class="spec">NZ & AU regional DDIs</span> 7282 </div> 7283 </li> 7284 <li> 7285 <a class="row" href="https://talkify.nz/privacy"> 7286 <span class="idx">04</span> 7287 <div class="body"> 7288 <h3>Your data stays on this side of the world.</h3> 7289 <p>For data sovereignty, everything is stored in New Zealand and Australian data centres: recordings, transcripts and customer details held close to home under local privacy law.</p> 7290 </div>
7291 <span class="spec">NZ + AU data centres · AES-256</span> 7292 </a> 7293 </li> 7294 <li> 7295 <a class="row" href="https://talkify.nz/outbound-calls"> 7296 <span class="idx">05</span> 7297 <div class="body"> 7298 <h3>Agents that make the call, too.</h3> 7299 <p>Full outbound service, not just answering. Your agents confirm bookings, chase missing details and run marketing call campaigns, with every conversation transcribed.</p> 7300 </div> 7301 <span class="spec">Confirmations · Campaigns</span> 7302 </a> 7303 </li> 7304 <li> 7305 <a class="row" href="https://talkify.nz/ai-phone-surveys"> 7306 <span class="idx">06</span> 7307 <div class="body"> 7308 <h3>Campaigns that actually get answered.</h3> 7309 <p>Load a contact list and the agent rings through it, asks your questions, and hands back transcripts with the answers extracted and analysed. Offers, follow-ups or a straight survey, at a scale no clipboard reaches.</p> 7310 </div> 7311 <span class="spec">AI phone campaigns</span> 7312 </a> 7313 </li> 7314 <li> 7315 <a class="row" href="https://talkify.nz/ai-call-centre"> 7316 <span class="idx">07</span> 7317 <div class="body"> 7318 <h3>Call centre scale without the call centre.</h3> 7319 <p>One agent or a whole fleet answering unlimited simultaneous calls. Overflow, after-hours or the entire front line, with warm transfer to a human whenever it matters.</p> 7320 </div> 7321 <span class="spec">â concurrent lines</span> 7322 </a> 7323 </li> 7324 <li> 7325 <a class="row" href="https://talkify.nz/integrations"> 7326 <span class="idx">08</span> 7327 <div class="body"> 7328 <h3>Plugged into the tools you already run.</h3> 7329 <p>Calendars, CRMs like HubSpot and GoHighLevel, gym platforms, WhatsApp and SMS, plus Zapier and a full REST API when you want to wire up something custom.</p> 7330 </div> 7331 <span class="spec">CRM · Calendar · Zapier · API</span> 7332 </a> 7333 </li> 7334 <li> 7335 <a class="row" href="https://talkify.nz/contact"> 7336 <span class="idx">09</span> 7337 <div class="body"> 7338 <h3>We set it up. Personally.</h3> 7339 <p>No DIY prompt wrangling. We build your agent around your business, brief it on your services and pricing, tune it with you, and keep tuning after you're live.</p> 7340 </div> 7341 <span class="spec">Done-for-you setup</span> 7342 </a> 7343 </li> 7344 <li> 7345 <a class="row" href="#app"> 7346 <span class="idx">10</span> 7347 <div class="body"> 7348 <h3>Every call in your pocket.</h3> 7349 <p>Native apps for iPhone and Android push you each call summary the moment it ends: who rang, what they wanted, what the agent did about it.</p> 7350 </div> 7351 <span class="spec">iOS · Android</span> 7352 </a> 7353 </li> 7354 <li> 7355 <div class="row"> 7356 <span class="idx">11</span> 7357 <div class="body"> 7358 <h3>Reporting that reads the room.</h3> 7359 <p>Full transcripts, sentiment, outcomes and intent on every call, rolled into dashboards that show what your callers actually want, not just how many rang.</p> 7360 </div> 7361 <span class="spec">Transcripts · Sentiment · Intent</span> 7362 </div> 7363 </li> 7364 </ol> 7365 </div> 7366 7367 <style> 7368 .apart { 7369 display: grid; 7370 grid-template-columns: minmax(320px, 5fr) 7fr; 7371 gap: 72px; 7372 align-items: start; 7373 } 7374 7375 .apart-intro { 7376 position: sticky; 7377 top: 96px; 7378 display: flex; 7379 flex-direction: column; 7380 gap: 26px; 7381 } 7382 7383 .apart-intro h2 { 7384 font-family: var(--serif); 7385 font-weight: 300; 7386 font-size: clamp(40px, 5vw, 68px); 7387 line-height: .96; 7388 letter-spacing: -.025em; 7389 font-variation-settings: "opsz" 96, "SOFT" 30; 7390 } 7391 7392 .apart-intro h2 .it { 7393 font-weight:600; 7394 color: var(--signal); 7395 } 7396 7397 .apart-lede { 7398 color: var(--mute); 7399 font-size: 16px; 7400 line-height: 1.65; 7401 max-width: 46ch; 7402 } 7403 7404 .apart-proof { 7405 display: flex; 7406 gap: 28px; 7407 flex-wrap: wrap; 7408 padding: 18px 0; 7409 border-top: 1px solid var(--line); 7410 border-bottom: 1px solid var(--line); 7411 } 7412 7413 .apart-proof > div { 7414 display: flex; 7415 flex-direction: column; 7416 gap: 4px; 7417 } 7418 7419 .apart-proof b { 7420 font-family: var(--mono); 7421 font-weight: 500; 7422 font-size: 18px; 7423 color: var(--paper); 7424 } 7425 7426 .apart-proof span { 7427 font-family: var(--mono); 7428 font-size: 10px; 7429 text-transform: uppercase; 7430 letter-spacing: .14em; 7431 color: var(--mute); 7432 max-width: 20ch; 7433 } 7434 7435 /* V2 design language: a top-ruled block rather than a filled, rounded 7436 card. It is a number to ring, so it gets the same shape as the 7437 closing call to action and the price blocks. */ 7438 .apart-try { 7439 display: flex; 7440 flex-direction: column; 7441 gap: 8px; 7442 padding: 24px 0 0; 7443 border-top: 1px solid var(--line-2); 7444 } 7445 7446 .apart-try-k { 7447 font-family: var(--mono); 7448 font-size: 10px; 7449 letter-spacing: .16em; 7450 text-transform: uppercase; 7451 color: var(--mute); 7452 } 7453 7454 .apart-try-no { 7455 font-family: var(--serif); 7456 font-weight: 300; 7457 font-size: 30px; 7458 letter-spacing: -.02em; 7459 color: var(--paper); 7460 transition: color .3s var(--ease); 7461 } 7462 7463 .apart-try-no:hover { 7464 color: var(--signal); 7465 } 7466 7467 .apart-try p { 7468 font-size: 13.5px; 7469 line-height: 1.55; 7470 color: var(--mute); 7471 margin: 0; 7472 } 7473 7474 .apart-fine { 7475 font-family: var(--mono); 7476 font-size: 10.5px; 7477 text-transform: uppercase; 7478 letter-spacing: .14em; 7479 color: var(--mute); 7480 } 7481 7482 .apart-fine a { 7483 color: var(--bone); 7484 text-decoration: underline; 7485 text-underline-offset: 3px; 7486 } 7487 7488 .apart-fine a:hover { 7489 color: var(--signal); 7490 } 7491 7492 .apart-ledger { 7493 list-style: none; 7494 margin: 0; 7495 padding: 0; 7496 border-top: 1px solid var(--line); 7497 counter-reset: apart; 7498 } 7499 7500 .apart-ledger li { 7501 padding: 7px 0; 7502 } 7503 7504 .apart-ledger .row { 7505 position: relative; 7506 display: grid; 7507 grid-template-columns: 56px 1fr auto; 7508 gap: 24px; 7509 align-items: baseline; 7510 padding: 26px 18px 26px 8px; 7511 color: inherit; 7512 text-decoration: none; 7513 transition: background .25s ease; 7514 } 7515 7516 .apart-ledger .row::after { 7517 content: ""; 7518 position: absolute; 7519 left: 0; 7520 top: 0; 7521 bottom: 0; 7522 width: 2px; 7523 background: linear-gradient(180deg, var(--signal), var(--plasma)); 7524 opacity: 0; 7525 transition: opacity .25s ease; 7526 } 7527 7528 .apart-ledger .row:hover { 7529 background: color-mix(in srgb, var(--signal) 4%, transparent); 7530 } 7531 7532 html[data-theme="light"] .apart-ledger .row:hover { 7533 background: rgba(111, 158, 63, .06); 7534 } 7535 7536 .apart-ledger .row:hover::after { 7537 opacity: 1; 7538 } 7539
7540 .apart-ledger .idx { 7541 font-family: var(--mono); 7542 font-size: 12px; 7543 color: var(--mute); 7544 transition: color .25s ease; 7545 } 7546 7547 .apart-ledger .row:hover .idx { 7548 color: var(--signal); 7549 } 7550 7551 .apart-ledger h3 { 7552 font-family: var(--serif); 7553 font-weight: 400; 7554 font-size: 22px; 7555 letter-spacing: -.01em; 7556 color: var(--paper); 7557 margin: 0 0 8px; 7558 } 7559 7560 .apart-ledger a.row:hover h3 { 7561 color: var(--signal); 7562 } 7563 7564 .apart-ledger a.row h3::after { 7565 content: "â"; 7566 display: inline-block; 7567 margin-left: 10px; 7568 font-family: var(--mono); 7569 font-size: 15px; 7570 color: var(--signal); 7571 opacity: 0; 7572 transform: translateX(-6px); 7573 transition: opacity .25s ease, transform .25s ease; 7574 } 7575 7576 .apart-ledger a.row:hover h3::after { 7577 opacity: 1; 7578 transform: translateX(0); 7579 } 7580 7581 .apart-ledger p { 7582 color: var(--mute); 7583 font-size: 14.5px; 7584 line-height: 1.6; 7585 max-width: 58ch; 7586 margin: 0; 7587 } 7588 7589 .apart-ledger .spec { 7590 font-family: var(--mono); 7591 font-size: 10px; 7592 text-transform: uppercase; 7593 letter-spacing: .16em; 7594 color: var(--mute); 7595 white-space: nowrap; 7596 padding-top: 2px; 7597 } 7598 7599 @media (max-width: 1180px) { 7600 .apart-ledger .spec { display: none; } 7601 .apart-ledger .row { grid-template-columns: 48px 1fr; } 7602 } 7603 7604 @media (min-width: 1180px) { 7605 .apart-ledger { 7606 columns: 2; 7607 column-gap: 44px 7608 } 7609 7610 .apart-ledger li { 7611 break-inside: avoid 7612 } 7613 7614 .apart-ledger .row { 7615 grid-template-columns: 44px 1fr; 7616 gap: 4px 18px; 7617 align-items: start; 7618 padding: 22px 14px 22px 4px 7619 } 7620 7621 .apart-ledger .spec { 7622 grid-column: 2; 7623 white-space: normal; 7624 padding-top: 10px 7625 } 7626 } 7627 7628 @media (max-width: 960px) { 7629 .apart { 7630 grid-template-columns: 1fr; 7631 gap: 48px; 7632 } 7633 7634 .apart-intro { 7635 position: static; 7636 } 7637 } 7638 7639 @media (max-width: 560px) { 7640 .apart-ledger .row { 7641 grid-template-columns: 1fr; 7642 gap: 8px; 7643 padding: 22px 12px 22px 6px; 7644 } 7645 } 7646 </style> 7647</section> 7648 7649 <!-- PA SPOTLIGHT --> 7650 <section class="shell tight" id="pa-spotlight" style="padding-top:0"> 7651 <div class="spot spot-cols r"> 7652 <div class="spot-glow" aria-hidden="true"></div> 7653 7654 <div style="position:relative;z-index:1"> 7655 7656 <h2 style="margin-top:24px;font-family:var(--serif);font-weight:300;font-size:clamp(40px,5.4vw,72px);line-height:.96;letter-spacing:-.025em;font-variation-settings:'opsz' 144,'SOFT' 30"> 7657 A <span class="italic plasma-text">personal assistant</span><br> 7658 that picks up<br> 7659 <span class="signal-text" style="font-weight:600;">at $89 a month.</span> 7660 </h2> 7661 <p style="margin-top:24px;color:var(--bone);font-size:17px;line-height:1.6;max-width:52ch"> 7662 Most of our customers start here. The PA agent is the answer to "I can't afford a receptionist, but 7663 I can't afford to miss another call either." It learns your callers, screens by importance, takes 7664 structured messages, and texts you only what matters. 7665 </p> 7666 <p style="margin-top:14px;color:var(--mute);font-size:14px;line-height:1.55;max-width:52ch"> 7667 <b style="color:var(--paper);font-weight:500">$89 a month</b>, flat. 7668 No setup fee, no lock-in. The PA answers your 7669 own mobile or landline; for a business line with a 24/7 7670 <a href="https://talkify.nz/reception" style="color:var(--bone);text-decoration:underline">AI receptionist</a>, 7671 business agents are $129 a month, or from 7672 $10 plus $1 a minute on pay as you go. 7673 </p> 7674 7675 <div style="margin-top:36px;display:flex;flex-wrap:wrap;gap:14px"> 7676 <a href="https://talkify.nz/personal-assistant" class="btn btn-primary btn-lg">See the PA in detail <span 7677 class="arr">â</span></a> 7678 <a href="https://talkify.nz/contact?plan=shortwave" class="btn btn-ghost btn-lg">Start mine · 7679 $89/mo</a> 7680 </div> 7681 7682 <ul style="margin-top:36px;list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:14px;color:var(--bone);font-size:14px;max-width:560px"> 7683 <li style="display:flex;gap:10px;align-items:flex-start"><span 7684 style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--signal);margin-top:8px;box-shadow:0 0 8px var(--signal)"></span>Caller 7685 memory across every interaction 7686 </li> 7687 <li style="display:flex;gap:10px;align-items:flex-start"><span 7688 style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--plasma);margin-top:8px;box-shadow:0 0 8px var(--plasma)"></span>VIP 7689 routing straight to your mobile 7690 </li> 7691 <li style="display:flex;gap:10px;align-items:flex-start"><span 7692 style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--signal);margin-top:8px;box-shadow:0 0 8px var(--signal)"></span>Polite 7693 vendor screening, no spam 7694 </li> 7695 <li style="display:flex;gap:10px;align-items:flex-start"><span 7696 style="flex:0 0 6px;width:6px;height:6px;border-radius:50%;background:var(--plasma);margin-top:8px;box-shadow:0 0 8px var(--plasma)"></span>Daily 7697 SMS digest at 5pm if you'd prefer 7698 </li> 7699 </ul> 7700 </div> 7701 <div style="position:relative;z-index:1"> 7702 7703 <div class="hphone agent-phone agent-phone--right" data-agent-phone="pa" 7704 aria-label="A phone showing the messages and meetings the personal assistant handled while you were out"> 7705 <div class="hphone-frame"> 7706 <div class="hphone-screen"> 7707 <div class="hphone-notch" aria-hidden="true"></div> 7708 7709 <div class="hphone-clock" data-agent-clock> 7710 <div class="t" data-agent-time></div> 7711 <div class="d" data-agent-date></div> 7712 </div> 7713 7714 <div class="hphone-stack"> 7715 <article class="hpn"> 7716 <header> 7717 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18">
7718 <span class="hpn-app">Talkify</span> 7719 <span class="hpn-ago" data-agent-ago="12"></span> 7720 </header> 7721 <h4>Message taken</h4> 7722 <p>Priya Anand · call back about the lease</p> 7723 </article> 7724 <article class="hpn"> 7725 <header> 7726 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 7727 <span class="hpn-app">Talkify</span> 7728 <span class="hpn-ago" data-agent-ago="47"></span> 7729 </header> 7730 <h4>Meeting booked</h4> 7731 <p>Thu 10:00am · Ben Whitfield, 30 min</p> 7732 </article> 7733 <article class="hpn"> 7734 <header> 7735 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 7736 <span class="hpn-app">Talkify</span> 7737 <span class="hpn-ago" data-agent-ago="96"></span> 7738 </header> 7739 <h4>Message taken</h4> 7740 <p>Your accountant · GST return question</p> 7741 </article> 7742 <article class="hpn"> 7743 <header> 7744 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 7745 <span class="hpn-app">Talkify</span> 7746 <span class="hpn-ago" data-agent-ago="154"></span> 7747 </header> 7748 <h4>Screened out</h4> 7749 <p>4 cold callers, none put through</p> 7750 </article> 7751 </div> 7752 7753 <div class="hphone-bar" aria-hidden="true"></div> 7754 </div> 7755 </div> 7756</div> 7757 7758 <p class="pa-cap">Three bookings taken. <span class="it">One message worth reading.</span> 7759 <em>Solo founder · $89/mo</em></p> 7760 </div> 7761 <style> 7762 .pa-cap { 7763 margin: 26px auto 0; 7764 max-width: 340px; 7765 text-align: center; 7766 font-family: var(--serif); 7767 font-size: 20px; 7768 font-weight: 600; 7769 letter-spacing: -.01em; 7770 line-height: 1.25; 7771 color: var(--paper) 7772 } 7773 7774 .pa-cap em { 7775 display: block; 7776 margin-top: 8px; 7777 font-family: var(--mono); 7778 font-style: normal; 7779 font-size: var(--t-label); 7780 letter-spacing: .13em; 7781 text-transform: uppercase; 7782 color: var(--mute) 7783 } 7784 </style> 7785 7786 </div> 7787 7788 </section> 7789 7790 <section class="shell" id="industries"> 7791 <div class="section-hd"> 7792 <h2 class="r">Trained for <span class="blue">your trade.</span></h2> 7793 <p class="lede r r-1">Twenty-two recipes. Each one already knows the vocabulary, the escalation rules and the calendar plumbing for the job, so the only thing left is the edges.</p> 7794 </div> 7795 7796 <h3 class="trade-sector">Trades</h3> 7797 <div class="trade-plate cols-4 r"> 7798 7799 <a class="trade" href="https://talkify.nz/tradesman"> 7800 <div class="shot" role="img" aria-label="Tradesman's ute with a Talkify job booked notification"> 7801 <i style="--pos:center 58%;--shot-dark:url('https://talkify.nz/media/frontend/tradesman-day.webp')"></i> 7802 <span class="shot-alert at-top-left" aria-hidden="true"> 7803 <span class="shot-alert-hd"> 7804 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 7805 width="20" height="20" 7806 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 7807 <defs> 7808 <linearGradient id="tkgbZ95sm" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 7809 <stop offset="0" stop-color="#318abe"/> 7810 <stop offset="1" stop-color="#a3d654"/> 7811 </linearGradient> 7812 </defs> 7813 <circle cx="50" cy="50" r="50" fill="url(#tkgbZ95sm)"/> 7814 7815 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 7816 <path d="M34 26 V54 C34 74 62 80 76 62"/> 7817 <path d="M20 40 H46"/> 7818 </g> 7819 7820 <g transform="translate(56 20) scale(0.30)"> 7821 <g class=""> 7822 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 7823 </g> 7824 </g> 7825 </svg>
7826 <span class="shot-alert-app">Talkify</span> 7827 <span class="shot-alert-stamp">now</span> 7828 </span> 7829 <strong class="shot-alert-title">Job booked</strong> 7830 <span class="shot-alert-body">Ngatai Rd, roof leak, tomorrow 8am</span> 7831 </span> 7832 </div> 7833 <div class="body"> 7834 <div class="hd"> 7835 <h3>Multi-trade <span class="it">contractors.</span></h3> 7836 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2.5 17.5h19v2.6h-19z"/><path d="M5.5 17.5v-3.8a6.5 6.5 0 0 1 13 0v3.8"/><path d="M9.8 7.9V4.6a.9.9 0 0 1 .9-.9h2.6a.9.9 0 0 1 .9.9v3.3"/></svg> 7837 </div> 7838 <p>Roofers, painters, gib-stoppers and drainlayers. One agent carrying every keyword your crew runs on.</p> 7839 <span class="go">See the recipe <em>→</em></span> 7840 </div> 7841 </a> 7842 7843 <a class="trade" href="https://talkify.nz/builder"> 7844 <div class="shot" role="img" aria-label="Builder on a partly framed house reading a Talkify job enquiry"> 7845 <i style="--pos:center 3%;--shot-dark:url('https://talkify.nz/media/frontend/builder-day.webp')"></i> 7846 <span class="shot-alert at-top-left" aria-hidden="true"> 7847 <span class="shot-alert-hd"> 7848 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 7849 width="20" height="20" 7850 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 7851 <defs> 7852 <linearGradient id="tkgbnauU1" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 7853 <stop offset="0" stop-color="#318abe"/> 7854 <stop offset="1" stop-color="#a3d654"/> 7855 </linearGradient> 7856 </defs> 7857 <circle cx="50" cy="50" r="50" fill="url(#tkgbnauU1)"/> 7858 7859 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 7860 <path d="M34 26 V54 C34 74 62 80 76 62"/> 7861 <path d="M20 40 H46"/> 7862 </g> 7863 7864 <g transform="translate(56 20) scale(0.30)"> 7865 <g class=""> 7866 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 7867 </g> 7868 </g> 7869 </svg> 7870 <span class="shot-alert-app">Talkify</span> 7871 <span class="shot-alert-stamp">now</span> 7872 </span> 7873 <strong class="shot-alert-title">New job enquiry</strong> 7874 <span class="shot-alert-body">Quote requested, Ngatai Rd</span> 7875 </span> 7876 </div> 7877 <div class="body"> 7878 <div class="hd"> 7879 <h3>Builders.</h3> 7880 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 3.5h4v12.5h12v4H4z"/><path d="M11.5 16v2M15 16v2"/></svg> 7881 </div> 7882 <p>Budget, consent status and timeline all asked for while you are still up on the frame.</p> 7883 <span class="go">See the recipe <em>→</em></span> 7884 </div> 7885 </a> 7886 7887 <a class="trade" href="https://talkify.nz/electrician"> 7888 <div class="shot" role="img" aria-label="Electrician testing a switchboard while Talkify books a fault callout"> 7889 <i style="--pos:center 8%;--shot-dark:url('https://talkify.nz/media/frontend/electrician-day.webp')"></i> 7890 <span class="shot-alert at-top-right" aria-hidden="true"> 7891 <span class="shot-alert-hd"> 7892 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 7893 width="20" height="20" 7894 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 7895 <defs> 7896 <linearGradient id="tkgwvs6v1" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 7897 <stop offset="0" stop-color="#318abe"/> 7898 <stop offset="1" stop-color="#a3d654"/> 7899 </linearGradient> 7900 </defs> 7901 <circle cx="50" cy="50" r="50" fill="url(#tkgwvs6v1)"/> 7902 7903 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 7904 <path d="M34 26 V54 C34 74 62 80 76 62"/> 7905 <path d="M20 40 H46"/> 7906 </g> 7907 7908 <g transform="translate(56 20) scale(0.30)"> 7909 <g class=""> 7910 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 7911 </g> 7912 </g> 7913 </svg>
7914 <span class="shot-alert-app">Talkify</span> 7915 <span class="shot-alert-stamp">now</span> 7916 </span> 7917 <strong class="shot-alert-title">Missed call answered</strong> 7918 <span class="shot-alert-body">Fault callout booked, 2pm, Ngatai Rd</span> 7919 </span> 7920 </div> 7921 <div class="body"> 7922 <div class="hd"> 7923 <h3>Electricians & <span class="it">sparkies.</span></h3> 7924 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v4M16 3v4"/><path d="M5 7h14v3.5a7 7 0 0 1-14 0z"/><path d="M12 17.5V21"/></svg> 7925 </div> 7926 <p>Fault triage on the call: power out, RCD tripping, burning smell. Jobs land in your calendar and your CRM.</p> 7927 <span class="go">See the recipe <em>→</em></span> 7928 </div> 7929 </a> 7930 7931 <a class="trade" href="https://talkify.nz/hvac"> 7932 <div class="shot" role="img" aria-label="Technician mounting a heat pump head unit while Talkify books an assessment"> 7933 <i style="--pos:center 22%;--shot-dark:url('https://talkify.nz/media/frontend/hvac-day.webp')"></i> 7934 <span class="shot-alert at-top-left" aria-hidden="true"> 7935 <span class="shot-alert-hd"> 7936 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 7937 width="20" height="20" 7938 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 7939 <defs> 7940 <linearGradient id="tkgcyXUWN" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 7941 <stop offset="0" stop-color="#318abe"/> 7942 <stop offset="1" stop-color="#a3d654"/> 7943 </linearGradient> 7944 </defs> 7945 <circle cx="50" cy="50" r="50" fill="url(#tkgcyXUWN)"/> 7946 7947 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 7948 <path d="M34 26 V54 C34 74 62 80 76 62"/> 7949 <path d="M20 40 H46"/> 7950 </g> 7951 7952 <g transform="translate(56 20) scale(0.30)"> 7953 <g class=""> 7954 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 7955 </g> 7956 </g> 7957 </svg> 7958 <span class="shot-alert-app">Talkify</span> 7959 <span class="shot-alert-stamp">now</span> 7960 </span> 7961 <strong class="shot-alert-title">Install quote booked</strong> 7962 <span class="shot-alert-body">Heat pump assessment, Thursday 9am</span> 7963 </span> 7964 </div> 7965 <div class="body"> 7966 <div class="hd"> 7967 <h3>Heat pump & <span class="blue">HVAC.</span></h3> 7968 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5h18v6.5H3z"/><path d="M6 8.8h12"/><path d="M6 16c1.2-1.5 2.4 1.5 3.6 0s2.4 1.5 3.6 0 2.4 1.5 3.6 0"/><path d="M7.5 19.6c1.2-1.5 2.4 1.5 3.6 0s2.4 1.5 3.6 0"/></svg> 7969 </div> 7970 <p>Every call in a cold snap answered at once. Installs quoted, assessments booked, nobody ringing out.</p> 7971 <span class="go">See the recipe <em>→</em></span> 7972 </div> 7973 </a> 7974 7975 <a class="trade" href="https://talkify.nz/landscaping"> 7976 <div class="shot" role="img" aria-label="Landscaper in a garden while Talkify sends a hedge trim quote"> 7977 <i style="--pos:center 9%;--shot-dark:url('https://talkify.nz/media/frontend/landscaper-day.webp')"></i> 7978 <span class="shot-alert at-top-left" aria-hidden="true"> 7979 <span class="shot-alert-hd"> 7980 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 7981 width="20" height="20" 7982 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 7983 <defs> 7984 <linearGradient id="tkgBu3HT3" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 7985 <stop offset="0" stop-color="#318abe"/> 7986 <stop offset="1" stop-color="#a3d654"/> 7987 </linearGradient> 7988 </defs> 7989 <circle cx="50" cy="50" r="50" fill="url(#tkgBu3HT3)"/> 7990 7991 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 7992 <path d="M34 26 V54 C34 74 62 80 76 62"/> 7993 <path d="M20 40 H46"/> 7994 </g> 7995 7996 <g transform="translate(56 20) scale(0.30)"> 7997 <g class=""> 7998 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 7999 </g> 8000 </g> 8001 </svg>
8002 <span class="shot-alert-app">Talkify</span> 8003 <span class="shot-alert-stamp">now</span> 8004 </span> 8005 <strong class="shot-alert-title">New enquiry</strong> 8006 <span class="shot-alert-body">Hedge trim, Karaka St, quote sent</span> 8007 </span> 8008 </div> 8009 <div class="body"> 8010 <div class="hd"> 8011 <h3>Landscapers.</h3> 8012 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2.5v10"/><path d="M9.5 2.5h5"/><path d="M8 12.5h8V16a4 4 0 0 1-8 0z"/></svg> 8013 </div> 8014 <p>Quotes given on the call, rounds filled, storm work escalated, all from the seat of the mower.</p> 8015 <span class="go">See the recipe <em>→</em></span> 8016 </div> 8017 </a> 8018 8019 <a class="trade" href="https://talkify.nz/automotive"> 8020 <div class="shot" role="img" aria-label="Mechanic in a workshop while Talkify books a WOF"> 8021 <i style="--pos:center 12%;--shot-dark:url('https://talkify.nz/media/frontend/mechanic-day.webp')"></i> 8022 <span class="shot-alert at-top-right" aria-hidden="true"> 8023 <span class="shot-alert-hd"> 8024 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8025 width="20" height="20" 8026 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8027 <defs> 8028 <linearGradient id="tkgr5Z6py" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8029 <stop offset="0" stop-color="#318abe"/> 8030 <stop offset="1" stop-color="#a3d654"/> 8031 </linearGradient> 8032 </defs> 8033 <circle cx="50" cy="50" r="50" fill="url(#tkgr5Z6py)"/> 8034 8035 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8036 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8037 <path d="M20 40 H46"/> 8038 </g> 8039 8040 <g transform="translate(56 20) scale(0.30)"> 8041 <g class=""> 8042 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8043 </g> 8044 </g> 8045 </svg> 8046 <span class="shot-alert-app">Talkify</span> 8047 <span class="shot-alert-stamp">now</span> 8048 </span> 8049 <strong class="shot-alert-title">WOF booked</strong> 8050 <span class="shot-alert-body">Thursday 9am, Rachel Tuinui</span> 8051 </span> 8052 </div> 8053 <div class="body"> 8054 <div class="hd"> 8055 <h3>Mechanics & <span class="it">workshops.</span></h3> 8056 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16.9 3.3a5 5 0 0 0-6.2 6.2l-7 7a2.4 2.4 0 0 0 3.4 3.4l7-7a5 5 0 0 0 6.2-6.2l-2.9 2.9-3.4-3.4z"/></svg> 8057 </div> 8058 <p>WOFs and services booked hands free. Breakdowns arrive as a text while you are still under a car.</p> 8059 <span class="go">See the recipe <em>→</em></span> 8060 </div> 8061 </a> 8062 8063 <a class="trade" href="https://talkify.nz/pest-control"> 8064 <div class="shot" role="img" aria-label="NZ pest control technician in coveralls and a respirator treating a weatherboard house while Talkify books the next treatment"> 8065 <i style="--pos:center 45%;--shot-dark:url('https://talkify.nz/media/frontend/pest-control-day.webp')"></i> 8066 <span class="shot-alert at-top-left" aria-hidden="true"> 8067 <span class="shot-alert-hd"> 8068 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8069 width="20" height="20" 8070 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8071 <defs> 8072 <linearGradient id="tkgYYays0" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8073 <stop offset="0" stop-color="#318abe"/> 8074 <stop offset="1" stop-color="#a3d654"/> 8075 </linearGradient> 8076 </defs> 8077 <circle cx="50" cy="50" r="50" fill="url(#tkgYYays0)"/> 8078 8079 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8080 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8081 <path d="M20 40 H46"/> 8082 </g> 8083 8084 <g transform="translate(56 20) scale(0.30)"> 8085 <g class=""> 8086 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8087 </g> 8088 </g> 8089 </svg>
8090 <span class="shot-alert-app">Talkify</span> 8091 <span class="shot-alert-stamp">now</span> 8092 </span> 8093 <strong class="shot-alert-title">Treatment booked</strong> 8094 <span class="shot-alert-body">Thu 8am, rodent programme</span> 8095 </span> 8096 </div> 8097 <div class="body"> 8098 <div class="hd"> 8099 <h3>Pest <span class="it">control.</span></h3> 8100 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="8" y="11" width="8" height="10" rx="1.5"/><path d="M10.5 11V8h3v3M13.5 8.5h3l2.2-2.2"/><path d="M20.2 4.6l1.2-1.2M19 3.2l.4-1.4M21.3 5.7l1.4-.4"/></svg> 8101 </div> 8102 <p>Wasp nests and rodents in a commercial kitchen reach you by text. Everything else is quoted and booked while you are under the house.</p> 8103 <span class="go">See the recipe <em>→</em></span> 8104 </div> 8105 </a> 8106 8107 <a class="trade" href="https://talkify.nz/plumber"> 8108 <div class="shot" role="img" aria-label="Plumber under a kitchen sink while Talkify flags a burst pipe"> 8109 <i style="--pos:center 4%;--shot-dark:url('https://talkify.nz/media/frontend/plumber-day.webp')"></i> 8110 <span class="shot-alert at-top-right" aria-hidden="true"> 8111 <span class="shot-alert-hd"> 8112 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8113 width="20" height="20" 8114 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8115 <defs> 8116 <linearGradient id="tkgqhOzwt" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8117 <stop offset="0" stop-color="#318abe"/> 8118 <stop offset="1" stop-color="#a3d654"/> 8119 </linearGradient> 8120 </defs> 8121 <circle cx="50" cy="50" r="50" fill="url(#tkgqhOzwt)"/> 8122 8123 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8124 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8125 <path d="M20 40 H46"/> 8126 </g> 8127 8128 <g transform="translate(56 20) scale(0.30)"> 8129 <g class=""> 8130 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8131 </g> 8132 </g> 8133 </svg> 8134 <span class="shot-alert-app">Talkify</span> 8135 <span class="shot-alert-stamp">now</span> 8136 </span> 8137 <strong class="shot-alert-title">Missed call answered</strong> 8138 <span class="shot-alert-body">Burst pipe, Sarah Henderson, urgent</span> 8139 </span> 8140 </div> 8141 <div class="body"> 8142 <div class="hd"> 8143 <h3>Plumbers & <span class="it">gas-fitters.</span></h3> 8144 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3.5 6.5h6.5v4H3.5z"/><path d="M10 8.5h4.6a2.9 2.9 0 0 1 2.9 2.9v2.4"/><path d="M19 18.6c0 .9-.7 1.6-1.5 1.6S16 19.5 16 18.6c0-1 1.5-2.9 1.5-2.9s1.5 1.9 1.5 2.9z"/></svg> 8145 </div> 8146 <p>Burst pipes and gas leaks read as emergencies and reach you by text inside a minute.</p> 8147 <span class="go">See the recipe <em>→</em></span> 8148 </div> 8149 </a> 8150 8151 </div> 8152 8153 <h3 class="trade-sector">Health & beauty</h3> 8154 <div class="trade-plate cols-4 r"> 8155 8156 <a class="trade" href="https://talkify.nz/barber"> 8157 <div class="shot" role="img" aria-label="NZ barber part way through a fade while Talkify books the next customer"> 8158 <i style="--pos:center 45%;--shot-dark:url('https://talkify.nz/media/frontend/barber-day.webp')"></i> 8159 <span class="shot-alert at-top-right" aria-hidden="true"> 8160 <span class="shot-alert-hd"> 8161 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8162 width="20" height="20" 8163 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8164 <defs> 8165 <linearGradient id="tkgXQRvKo" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8166 <stop offset="0" stop-color="#318abe"/> 8167 <stop offset="1" stop-color="#a3d654"/> 8168 </linearGradient> 8169 </defs> 8170 <circle cx="50" cy="50" r="50" fill="url(#tkgXQRvKo)"/> 8171 8172 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8173 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8174 <path d="M20 40 H46"/> 8175 </g> 8176 8177 <g transform="translate(56 20) scale(0.30)"> 8178 <g class=""> 8179 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8180 </g> 8181 </g> 8182 </svg>
8183 <span class="shot-alert-app">Talkify</span> 8184 <span class="shot-alert-stamp">now</span> 8185 </span> 8186 <strong class="shot-alert-title">Booked in</strong> 8187 <span class="shot-alert-body">Sat 10:30, skin fade, Mikaere</span> 8188 </span> 8189 </div> 8190 <div class="body"> 8191 <div class="hd"> 8192 <h3>Barbers.</h3> 8193 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="6.5" cy="18" r="2.6"/><circle cx="17.5" cy="18" r="2.6"/><path d="M8.4 16.1 19 4M15.6 16.1 5 4"/></svg> 8194 </div> 8195 <p>Live walk-in wait times, bookings taken mid-fade, and no-shows chased before they cost you a chair.</p> 8196 <span class="go">See the recipe <em>→</em></span> 8197 </div> 8198 </a> 8199 8200 <a class="trade" href="https://talkify.nz/beauty"> 8201 <div class="shot" role="img" aria-label="Stylist colouring a client's hair in an NZ salon"> 8202 <i style="--pos:center 31%;--shot-dark:url('https://talkify.nz/media/frontend/salon-day.webp')"></i> 8203 <span class="shot-alert at-top-left" aria-hidden="true"> 8204 <span class="shot-alert-hd"> 8205 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8206 width="20" height="20" 8207 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8208 <defs> 8209 <linearGradient id="tkgtxCUDX" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8210 <stop offset="0" stop-color="#318abe"/> 8211 <stop offset="1" stop-color="#a3d654"/> 8212 </linearGradient> 8213 </defs> 8214 <circle cx="50" cy="50" r="50" fill="url(#tkgtxCUDX)"/> 8215 8216 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8217 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8218 <path d="M20 40 H46"/> 8219 </g> 8220 8221 <g transform="translate(56 20) scale(0.30)"> 8222 <g class=""> 8223 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8224 </g> 8225 </g> 8226 </svg> 8227 <span class="shot-alert-app">Talkify</span> 8228 <span class="shot-alert-stamp">now</span> 8229 </span> 8230 <strong class="shot-alert-title">Booked in</strong> 8231 <span class="shot-alert-body">Fri 2pm, half head foils, Anahera</span> 8232 </span> 8233 </div> 8234 <div class="body"> 8235 <div class="hd"> 8236 <h3>Beauty & <span class="blue">wellness.</span></h3> 8237 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2.5a5.5 5.5 0 0 1 5.5 5.5c0 3-2.5 5-5.5 8.5C9 13 6.5 11 6.5 8A5.5 5.5 0 0 1 12 2.5z"/><path d="M12 16.5V21"/></svg> 8238 </div> 8239 <p>Treatment-menu aware, and books into Zenoti or your own calendar long after you have locked up.</p> 8240 <span class="go">See the recipe <em>→</em></span> 8241 </div> 8242 </a> 8243 8244 <a class="trade" href="https://talkify.nz/gym"> 8245 <div class="shot" role="img" aria-label="NZ gym floor while Talkify holds a class seat over the phone"> 8246 <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/gym-day.webp')"></i> 8247 <span class="shot-alert at-top-left" aria-hidden="true"> 8248 <span class="shot-alert-hd"> 8249 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8250 width="20" height="20" 8251 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8252 <defs> 8253 <linearGradient id="tkg3Ywc4t" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8254 <stop offset="0" stop-color="#318abe"/> 8255 <stop offset="1" stop-color="#a3d654"/> 8256 </linearGradient> 8257 </defs> 8258 <circle cx="50" cy="50" r="50" fill="url(#tkg3Ywc4t)"/> 8259 8260 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8261 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8262 <path d="M20 40 H46"/> 8263 </g> 8264 8265 <g transform="translate(56 20) scale(0.30)"> 8266 <g class=""> 8267 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8268 </g> 8269 </g> 8270 </svg>
8271 <span class="shot-alert-app">Talkify</span> 8272 <span class="shot-alert-stamp">now</span> 8273 </span> 8274 <strong class="shot-alert-title">Class seat held</strong> 8275 <span class="shot-alert-body">6am HIIT, one spot left</span> 8276 </span> 8277 </div> 8278 <div class="body"> 8279 <div class="hd"> 8280 <h3>Gyms & <span class="blue">studios.</span></h3> 8281 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.5 9v6M17.5 9v6M3.5 10.5v3M20.5 10.5v3M6.5 12h11"/></svg> 8282 </div> 8283 <p>Reads your GymMaster timetable for live class seats, and turns joining enquiries into booked trials.</p> 8284 <span class="go">See the recipe <em>→</em></span> 8285 </div> 8286 </a> 8287 8288 <a class="trade" href="https://talkify.nz/personal-trainer"> 8289 <div class="shot" role="img" aria-label="NZ personal trainer coaching a client while Talkify books a consult"> 8290 <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/trainer-day.webp')"></i> 8291 <span class="shot-alert at-top-left" aria-hidden="true"> 8292 <span class="shot-alert-hd"> 8293 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8294 width="20" height="20" 8295 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8296 <defs> 8297 <linearGradient id="tkgQGVkzw" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8298 <stop offset="0" stop-color="#318abe"/> 8299 <stop offset="1" stop-color="#a3d654"/> 8300 </linearGradient> 8301 </defs> 8302 <circle cx="50" cy="50" r="50" fill="url(#tkgQGVkzw)"/> 8303 8304 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8305 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8306 <path d="M20 40 H46"/> 8307 </g> 8308 8309 <g transform="translate(56 20) scale(0.30)"> 8310 <g class=""> 8311 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8312 </g> 8313 </g> 8314 </svg> 8315 <span class="shot-alert-app">Talkify</span> 8316 <span class="shot-alert-stamp">now</span> 8317 </span> 8318 <strong class="shot-alert-title">New enquiry</strong> 8319 <span class="shot-alert-body">Consult booked, Tue 6:30pm</span> 8320 </span> 8321 </div> 8322 <div class="body"> 8323 <div class="hd"> 8324 <h3>Personal <span class="it">trainers.</span></h3> 8325 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="4.6" r="2.1"/><path d="M12 7.5v6M12 13.5 8 21M12 13.5 16 21M7.5 10h9"/></svg> 8326 </div> 8327 <p>Answers mid-session, qualifies on goals and budget, books the consult before they ring anyone else.</p> 8328 <span class="go">See the recipe <em>→</em></span> 8329 </div> 8330 </a> 8331 8332 </div> 8333 8334 <h3 class="trade-sector">Office & property</h3> 8335 <div class="trade-plate cols-4 r"> 8336 8337 <a class="trade" href="https://talkify.nz/accountant"> 8338 <div class="shot" role="img" aria-label="NZ accountant working through client files while Talkify answers the practice phone"> 8339 <i style="--pos:center 71%;--shot-dark:url('https://talkify.nz/media/frontend/accountant-day.webp')"></i> 8340 8341 <span class="shot-alert at-top-left" aria-hidden="true"> 8342 <span class="shot-alert-hd"> 8343 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8344 width="20" height="20" 8345 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8346 <defs> 8347 <linearGradient id="tkgQvvvUL" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8348 <stop offset="0" stop-color="#318abe"/> 8349 <stop offset="1" stop-color="#a3d654"/> 8350 </linearGradient> 8351 </defs> 8352 <circle cx="50" cy="50" r="50" fill="url(#tkgQvvvUL)"/> 8353 8354 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8355 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8356 <path d="M20 40 H46"/> 8357 </g> 8358 8359 <g transform="translate(56 20) scale(0.30)"> 8360 <g class=""> 8361 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8362 </g> 8363 </g> 8364 </svg>
8365 <span class="shot-alert-app">Talkify</span> 8366 <span class="shot-alert-stamp">now</span> 8367 </span> 8368 <strong class="shot-alert-title">Client call handled</strong> 8369 <span class="shot-alert-body">GST deadline, no callback needed</span> 8370 </span> 8371 </div> 8372 <div class="body"> 8373 <div class="hd"> 8374 <h3>Accountants.</h3> 8375 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3h9l4 4v14H6z"/><path d="M15 3v4h4M9 12h6M9 16h6"/></svg> 8376 </div> 8377 <p>Deadline questions and invoice answers straight from Xero, so tax season stops eating the chargeable hour.</p> 8378 <span class="go">See the recipe <em>→</em></span> 8379 </div> 8380 </a> 8381 8382 <a class="trade" href="https://talkify.nz/professional-services"> 8383 <div class="shot" role="img" aria-label="Barrister's chambers while Talkify routes a client call"> 8384 <i style="--pos:center 65%;--shot-dark:url('https://talkify.nz/media/frontend/pro-services-day.webp')"></i> 8385 <span class="shot-alert at-top-right" aria-hidden="true"> 8386 <span class="shot-alert-hd"> 8387 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8388 width="20" height="20" 8389 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8390 <defs> 8391 <linearGradient id="tkgJbnNCM" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8392 <stop offset="0" stop-color="#318abe"/> 8393 <stop offset="1" stop-color="#a3d654"/> 8394 </linearGradient> 8395 </defs> 8396 <circle cx="50" cy="50" r="50" fill="url(#tkgJbnNCM)"/> 8397 8398 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8399 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8400 <path d="M20 40 H46"/> 8401 </g> 8402 8403 <g transform="translate(56 20) scale(0.30)"> 8404 <g class=""> 8405 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8406 </g> 8407 </g> 8408 </svg> 8409 <span class="shot-alert-app">Talkify</span> 8410 <span class="shot-alert-stamp">now</span> 8411 </span> 8412 <strong class="shot-alert-title">Client call routed</strong> 8413 <span class="shot-alert-body">Ms Reid to Mark, encrypted</span> 8414 </span> 8415 </div> 8416 <div class="body"> 8417 <div class="hd"> 8418 <h3>Professional <span class="blue">services.</span></h3> 8419 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2.5 6 12l6 9 6-9z"/><path d="M12 21v-8.4"/><circle cx="12" cy="11" r="1.6"/></svg> 8420 </div> 8421 <p>Confidentiality-first triage for law and consulting. Nothing sensitive read out to an unverified caller.</p> 8422 <span class="go">See the recipe <em>→</em></span> 8423 </div> 8424 </a> 8425 8426 <a class="trade" href="https://talkify.nz/real-estate"> 8427 <div class="shot" role="img" aria-label="For sale sign outside an NZ villa inviting buyers to call the Talkify agent to book a viewing"> 8428 <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/real-estate-sign.webp')"></i> 8429 </div> 8430 <div class="body"> 8431 <div class="hd"> 8432 <h3>Real <span class="it">estate.</span></h3> 8433 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="16" cy="8" r="3.8"/><path d="M13.3 10.7 4.5 19.5M6.8 17.2l2.2 2.2M9.4 14.6l2.2 2.2"/></svg> 8434 </div> 8435 <p>Put the number on the sign. Buyers driving past at nine at night book their own viewing.</p> 8436 <span class="go">See the recipe <em>→</em></span> 8437 </div> 8438 </a> 8439 8440 <a class="trade" href="https://talkify.nz/retail"> 8441 <div class="shot" role="img" aria-label="NZ retail staff serving a customer while Talkify holds a pair of shoes"> 8442 <i style="--pos:center 10%;--shot-dark:url('https://talkify.nz/media/frontend/retail-day.webp')"></i>
8443 <span class="shot-alert at-top-left" aria-hidden="true"> 8444 <span class="shot-alert-hd"> 8445 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8446 width="20" height="20" 8447 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8448 <defs> 8449 <linearGradient id="tkgtVxfjy" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8450 <stop offset="0" stop-color="#318abe"/> 8451 <stop offset="1" stop-color="#a3d654"/> 8452 </linearGradient> 8453 </defs> 8454 <circle cx="50" cy="50" r="50" fill="url(#tkgtVxfjy)"/> 8455 8456 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8457 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8458 <path d="M20 40 H46"/> 8459 </g> 8460 8461 <g transform="translate(56 20) scale(0.30)"> 8462 <g class=""> 8463 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8464 </g> 8465 </g> 8466 </svg> 8467 <span class="shot-alert-app">Talkify</span> 8468 <span class="shot-alert-stamp">now</span> 8469 </span> 8470 <strong class="shot-alert-title">Held for pickup</strong> 8471 <span class="shot-alert-body">Hoka Bondi 8, size 10, 24h</span> 8472 </span> 8473 </div> 8474 <div class="body"> 8475 <div class="hd"> 8476 <h3>Retail & <span class="it">e-com.</span></h3> 8477 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3.5 3.5h9l8 8-9 9-8-8z"/><circle cx="7.6" cy="7.6" r="1.4"/></svg> 8478 </div> 8479 <p>Stock checks, returns and shipping questions handled without pulling anyone off the floor.</p> 8480 <span class="go">See the recipe <em>→</em></span> 8481 </div> 8482 </a> 8483 8484 </div> 8485 8486 <h3 class="trade-sector">Food & hospitality</h3> 8487 <div class="trade-plate cols-4 r"> 8488 8489 <a class="trade" href="https://talkify.nz/cafe"> 8490 <div class="shot" role="img" aria-label="NZ busy cafe counter with the machine running while an order arrives on a screen"> 8491 <i style="--pos:center 50%;--shot-dark:url('https://talkify.nz/media/frontend/cafe-counter.jpg')"></i> 8492 </div> 8493 <div class="body"> 8494 <div class="hd"> 8495 <h3>Cafes & <span class="it">coffee shops.</span></h3> 8496 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 8h13v5a5 5 0 01-5 5H9a5 5 0 01-5-5z"/><path d="M17 9h2.5a2.5 2.5 0 010 5H17"/><path d="M6 3v2M10 3v2M14 3v2"/></svg> 8497 </div> 8498 <p>The office coffee run taken with the right milk on every cup, while nobody behind the machine looks up.</p> 8499 <span class="go">See the recipe <em>→</em></span> 8500 </div> </a> 8501 8502 <a class="trade" href="https://talkify.nz/chinese-takeaway"> 8503 <div class="shot" role="img" aria-label="NZ Chinese takeaway counter on a Friday night while an order lands on a screen"> 8504 <i style="--pos:center 50%;--shot-dark:url('https://talkify.nz/media/frontend/chinese-takeaway.jpg')"></i> 8505 </div> 8506 <div class="body"> 8507 <div class="hd"> 8508 <h3>Chinese <span class="it">takeaways.</span></h3> 8509 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 8h14l-1.5 11a2 2 0 01-2 2h-7a2 2 0 01-2-2z"/><path d="M9 8V5a3 3 0 016 0v3"/></svg> 8510 </div> 8511 <p>Twelve dishes, every question about what is in them, and the allergy in red where nobody can miss it.</p> 8512 <span class="go">See the recipe <em>→</em></span> 8513 </div> 8514 </a> 8515 8516 <a class="trade" href="https://talkify.nz/fish-and-chip-shop"> 8517 <div class="shot" role="img" aria-label="NZ fish and chip shop counter at teatime while Talkify takes an order on the phone"> 8518 <i style="--pos:center 55%;--shot-dark:url('https://talkify.nz/media/frontend/fish-and-chips.jpg')"></i> 8519 </div> 8520 <div class="body"> 8521 <div class="hd"> 8522 <h3>Fish & <span class="it">chip shops.</span></h3> 8523 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12c3-4 7-6 11-6l6 6-6 6c-4 0-8-2-11-6z"/><circle cx="16" cy="10.5" r="1"/></svg> 8524 </div> 8525 <p>Every call answered through the teatime rush, and the chicken salt written on the chips rather than lost.</p>
8526 <span class="go">See the recipe <em>→</em></span> 8527 </div> 8528 </a> 8529 8530 <a class="trade" href="https://talkify.nz/hotel"> 8531 <div class="shot" role="img" aria-label="NZ motel reception desk in the evening while Talkify takes a late booking"> 8532 <i style="--pos:center 35%;--shot-dark:url('https://talkify.nz/media/frontend/hotel-day.webp')"></i> 8533 <span class="shot-alert at-top-right" aria-hidden="true"> 8534 <span class="shot-alert-hd"> 8535 <svg class="tk-logo shot-alert-mark" viewBox="0 0 100 100" 8536 width="20" height="20" 8537 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 8538 <defs> 8539 <linearGradient id="tkgAurpd9" gradientUnits="userSpaceOnUse" x1="8" y1="92" x2="92" y2="8"> 8540 <stop offset="0" stop-color="#318abe"/> 8541 <stop offset="1" stop-color="#a3d654"/> 8542 </linearGradient> 8543 </defs> 8544 <circle cx="50" cy="50" r="50" fill="url(#tkgAurpd9)"/> 8545 8546 <g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round"> 8547 <path d="M34 26 V54 C34 74 62 80 76 62"/> 8548 <path d="M20 40 H46"/> 8549 </g> 8550 8551 <g transform="translate(56 20) scale(0.30)"> 8552 <g class=""> 8553 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="#ffffff"/> 8554 </g> 8555 </g> 8556 </svg> 8557 <span class="shot-alert-app">Talkify</span> 8558 <span class="shot-alert-stamp">now</span> 8559 </span> 8560 <strong class="shot-alert-title">Room booked</strong> 8561 <span class="shot-alert-body">2 nights, late check-in sent</span> 8562 </span> 8563 </div> 8564 <div class="body"> 8565 <div class="hd"> 8566 <h3>Hotels & <span class="blue">motels.</span></h3> 8567 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 18V9a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v9"/><path d="M3 18h18M7 7V5h10v2M7 12h4"/></svg> 8568 </div> 8569 <p>Rooms quoted and sold at 11pm, late check-in explained, anything urgent rung through to the duty phone.</p> 8570 <span class="go">See the recipe <em>→</em></span> 8571 </div> 8572 </a> 8573 8574 <a class="trade" href="https://talkify.nz/pizza-shop"> 8575 <div class="shot" role="img" aria-label="NZ pizza shop bench beside the oven while an order arrives on a screen"> 8576 <i style="--pos:center 50%;--shot-dark:url('https://talkify.nz/media/frontend/pizza-shop.jpg')"></i> 8577 </div> 8578 <div class="body"> 8579 <div class="hd"> 8580 <h3>Pizza <span class="it">shops.</span></h3> 8581 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l9 17H3z"/><circle cx="12" cy="11" r="1"/><circle cx="9.5" cy="16" r="1"/><circle cx="14.5" cy="16" r="1"/></svg> 8582 </div> 8583 <p>Ninety minutes of calls at once, with the half-and-half written on the pizza it belongs to.</p> 8584 <span class="go">See the recipe <em>→</em></span> 8585 </div> 8586 </a> 8587 8588 <a class="trade" href="https://talkify.nz/restaurant-bookings"> 8589 <div class="shot" role="img" aria-label="NZ restaurant host stand during service while a table booking arrives on a screen"> 8590 <i style="--pos:center 45%;--shot-dark:url('https://talkify.nz/media/frontend/restaurant-bookings.jpg')"></i> 8591 </div> 8592 <div class="body"> 8593 <div class="hd"> 8594 <h3>Restaurant <span class="it">bookings.</span></h3> 8595 <svg class="mark" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3v9a3 3 0 003 3v6M6 7h3M18 3c-1.5 2-2 4-2 6a2 2 0 002 2v10"/></svg> 8596 </div> 8597 <p>The Saturday table booked at eleven on a Wednesday night, when your phone would otherwise ring out.</p> 8598 <span class="go">See the recipe <em>→</em></span> 8599 </div> 8600 </a> 8601 8602 </div> 8603</section> 8604 8605 8606 8607 <section class="shell tight" id="after-hours" style="padding-top:0"> 8608 <div class="spot spot--urgent spot-cols r"> 8609 <div class="spot-glow spot-glow--urgent" aria-hidden="true"></div> 8610 <div class="ah-copy">
8611 <span class="eyebrow"><span class="pin"></span>Nights, weekends and public holidays</span> 8612 <h2 class="r">The 11pm call <span class="it">that cannot wait.</span></h2> 8613 8614 <p class="lede r r-1">A burst pipe does not check your opening hours. The agent answers, works out 8615 whether it is an emergency or a Monday job, and if it cannot wait it starts working down your 8616 on-call list until an actual person picks up.</p> 8617 8618 <ul class="ah-points r r-2"> 8619 <li><strong>Triages first.</strong> Emergencies get escalated. Everything else is taken as a 8620 message and lands with the rest of your morning.</li> 8621 <li><strong>Chases a human.</strong> Notification, then text, then a phone call, and on to the 8622 next person on the roster if the first does not accept.</li> 8623 <li><strong>Hands over the job.</strong> Address, fault, caller and number, so whoever accepts is 8624 driving rather than ringing back to ask.</li> 8625 </ul> 8626 8627 <div class="ah-cta r r-3"> 8628 <a href="https://talkify.nz/on-call-roster" class="btn btn-primary btn-lg">See the on-call roster 8629 <span class="arr">→</span></a> 8630 <a href="https://talkify.nz/after-hours-answering" class="btn btn-ghost btn-lg">After-hours answering</a> 8631 </div> 8632 8633 8634 <p class="ah-price r r-3"><span class="lbl">On-call roster</span> 8635 <b>$19.95</b>/mo, on top of an agent. Escalation texts 8636 and calls at the usual rates.</p> 8637 </div> 8638 8639 <div class="ah-phone r r-1"> 8640 <div class="hphone agent-phone agent-phone--right" data-agent-phone="afterhours" 8641 data-agent-at="23:42" aria-label="A phone at a quarter to midnight showing Talkify triaging a burst pipe and escalating it down the on-call roster until somebody accepted"> 8642 <div class="hphone-frame"> 8643 <div class="hphone-screen"> 8644 <div class="hphone-notch" aria-hidden="true"></div> 8645 8646 <div class="hphone-clock" data-agent-clock> 8647 <div class="t" data-agent-time></div> 8648 <div class="d" data-agent-date></div> 8649 </div> 8650 8651 <div class="hphone-stack"> 8652 <article class="hpn"> 8653 <header> 8654 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 8655 <span class="hpn-app">Talkify</span> 8656 <span class="hpn-ago" data-agent-ago="4"></span> 8657 </header> 8658 <h4>Emergency · burst pipe</h4> 8659 <p>Ngatai Rd · water through the ceiling</p> 8660 </article> 8661 <article class="hpn"> 8662 <header> 8663 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 8664 <span class="hpn-app">Talkify</span> 8665 <span class="hpn-ago" data-agent-ago="3"></span> 8666 </header> 8667 <h4>Ringing Sam</h4> 8668 <p>No answer · moving to the next on the roster</p> 8669 </article> 8670 <article class="hpn"> 8671 <header> 8672 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 8673 <span class="hpn-app">Talkify</span> 8674 <span class="hpn-ago" data-agent-ago="2"></span> 8675 </header> 8676 <h4>Dave accepted</h4> 8677 <p>On the way, ETA 25 minutes</p> 8678 </article> 8679 <article class="hpn"> 8680 <header> 8681 <img src="https://talkify.nz/android-chrome-192x192.png" alt="" width="18" height="18"> 8682 <span class="hpn-app">Talkify</span> 8683 <span class="hpn-ago" data-agent-ago="1"></span> 8684 </header> 8685 <h4>Caller told</h4> 8686 <p>Texted the ETA and the name of who is coming</p> 8687 </article> 8688 </div> 8689 8690 <div class="hphone-bar" aria-hidden="true"></div> 8691 </div> 8692 </div> 8693</div> 8694 </div> 8695 </div> 8696 </section> 8697 8698 <section class="shell" id="testimonials"> 8699 <div class="section-hd"> 8700 <h2 class="r">What customers <span class="it">actually say.</span></h2> 8701 <p class="lede r r-1">Reviews from our Google profile, in full. The only change is our own name in place of the 8702 owner's, and surnames shortened.</p> 8703 </div> 8704 8705 8706 <div class="tst r" data-tst> 8707 <div class="tst-track" data-tst-track role="list"> 8708 <article class="tst-card" role="listitem" aria-roledescription="review" 8709 aria-label="Review 1 of 6"> 8710 <div class="tst-top"> 8711 <div class="tst-stars" aria-label="5 out of 5">★★★★★</div>
8712 <span class="tst-badge">Google</span> 8713 </div> 8714 8715 <blockquote class="tst-quote" data-tst-quote> 8716 "Thanks Talkify, love the AI Assistant phone service since we have implemented it at SUB10 to take the pressure off our reception staff and after hours phone handling. Its ability to answer most members and prospects questions has been a real game changer and most don't even know its AI, even though the voice states it is! Thank you!" 8717 </blockquote> 8718 8719 8720 <footer class="tst-foot"> 8721 <div class="tst-init" aria-hidden="true">DW</div> 8722 <div> 8723 <div class="tst-name">Dean W.</div> 8724 <div class="tst-role">SUB10</div> 8725 </div> 8726 </footer> 8727 </article> 8728 <article class="tst-card" role="listitem" aria-roledescription="review" 8729 aria-label="Review 2 of 6"> 8730 <div class="tst-top"> 8731 <div class="tst-stars" aria-label="5 out of 5">★★★★★</div> 8732 <span class="tst-badge">Google</span> 8733 </div> 8734 8735 <blockquote class="tst-quote is-clamped" data-tst-quote> 8736 "Awesome! I'm so busy with my little tech support business I've been waiting so long for something like this to at least answer my calls when I'm onsite or with a customer, which is all day as per bookings etc, now <mark>instead of a missed call they can at least talk to someone</mark> and pass on their info plus how urgent it is, then I can filter through asap after my jobs are done and get back to people already knowing the problem, contact details, address and urgency level already. My customers love it! So far most of them do not know if she's real or not, it's amazing." 8737 </blockquote> 8738 8739 <button type="button" class="tst-more-btn" data-tst-expand aria-expanded="false"> 8740 <span>Read the full review</span> 8741 </button> 8742 8743 <footer class="tst-foot"> 8744 <div class="tst-init" aria-hidden="true">DB</div> 8745 <div> 8746 <div class="tst-name">Dylan B.</div> 8747 <div class="tst-role">Tech support, onsite all day</div> 8748 </div> 8749 </footer> 8750 </article> 8751 <article class="tst-card" role="listitem" aria-roledescription="review" 8752 aria-label="Review 3 of 6"> 8753 <div class="tst-top"> 8754 <div class="tst-stars" aria-label="5 out of 5">★★★★★</div> 8755 <span class="tst-badge">Google</span> 8756 </div> 8757 8758 <blockquote class="tst-quote is-clamped" data-tst-quote> 8759 "Talkify Delivers! Highly Recommended. As a busy motorhome and caravan dealership, missing customer calls simply isn't an option. For years, we used traditional answering services, but the costs kept increasing while the service remained much the same. We knew there had to be a better way. Before Talkify, we tried another AI phone agent provider, but when Talkify came looking for a caravan for the family and reached out, we decided to give them a chance. We're glad we did. After several months of using Talkify AI Phone Agents, we can honestly say the system has exceeded our expectations. The AI handles customer enquiries professionally, captures leads effectively, and ensures our customers always have someone available to speak with. It has helped streamline our operations while reducing costs at the same time. What really impressed us, however, wasn't just the technology. In a world where many companies disappear after making the sale, Talkify is the complete opposite. Whether it's during business hours, after hours, or on weekends, they're always available to help. If we leave a message, <mark>we usually hear back within 8 minutes</mark>. That kind of service is almost unheard of these days. More importantly, they genuinely care about helping businesses succeed, constantly coming up with ideas, improvements, and solutions that go beyond the AI receptionist itself. Rather than simply selling software, they become part of your team and work with you to improve your customer experience and business processes. Talkify has become an important part of our operation today, and the support we receive is second to none. If you're considering a receptionist or phone answering solution, seriously stop looking." 8760 </blockquote> 8761 8762 <button type="button" class="tst-more-btn" data-tst-expand aria-expanded="false">
8763 <span>Read the full review</span> 8764 </button> 8765 8766 <footer class="tst-foot"> 8767 <div class="tst-init" aria-hidden="true">IR</div> 8768 <div> 8769 <div class="tst-name">Infinity RV</div> 8770 <div class="tst-role">Motorhome & caravan dealership</div> 8771 </div> 8772 </footer> 8773 </article> 8774 <article class="tst-card" role="listitem" aria-roledescription="review" 8775 aria-label="Review 4 of 6"> 8776 <div class="tst-top"> 8777 <div class="tst-stars" aria-label="5 out of 5">★★★★★</div> 8778 <span class="tst-badge">Google</span> 8779 </div> 8780 8781 <blockquote class="tst-quote" data-tst-quote> 8782 "Amazing agent. Very good with natural conversation and accurate. <mark>Dictates the information back</mark> to make sure it gets everything correct." 8783 </blockquote> 8784 8785 8786 <footer class="tst-foot"> 8787 <div class="tst-init" aria-hidden="true">AI</div> 8788 <div> 8789 <div class="tst-name">Anton I.</div> 8790 <div class="tst-role">Local Guide, 25 reviews</div> 8791 </div> 8792 </footer> 8793 </article> 8794 <article class="tst-card" role="listitem" aria-roledescription="review" 8795 aria-label="Review 5 of 6"> 8796 <div class="tst-top"> 8797 <div class="tst-stars" aria-label="5 out of 5">★★★★★</div> 8798 <span class="tst-badge">Google</span> 8799 </div> 8800 8801 <blockquote class="tst-quote is-clamped" data-tst-quote> 8802 "Highly Recommended, Outstanding AI Phone Agent Service. For more than 19 years, we relied on traditional answering services to manage our customer calls. However, with rising operating costs and continual price increases from traditional providers, we knew it was time to look for a smarter and more cost-effective solution. Before Talkify, we worked with another AI phone agent company. When Talkify approached us, we decided to give this local company an opportunity. Looking back, it has been one of the best business decisions we've made. We have now been using Talkify AI Phone Agents for around two months, and the results have been outstanding. Their technology, reliability, and overall performance have exceeded our expectations. The AI handles our calls professionally and consistently, helping us improve customer service while significantly reducing our monthly costs. However, great technology is only part of the equation. What truly sets Talkify apart is the exceptional support. No matter what time we contact them, they are always willing to help. If they miss a call, they typically get back to us within 10 to 15 minutes. That level of responsiveness and commitment is extremely rare these days. More importantly, they don't just provide support for the existing system. They are constantly looking for ways to improve our business operations and often come up with new ideas and solutions that add real value. It feels like having a technology partner rather than just another service provider." 8803 </blockquote> 8804 8805 <button type="button" class="tst-more-btn" data-tst-expand aria-expanded="false"> 8806 <span>Read the full review</span> 8807 </button> 8808 8809 <footer class="tst-foot"> 8810 <div class="tst-init" aria-hidden="true">DY</div> 8811 <div> 8812 <div class="tst-name">Dan Y.</div> 8813 <div class="tst-role">Local Guide, 370 reviews</div> 8814 </div> 8815 </footer> 8816 </article> 8817 <article class="tst-card" role="listitem" aria-roledescription="review" 8818 aria-label="Review 6 of 6"> 8819 <div class="tst-top"> 8820 <div class="tst-stars" aria-label="5 out of 5">★★★★★</div>
8821 <span class="tst-badge">Google</span> 8822 </div> 8823 8824 <blockquote class="tst-quote" data-tst-quote> 8825 "Great system! <mark>Highly recommend</mark>" 8826 </blockquote> 8827 8828 8829 <footer class="tst-foot"> 8830 <div class="tst-init" aria-hidden="true">LB</div> 8831 <div> 8832 <div class="tst-name">Lance B.</div> 8833 <div class="tst-role">Google review</div> 8834 </div> 8835 </footer> 8836 </article> 8837 </div> 8838 8839 <div class="tst-controls"> 8840 <button type="button" class="tst-arrow" data-tst-prev aria-label="Previous reviews">←</button> 8841 <div class="tst-dots" data-tst-dots role="tablist" aria-label="Review pages"></div> 8842 <button type="button" class="tst-arrow" data-tst-next aria-label="Next reviews">→</button> 8843 </div> 8844 </div> 8845 8846 8847 <p class="r tst-more"> 8848 <a href="https://g.page/r/CXXh1vkRspV_EAE" target="_blank" rel="noopener">Read them on Google <span class="arr">→</span></a> 8849 </p> 8850</section> 8851 8852 8853 8854 <section class="shell" id="journal-strip"> 8855 <div class="section-hd"> 8856 <h2 class="r">Latest from the <span class="it">journal.</span></h2> 8857 <p class="lede r r-1">Real numbers, real call recordings, and plain-English playbooks. One useful piece a week, no fluff.</p> 8858 </div> 8859 <div class="r" style="display:grid;grid-template-columns:repeat(3,1fr);gap:24px" id="home-journal-grid"> 8860 <a href="https://talkify.nz/blog/where-does-your-ai-receptionist-send-your-calls" class="post-card"> 8861 <div class="post-hero" style="background-image:url('https://talkify.nz/media/frontend/blog/where-does-your-ai-receptionist-send-your-calls.jpg')"></div> 8862 <div class="post-body"> 8863 <div class="post-meta">Guides · 7 min</div> 8864 <h3 class="post-title">Where does your AI receptionist actually send your calls?</h3> 8865 <p class="post-excerpt">The AI receptionist market is being flooded, and most of the flood is thin. Here is what actually sits underneath these things, wh...</p> 8866 <div class="post-foot">13 Sep 2026 <span>Read â</span></div> 8867 </div> 8868 </a> 8869 <a href="https://talkify.nz/blog/one-calendar-for-your-whole-team" class="post-card"> 8870 <div class="post-hero" style="background-image:url('https://talkify.nz/media/frontend/blog/one-calendar-for-your-whole-team.jpg')"></div> 8871 <div class="post-body"> 8872 <div class="post-meta">Product · 5 min</div> 8873 <h3 class="post-title">One calendar for your whole team, and proof of where every booking went</h3> 8874 <p class="post-excerpt">Talkify now has a Calendar. Every diary in your business on one screen, what your agent booked while you were on the tools, and pr...</p> 8875 <div class="post-foot">4 Sep 2026 <span>Read â</span></div> 8876 </div> 8877 </a> 8878 <a href="https://talkify.nz/blog/best-ai-receptionist-nz" class="post-card"> 8879 <div class="post-hero" style="background-image:url('https://talkify.nz/media/frontend/blog/best-ai-receptionist-nz.jpg')"></div> 8880 <div class="post-body"> 8881 <div class="post-meta">Guides · 7 min</div> 8882 <h3 class="post-title">The best AI receptionists in New Zealand (2026), ranked by one of them</h3> 8883 <p class="post-excerpt">Every "best AI receptionist NZ" ranking is either an overseas content farm recommending American services or a vendor putt
8883ing itse...</p> 8884 <div class="post-foot">25 Aug 2026 <span>Read â</span></div> 8885 </div> 8886 </a> 8887 </div> 8888 <div class="r" style="text-align:center;margin-top:36px"> 8889 <a href="https://talkify.nz/blog" class="btn btn-ghost btn-lg">Read the whole journal <span class="arr">â</span></a> 8890 </div> 8891 <style> 8892 /* V2 design language: top-ruled columns with the photograph under the rule, 8893 rather than filled cards that lift on hover. The rule fills with the 8894 brand gradient on hover, which is the whole affordance. */ 8895 #home-journal-grid .post-card{position:relative;display:flex;flex-direction:column;padding-top:22px;text-decoration:none;color:inherit} 8896 #home-journal-grid .post-card::before, 8897 #home-journal-grid .post-card::after{content:"";position:absolute;top:0;left:0;right:0;height:1px} 8898 #home-journal-grid .post-card::before{background:var(--line-2)} 8899 #home-journal-grid .post-card::after{background:var(--grad);transform:scaleX(0);transform-origin:left;transition:transform .5s var(--ease-out)} 8900 #home-journal-grid .post-card:hover::after{transform:scaleX(1)} 8901 #home-journal-grid .post-card:hover .post-title{color:var(--signal)} 8902 #home-journal-grid .post-hero{aspect-ratio:16/10;background-size:cover;background-position:center} 8903 #home-journal-grid .post-body{padding:20px 0 0;display:flex;flex-direction:column;gap:12px;flex:1} 8904 #home-journal-grid .post-title{transition:color .3s var(--ease)} 8905 #home-journal-grid .post-meta{font-family:var(--mono);font-size:10px;color:var(--mute);letter-spacing:.16em;text-transform:uppercase} 8906 #home-journal-grid .post-title{font-family:var(--serif);font-weight:400;font-size:22px;line-height:1.15;letter-spacing:-.01em;color:var(--paper)} 8907 #home-journal-grid .post-excerpt{color:var(--bone);font-size:14px;line-height:1.55;flex:1} 8908 #home-journal-grid .post-foot{font-family:var(--mono);font-size:11px;color:var(--mute);letter-spacing:.06em;border-top:1px dashed var(--line);padding-top:14px;display:flex;justify-content:space-between;align-items:center} 8909 #home-journal-grid .post-foot span{color:var(--signal)} 8910 @media (max-width:1100px){ #home-journal-grid{grid-template-columns:1fr !important} } 8911 </style> 8912</section> 8913 8914 <section class="shell" id="faq"> 8915 <div class="section-hd"> 8916 <h2 class="r">Frequently <span class="it">asked.</span></h2> 8917 8918 <p class="lede r r-1">The questions we hear most. If yours isn't here, ring our live demo agent on 03 242 1262, it'll either answer or queue a callback from a human.</p> 8919 </div> 8920 8921 <div class="r faq-list" id="faq-grid"> 8922 <details class="faq-q"> 8923 <summary> 8924 <span class="faq-n" aria-hidden="true">01</span> 8925 <span class="faq-t">What is an AI receptionist?</span> 8926 <span class="faq-icon" aria-hidden="true">+</span> 8927 </summary> 8928 <div class="faq-a">An AI receptionist is software that answers your business phone in a natural human voice. It greets callers, answers questions about your business, books appointments into your calendar, takes detailed messages and transfers urgent calls to a real person. Unlike voicemail it holds a real conversation, and unlike a person it answers every call at once, 24 hours a day. Talkify is an AI receptionist built in Christchurch for New Zealand businesses.</div> 8929 </details> 8930 <details class="faq-q"> 8931 <summary> 8932 <span class="faq-n" aria-hidden="true">02</span> 8933 <span class="faq-t">What is an AI Phone Agent?</span> 8934 <span class="faq-icon" aria-hidden="true">+</span> 8935 </summary> 8936 <div class="faq-a">An AI Phone Agent is a voice-powered AI that answers your business calls 24/7. It sounds natural and human-like, can answer questions about your business, book appointments, qualify leads, and forward messages via SMS or email. Think of it as a virtual receptionist that never sleeps.</div> 8937 </details> 8938 <details class="faq-q"> 8939 <summary> 8940 <span class="faq-n" aria-hidden="true">03</span> 8941 <span class="faq-t">Is Talkify a voice assistant for business?</span>
8942 <span class="faq-icon" aria-hidden="true">+</span> 8943 </summary> 8944 <div class="faq-a">Yes. Talkify is an AI voice assistant that answers your business phone 24/7, in real New Zealand and Australian voices. It books callers straight into your calendar and texts you the summary the moment the call ends. There is no hardware and no new handset: it works by forwarding your existing business number, so you are running in minutes.</div> 8945 </details> 8946 <details class="faq-q"> 8947 <summary> 8948 <span class="faq-n" aria-hidden="true">04</span> 8949 <span class="faq-t">How does Talkify work with my existing phone number?</span> 8950 <span class="faq-icon" aria-hidden="true">+</span> 8951 </summary> 8952 <div class="faq-a">Talkify works via call forwarding. You set up your existing business number to forward to your Talkify number when you can't answer (busy, after-hours, or always). No hardware changes, no number porting, no IT project.</div> 8953 </details> 8954 <details class="faq-q"> 8955 <summary> 8956 <span class="faq-n" aria-hidden="true">05</span> 8957 <span class="faq-t">Can the AI agent book appointments into my calendar?</span> 8958 <span class="faq-icon" aria-hidden="true">+</span> 8959 </summary> 8960 <div class="faq-a">Yes. Talkify books into Google Calendar, Microsoft Outlook, Calendly, Zenoti, GymMaster and Cliniko and sends booking requests into MechanicDesk and Workshop Software for the workshop to accept. It syncs contacts and outcomes to HubSpot and GoHighLevel. Other systems can be wired up on a custom setup. The agent checks live availability, books, reschedules, and texts confirmation to the caller automatically.</div> 8961 </details> 8962 <details class="faq-q"> 8963 <summary> 8964 <span class="faq-n" aria-hidden="true">06</span> 8965 <span class="faq-t">How much does Talkify cost?</span> 8966 <span class="faq-icon" aria-hidden="true">+</span> 8967 </summary> 8968 <div class="faq-a">Business agents are on the Broadcast plan: $129/month at the founding rate for your first 3 months, then $199. The Personal Assistant (Shortwave) is different: it answers one person's own mobile or landline, not a business, and is $89/month. Fleet is custom-priced for multi-location and contact-centre operators. Shortwave includes 50 minutes a month and Broadcast 200; extra minutes are 10c each for your first 3 months, then 20c. The first 20 texts every month are free, then 9c each. No setup fee, no lock-in.</div> 8969 </details> 8970 <details class="faq-q"> 8971 <summary> 8972 <span class="faq-n" aria-hidden="true">07</span> 8973 <span class="faq-t">Does the AI sound robotic?</span> 8974 <span class="faq-icon" aria-hidden="true">+</span> 8975 </summary> 8976 <div class="faq-a">Not at all. Talkify uses state-of-the-art voice AI that sounds remarkably natural. Most callers don't realise they're speaking with an AI. You can choose from 32 voices, clone your own voice (Broadcast/Fleet plans), and tune the tone (corporate, warm, playful) to match your brand.</div> 8977 </details> 8978 <details class="faq-q"> 8979 <summary> 8980 <span class="faq-n" aria-hidden="true">08</span> 8981 <span class="faq-t">What languages does Talkify support?</span> 8982 <span class="faq-icon" aria-hidden="true">+</span> 8983 </summary> 8984 <div class="faq-a">Talkify handles 32 languages out of the box including English (NZ, AU, US, GB), te reo MÄori, Mandarin, Spanish, Hindi, Japanese, German and French. Agents detect the caller's language and switch on the fly, useful for New Zealand's diverse customer base.</div> 8985 </details> 8986 <details class="faq-q"> 8987 <summary> 8988 <span class="faq-n" aria-hidden="true">09</span> 8989 <span class="faq-t">Can I train the AI on my specific business information?</span> 8990 <span class="faq-icon" aria-hidden="true">+</span> 8991 </summary> 8992 <div class="faq-a">Absolutely. Drop in your services, hours, pricing, FAQs and escalation rules and the agent learns it all. The dashboard ships a live prompt editor, tweak any wording, escalation rule or opening hour and it goes live in seconds.</div> 8993 </details> 8994 <details class="faq-q"> 8995 <summary>
8996 <span class="faq-n" aria-hidden="true">10</span> 8997 <span class="faq-t">How much does an AI receptionist cost in NZ?</span> 8998 <span class="faq-icon" aria-hidden="true">+</span> 8999 </summary> 9000 <div class="faq-a">Talkify business agents are $129/month at the founding rate for your first 3 months, then $199, including 200 minutes of calls, with extra minutes from 10c. There is no setup fee and no lock-in. For comparison, an employed receptionist in NZ costs roughly $55,000 to $65,000 a year before KiwiSaver, ACC and leave, and human answering services typically run $200 to $500 a month at real call volumes once per-call charges are counted.</div> 9001 </details> 9002 <details class="faq-q"> 9003 <summary> 9004 <span class="faq-n" aria-hidden="true">11</span> 9005 <span class="faq-t">What is the difference between an AI receptionist and a virtual receptionist?</span> 9006 <span class="faq-icon" aria-hidden="true">+</span> 9007 </summary> 9008 <div class="faq-a">A virtual receptionist is usually a person in a call centre answering for many businesses during business hours, billed per call or per minute. An AI receptionist answers instantly at any hour, handles every caller at once, never bills you more because you had a busy week, and books the job while the caller is still on the line instead of handing you a message to chase. We compare the two honestly, including when a human service is the better fit, on our virtual receptionist page.</div> 9009 </details> 9010 <details class="faq-q"> 9011 <summary> 9012 <span class="faq-n" aria-hidden="true">12</span> 9013 <span class="faq-t">What happens when a call is too complex for the AI?</span> 9014 <span class="faq-icon" aria-hidden="true">+</span> 9015 </summary> 9016 <div class="faq-a">It transfers the call to you or your team, with context. You set the rules: emergencies, VIP clients or anything you flag gets warm-transferred or texted to your mobile within seconds, with the caller's name, number and the gist of what they need. Everything else is handled without interrupting you.</div> 9017 </details> 9018 <details class="faq-q"> 9019 <summary> 9020 <span class="faq-n" aria-hidden="true">13</span> 9021 <span class="faq-t">Where is my data stored?</span> 9022 <span class="faq-icon" aria-hidden="true">+</span> 9023 </summary> 9024 <div class="faq-a">All audio, transcripts and call metadata are stored in NZ data centres, encrypted at rest with AES-256. Detailed compliance documentation available on request. Built for operators (legal, accounting, healthcare) where data residency matters.</div> 9025 </details> 9026 <details class="faq-q"> 9027 <summary> 9028 <span class="faq-n" aria-hidden="true">14</span> 9029 <span class="faq-t">Is there a free trial or demo?</span> 9030 <span class="faq-icon" aria-hidden="true">+</span> 9031 </summary> 9032 <div class="faq-a">Yes, three ways. Ring us on 03 242 1262 any time and one of our own agents answers, so you can hear exactly how it handles a real caller. Click the chat widget on this page to talk to Talky right now. Or sign up at the form below and we'll wire up a dedicated demo number for your business, no card needed.</div> 9033 </details> 9034 </div> 9035 9036 <style> 9037 /* V2 design language: a ruled list, not a grid of boxed cards. Each row is 9038 a hairline, a mono index, the question in serif, and a bare + opposite. 9039 The old version was two columns of rounded, filled panels each with the 9040 + in a circular badge, which is the card furniture the V2 homepage does 9041 without. One column because a ruled list has to read down a single 9042 measure; two columns of rules would fight each other across the gutter. */ 9043 .faq-list { margin-top: 44px; border-bottom: 1px solid var(--line-2) } 9044 9045 .faq-q { border-top: 1px solid var(--line-2) } 9046 9047 .faq-q summary { 9048 display: grid; 9049 grid-template-columns: 54px 1fr auto; 9050 align-items: center; 9051 gap: clamp(12px, 2vw, 24px); 9052 padding: 24px clamp(4px, 1vw, 12px); 9053 cursor: pointer; 9054 list-style: none; 9055 transition: background .3s var(--ease) 9056 } 9057 9058 .faq-q::-webkit-details-marker, .faq-q summary::-webkit-details-marker { display: none } 9059 .faq-q summary::marker { content: "" } 9060 9061 .faq-n { 9062 font-family: var(--mono); 9063 font-size: 11px; 9064 letter-spacing: .14em; 9065 color: var(--mute-2) 9066 } 9067 9068 .faq-t { 9069 font-family: var(--serif); 9070 font-weight: 400; 9071 font-size: clamp(17px, 1.7vw, 22px); 9072 line-height: 1.28; 9073 letter-spacing: -.01em; 9074 color: var(--paper); 9075 transition: color .3s var(--ease) 9076 } 9077 9078 .faq-icon { 9079 font-family: var(--mono); 9080 font-size: 17px; 9081 line-height: 1; 9082 color: var(--mute);
9083 transition: transform .3s var(--ease-out), color .3s var(--ease) 9084 } 9085 9086 .faq-q:hover summary { background: var(--surface-2) } 9087 .faq-q:hover .faq-t { color: var(--signal) } 9088 .faq-q:hover .faq-icon { color: var(--signal) } 9089 9090 .faq-q[open] .faq-icon { transform: rotate(45deg); color: var(--signal) } 9091 .faq-q[open] .faq-n { color: var(--signal) } 9092 9093 .faq-a { 9094 padding: 0 clamp(4px, 1vw, 12px) 28px calc(54px + clamp(12px, 2vw, 24px)); 9095 max-width: 76ch; 9096 color: var(--bone); 9097 font-size: 14.5px; 9098 line-height: 1.68 9099 } 9100 9101 .faq-q summary:focus { outline: none } 9102 .faq-q summary:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px } 9103 9104 @media (prefers-reduced-motion: reduce) { 9105 .faq-q summary, .faq-t, .faq-icon { transition: none } 9106 } 9107 9108 @media (max-width: 640px) { 9109 .faq-q summary { grid-template-columns: 34px 1fr auto } 9110 .faq-a { padding-left: calc(34px + 12px) } 9111 } 9112 </style> 9113</section> 9114 9115 9116 <section class="shell" id="how-it-works" style="padding-top:0"> 9117 <div class="section-hd"> 9118 <h2 class="r">Plug in. Forward calls. <span class="it">Go quiet.</span></h2> 9119 <p class="lede r r-1">No hardware, no port-out, no IT project. Forward your existing line and the 9120 agent goes live fully briefed and fully on-brand, usually the same afternoon.</p> 9121 </div> 9122 9123 <div class="ruled-index r"> 9124 <div class="ruled-row"> 9125 <span class="num">01</span> 9126 <span class="name">Brief it</span> 9127 <span class="desc">Drop in your business knowledge: opening hours, services, pricing, FAQs and 9128 escalation paths. We bake it into your agent's voice, in your words.</span> 9129 </div> 9130 <div class="ruled-row"> 9131 <span class="num">02</span> 9132 <span class="name">Forward your number</span> 9133 <span class="desc">Point your existing business number at the Talkify number we issue. It is call 9134 forwarding, so there is no port-out, no hardware and no new handset, and it is reversible any 9135 time you want the line back.</span> 9136 </div> 9137 <div class="ruled-row"> 9138 <span class="num">03</span> 9139 <span class="name">Operate</span> 9140 <span class="desc">Watch calls happen in real time on the dashboard, edit the prompt on the fly, and 9141 read the transcript and summary of every call the moment it ends.</span> 9142 </div> 9143 </div> 9144 </section> 9145 9146 <section class="endcta endcta-has-form" id="endcta"> 9147 <div class="endcta-photo" aria-hidden="true"></div> 9148 9149 9150 <div class="endcta-wrap" id="signup"> 9151 <div class="endcta-pitch"> 9152 <div class="stamp">TWO WAYS TO HEAR THE AGENT</div> 9153 <h2>Don't read about it.<br><span class="it">Talk to it.</span></h2> 9154 9155 <div class="endcta-numbers"> 9156 <a href="tel:+6432421262" class="num-big" data-talkify-agent="default" 9157 title="Hear the agent yourself"> 9158 <span class="ic ic-demo"> 9159 <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" 9160 stroke-linecap="round"><path 9161 d="M3 5a2 2 0 012-2h2.5a1 1 0 01.96.73l1.2 4.2a1 1 0 01-.5 1.16l-1.94.97a11 11 0 005.7 5.7l.97-1.94a1 1 0 011.16-.5l4.2 1.2a1 1 0 01.73.96V19a2 2 0 01-2 2A16 16 0 013 5z"/></svg> 9162 </span> 9163 <span> 9164 <small>Hear it yourself · our AI agent, 24/7 · ask it anything</small> 9165 03 242 1262 9166 </span> 9167 </a> 9168 9169 <a href="tel:+64800002967" class="num-big num-blue" title="Sign up, sales and support"> 9170 <span class="ic ic-signup"> 9171 <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" 9172 stroke-linecap="round"><path 9173 d="M16 21v-2a4 4 0 00-4-4H6a4 4 0 00-4 4v2M9 11a4 4 0 100-8 4 4 0 000 8zM19 8v6M22 11h-6"/></svg> 9174 </span>
9175 <span> 9176 <small>Sign up, sales & support · we'll set you up</small> 9177 0800 002 967 9178 </span> 9179 </a> 9180 </div> 9181 9182 <div class="endcta-meta"> 9183 <span>â No card</span><span>â No lock-in</span><span>â Free to call</span><span>â The demo line can sign you up too</span> </div> 9184 9185 9186 <div class="endcta-alt"> 9187 <a href="sms:+64272048827" class="btn btn-ghost btn-lg" 9188 title="Text us instead of ringing"> 9189 <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" 9190 stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" style="flex:none"> 9191 <path d="M21 11.5a8.4 8.4 0 01-9 8.4 9.5 9.5 0 01-2.6-.4L3 21l1.6-4.2A8.2 8.2 0 013 11.5 8.4 8.4 0 0112 3a8.4 8.4 0 019 8.5z"/> 9192 </svg> 9193 Text our agent · 027 204 8827 </a> 9194 </div> 9195 9196 9197 <p class="endcta-app-line">Or run it from your pocket</p> 9198 <div class="app-stores" style="--app-badge-h: 46px"> 9199 <a class="app-badge" href="https://apps.apple.com/nz/app/talkify-mobile/id6766709308" 9200 target="_blank" rel="noopener"> 9201 <img src="https://talkify.nz/media/branding/apple-app-store.svg" 9202 alt="Download Talkify Mobile on the App Store" 9203 width="137.6" height="46" loading="lazy"> 9204 </a> 9205 <a class="app-badge" href="https://play.google.com/store/apps/details?id=com.talkifynz.app" 9206 target="_blank" rel="noopener"> 9207 <img src="https://talkify.nz/media/branding/google-app-store.svg" 9208 alt="Get Talkify Mobile on Google Play" 9209 width="155.3" height="46" loading="lazy"> 9210 </a> 9211</div> 9212 </div> 9213 9214 <div class="endcta-form"> 9215 9216 <span class="eyebrow"><span class="pin"></span>Get your first agent · No card needed </span> 9217 9218 <form method="POST" action="https://talkify.nz/contact" class="form"> 9219 <input type="hidden" name="_token" value="2cZHQjhlrpDk2bAxkNOtWyU4l8TAY6RFoVgytF3j" autocomplete="off"> <div class="row"> 9220 <div class="field"> 9221 <label>Your name</label> 9222 <input type="text" name="name" required placeholder="Your full name" autocomplete="name" value=""> 9223 </div> 9224 <div class="field"> 9225 <label>Company</label> 9226 <input type="text" name="company" required placeholder="Your company" autocomplete="organization" value=""> 9227 </div> 9228 </div> 9229 <div class="row"> 9230 <div class="field"> 9231 <label>Email</label> 9232 <input type="email" name="email" required placeholder="Your email" autocomplete="email" value=""> 9233 </div> 9234 <div class="field"> 9235 <label>Mobile (NZ)</label> 9236 <input type="tel" name="phone" required placeholder="Your mobile" autocomplete="tel" value=""> 9237 </div> 9238 </div> 9239 <div class="field"> 9240 <label for="country-signup">Country</label> 9241 <select name="country" id="country-signup" required data-country-select autocomplete="country"> 9242 <option value="" disabled selected>Select your country</option> 9243 <option value="NZ" >New Zealand</option> 9244 <option value="AU" >Australia</option> 9245 </select> 9246 <p style="margin-top:8px;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--mute)"> 9247 Talkify is currently available to businesses in New Zealand & Australia only. 9248 </p> 9249</div> 9250 9251 9252<div aria-hidden="true" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0"> 9253 <input type="text" name="company_reference" tabindex="-1" autocomplete="off" value="" aria-hidden="true"> 9254</div> 9255
9256<script> 9257(function () { 9258 var script = document.currentScript; 9259 var form = script && script.closest('form'); 9260 if (!form) return; 9261 var select = form.querySelector('select[name="country"]'); 9262 if (!select || select.value) return; // respect old() / a choice already made 9263 9264 try { 9265 var tz = (Intl.DateTimeFormat().resolvedOptions().timeZone || '').toLowerCase(); 9266 var lang = (navigator.language || '').toLowerCase(); 9267 var code = null; 9268 9269 if (tz.indexOf('auckland') >= 0 || tz.indexOf('chatham') >= 0 || lang === 'en-nz' || lang === 'mi') { 9270 code = 'NZ'; 9271 } else if (tz.indexOf('australia/') >= 0 || lang === 'en-au') { 9272 code = 'AU'; 9273 } 9274 9275 if (code) select.value = code; 9276 } catch (e) { /* detection is best-effort */ } 9277})(); 9278</script>
9278 9279 <div class="field"> 9280 <label>Pick your agent</label> 9281 <div class="radios"> 9282 <label class="radio"><input type="radio" name="agent_type" value="assistant" data-plan-key="assistant"><span class="dot"></span><div><div class="ttl">Personal Assistant</div><div class="sub">One mobile or landline. Personal use.</div></div></label> 9283 <label class="radio"><input type="radio" name="agent_type" value="reception" checked data-plan-key="reception"><span class="dot"></span><div><div class="ttl">Reception</div><div class="sub">24/7 call answering for a business</div></div></label> 9284 <label class="radio"><input type="radio" name="agent_type" value="sales" data-plan-key="sales"><span class="dot"></span><div><div class="ttl">Sales Agent</div><div class="sub">Inbound qualifier, CRM-synced</div></div></label> 9285 <label class="radio"><input type="radio" name="agent_type" value="booking" data-plan-key="booking"><span class="dot"></span><div><div class="ttl">Booking Service</div><div class="sub">Live calendar, conflict-aware</div></div></label> 9286 <label class="radio"><input type="radio" name="agent_type" value="outgoing" data-plan-key="outgoing"><span class="dot"></span><div><div class="ttl">Outgoing Agent</div><div class="sub">Your agent does the ringing, billed per call</div></div></label> 9287 <label class="radio"><input type="radio" name="agent_type" value="survey" data-plan-key="survey"><span class="dot"></span><div><div class="ttl">Campaign Agent</div><div class="sub">Rings your list, asks your questions, billed per call</div></div></label> 9288 <label class="radio"><input type="radio" name="agent_type" value="wellness" data-plan-key="wellness"><span class="dot"></span><div><div class="ttl">Wellness Checks</div><div class="sub">Rings someone daily to check they're alright</div></div></label> 9289 </div> 9290 <p class="plan-recommend" data-plan-recommend style="display:none"> 9291 We recommend running an incoming agent alongside an outgoing or campaign agent. People you ring will often ring you 9292 back, and an incoming agent makes sure those return calls are answered rather than missed. If you would 9293 rather not add one, we can clone your business caller ID so return calls come straight back to your 9294 existing phone. 9295 </p> 9296 </div> 9297 9298 <div class="field"> 9299 <label>How you want to pay</label> 9300 <div class="radios"> 9301 <label class="radio"> 9302 <input type="radio" name="plan" value="broadcast" checked> 9303 <span class="dot"></span> 9304 <div><div class="ttl">Monthly plan</div><div class="sub">A set monthly price with included minutes. Most people choose this. Cancel anytime.</div></div> 9305 </label> 9306 <label class="radio"> 9307 <input type="radio" name="plan" value="payg" > 9308 <span class="dot"></span> 9309 <div><div class="ttl">Pay as you go</div><div class="sub">$1 a minute and 15c a text, prepaid from a balance. $10/month covers your phone number, and you start with $10 of free credit on top. Cancel anytime.</div></div> 9310 </label> 9311 </div> 9312 </div> 9313 9314 <div class="plan-display" data-plan-display> 9315 <div class="plan-display-left"> 9316 <div class="plan-display-label" data-plan-label>Personal Assistant</div> 9317 <div class="plan-display-sub" data-plan-sub>Single mobile or landline. Built for one person, not a business.</div> 9318 </div> 9319 <div class="plan-display-right"> 9320 <div class="plan-display-price" data-plan-price>$89<small>/mo</small></div> 9321 <div class="plan-display-tier" data-plan-tier>Shortwave plan</div> 9322 <div class="plan-display-note" data-plan-note style="display:none" ></div> 9323 </div> 9324 </div> 9325 <p class="founding-line">
9326 <span class="fl-tag">Founding rate</span> On a monthly plan your price is locked in at the founding rate for your first 3 months, then the standard rate applies. Pay as you go has no founding step: the rate is just the rate. 9327 Plans include 50 to 200 minutes a month, then 10c a minute. The first 20 texts each month are free, then 9c each. 9328 </p> 9329 <p class="plan-asterisk" data-plan-asterisk style="display:none"> 9330 <span>*</span> Subject to your CRM or booking system. Additional implementation cost may apply for non-standard integrations. 9331 </p> 9332 9333 <div class="actions"> 9334 <span class="note">â Your data stays in NZ.</span> 9335 <button type="submit" class="btn btn-primary btn-lg">Create your first agent <span class="arr">â</span></button> 9336 </div> 9337 </form> 9338 9339
9339<script> 9340 (function () { 9341 // A plan only carries a crossed-out "was" price and a founding note while 9342 // its intro price is genuinely below its standard price; when the two 9343 // match in the pricing table both come through blank and the picker 9344 // shows a plain price. Per-call plans never have a founding step. 9345 const PA_NOTE = ""; 9346 const BIZ_NOTE = "Founding rate for your first 3 months, then $199/mo"; 9347 const PA_WAS = ""; 9348 const BIZ_WAS = "$199"; 9349 9350 const PLANS = { 9351 assistant: { label: 'Personal Assistant', sub: 'Single mobile or landline. Built for one person, not a business.', was: PA_WAS, price: '$89', suffix: '/mo', tier: 'Shortwave plan · personal use only', note: PA_NOTE, asterisk: false }, 9352 reception: { label: 'Reception', sub: '24/7 AI call answering for your business. Bundled with Sales on the Broadcast plan.', was: BIZ_WAS, price: '$129', suffix: '/mo', tier: 'Broadcast plan · includes Sales Agent', note: BIZ_NOTE, asterisk: false }, 9353 sales: { label: 'Sales Agent', sub: 'Inbound lead qualification with CRM sync. Bundled with Reception on the Broadcast plan.', was: BIZ_WAS, price: '$129', suffix: '/mo', tier: 'Broadcast plan · includes Reception *', note: BIZ_NOTE, asterisk: true }, 9354 booking: { label: 'Booking Service', sub: 'Live calendar booking into your booking system, with custom API integration where needed.', was: '', price: 'from $499', suffix: '/mo', tier: 'Custom setup · 12-month contract *', note: 'Quoted per build, on a 12-month term.', asterisk: true }, 9355 outgoing: { label: 'Outgoing Agent', sub: 'Your agent makes the calls: follow-ups, appointment reminders, confirmations and callbacks. It rings out on a Talkify number, or we can show your own business caller ID instead.', was: '', price: '$59', suffix: '/mo', tier: 'Outgoing campaigns · 20 minutes included, then 50c/min', note: 'Charged only in months you run campaigns. One-off calls outside a campaign are just 50c a minute, no monthly fee.', asterisk: false, recommend: true }, 9356 survey: { label: 'Campaign Agent', sub: 'Import your list and the agent rings everyone, asks your questions and reads each conversation against your goal, so you get answers, sentiment and hot leads by name.', was: '', price: '$59', suffix: '/mo', tier: 'Outgoing campaigns · 20 minutes included, then 50c/min', note: 'Marketing runs and phone surveys are the same plan, charged only in months you run one.', asterisk: false, recommend: true }, 9357 wellness: { label: 'Wellness Checks', sub: 'Scheduled or randomly timed check-in calls to somebody living alone. The agent asks how they are, gives medication and appointment reminders, texts you after every call and escalates down your contact list when nobody answers.', was: '', price: 'from $59', suffix: '/mo', tier: 'Family Member (one person) · $599 for as many as you like', note: 'Includes 20 call minutes, or 200 pooled minutes on Providers. Priced by how many people are rung, not by features.', asterisk: false }, 9358 }; 9359 // The pay-as-you-go face of the same picker: whatever agent they chose, 9360 // the money side is the per-minute wallet, so the price panel follows 9361 // the payment choice rather than quoting a monthly plan. 9362 const PAYG = { 9363 price: '$1', 9364 suffix: '/min', 9365 tier: 'Pay as you go · $10/month covers your phone number', 9366 note: '$10 free credit to start, on top of the number. Calls and texts come off your prepaid balance.', 9367 }; 9368 const form = document.currentScript.closest('.endcta-form') || document; 9369 const radios = form.querySelectorAll('input[name="agent_type"]'); 9370 const payRadios = form.querySelectorAll('input[name="plan"]'); 9371 const labelEl = form.querySelector('[data-plan-label]'); 9372 const subEl = form.querySelector('[data-plan-sub]'); 9373 const priceEl = form.querySelector('[data-plan-price]'); 9374 const tierEl = form.querySelector('[data-plan-tier]'); 9375 const noteEl = form.querySelector('[data-plan-note]'); 9376 const astEl = form.querySelector('[data-plan-asterisk]'); 9377 const recEl = form.querySelector('[data-plan-rec
9377ommend]'); 9378 9379 function update(){ 9380 const checked = form.querySelector('input[name="agent_type"]:checked'); 9381 if (!checked) return; 9382 const plan = PLANS[checked.value]; 9383 if (!plan) return; 9384 const pay = form.querySelector('input[name="plan"]:checked'); 9385 const payg = pay && pay.value === 'payg'; 9386 labelEl.textContent = plan.label; 9387 subEl.textContent = plan.sub; 9388 priceEl.innerHTML = payg 9389 ? PAYG.price + '<small>' + PAYG.suffix + '</small>' 9390 : (plan.was ? '<s class="was-price">'+plan.was+'</s> ' : '') + plan.price + (plan.suffix ? '<small>'+plan.suffix+'</small>' : ''); 9391 tierEl.textContent = payg ? PAYG.tier : plan.tier; 9392 if (noteEl) { 9393 const note = payg ? PAYG.note : (plan.note || ''); 9394 noteEl.textContent = note; 9395 noteEl.style.display = note ? 'block' : 'none'; 9396 } 9397 astEl.style.display = (!payg && plan.asterisk) ? 'block' : 'none'; 9398 if (recEl) recEl.style.display = plan.recommend ? 'block' : 'none'; 9399 } 9400 radios.forEach(r => r.addEventListener('change', update)); 9401 payRadios.forEach(r => r.addEventListener('change', update)); 9402 update(); 9403 })(); 9404 </script>
9404 9405 </div> 9406 </div> 9407 9408 <style> 9409 /* Two top-ruled columns rather than two pills side by side. The pair is 9410 held to a readable measure and centred under the headline, so the 9411 block still reads as the close of the page even though the section 9412 itself is centred and these two are ruled and left-aligned. */ 9413 .endcta-numbers { 9414 display: grid; 9415 grid-template-columns: 1fr 1fr; 9416 gap: clamp(24px, 4vw, 56px); 9417 margin: 56px auto 0; 9418 max-width: 780px; 9419 text-align: left 9420 } 9421 9422 @media (max-width: 800px) { 9423 .endcta-numbers { 9424 grid-template-columns: 1fr; 9425 gap: 30px; 9426 max-width: 460px 9427 } 9428 } 9429 9430 .endcta-alt { 9431 margin-top: 36px; 9432 display: flex; 9433 flex-wrap: wrap; 9434 gap: 12px; 9435 justify-content: center 9436 } 9437 9438 /* The app line sits under the two ways to reach us and quieter than 9439 either, because it is aimed at people who have already signed up. */ 9440 .endcta-app-line { 9441 margin-top: 40px; 9442 font-family: var(--mono); 9443 font-size: 10px; 9444 letter-spacing: .18em; 9445 text-transform: uppercase; 9446 color: var(--mute) 9447 } 9448 9449 .endcta .app-stores { 9450 margin-top: 14px; 9451 justify-content: center 9452 } 9453 9454 /* ââ With the form in it âââââââââââââââââââââââââââââââââââââââââââ 9455 The pitch stops being a centred banner and becomes the left half 9456 of one closing block, with the get-started form on the right. No 9457 panel and no rounding: the two columns simply share the page. */ 9458 .endcta-has-form .endcta-wrap { 9459 display: grid; 9460 grid-template-columns: 1fr 1.05fr; 9461 gap: clamp(40px, 5vw, 76px); 9462 align-items: start; 9463 max-width: 1240px; 9464 margin: 0 auto; 9465 text-align: left 9466 } 9467 9468 /* The skyline sits behind a short centred banner comfortably. Behind 9469 a block three times as tall it runs up under the form fields and 9470 the price panel, where a photograph is just noise, so it is held 9471 well back and the scrim is carried the whole way down instead of 9472 fading out in the middle. */ 9473 .endcta.endcta-has-form .endcta-photo { 9474 opacity: .12; 9475 background-position: center bottom 9476 } 9477 9478 html[data-theme="light"] .endcta.endcta-has-form .endcta-photo { 9479 opacity: .16 9480 } 9481 9482 .endcta.endcta-has-form .endcta-photo::after { 9483 background: linear-gradient(180deg, var(--scrim-mid) 0%, var(--scrim-strong) 30%, var(--scrim-strong) 100%) 9484 } 9485 9486 .endcta-has-form .endcta-numbers { 9487 grid-template-columns: 1fr; 9488 gap: 26px; 9489 margin: 44px 0 0; 9490 max-width: none 9491 } 9492 9493 .endcta-has-form .endcta-meta { 9494 justify-content: flex-start; 9495 gap: 22px 9496 } 9497 9498 .endcta-has-form .endcta-alt, 9499 .endcta-has-form .app-stores { 9500 justify-content: flex-start 9501 } 9502 9503 .endcta-form .eyebrow { 9504 display: inline-flex; 9505 margin-bottom: 20px 9506 } 9507 9508 @media (max-width: 1000px) { 9509 .endcta-has-form .endcta-wrap { 9510 grid-template-columns: 1fr; 9511 gap: 48px 9512 } 9513 9514 .endcta-has-form .endcta-numbers { 9515 max-width: 460px 9516 } 9517 } 9518 9519 /* Carried over from the signup section this block absorbed: that 9520 partial's styles only ship on the page that includes it, and it 9521 is now only included by /v2. */ 9522 .signup-errors { 9523 margin-bottom: 18px; 9524 padding: 14px 0 14px 16px; 9525 border-left: 2px solid var(--coral); 9526 font-family: var(--mono); 9527 font-size: 12px; 9528 line-height: 1.6; 9529 color: var(--paper) 9530 } 9531 9532 .was-price { 9533 font-size: .55em; 9534 color: var(--mute-2); 9535 text-decoration: line-through; 9536 text-decoration-color: var(--coral); 9537 margin-right: 4px; 9538 font-weight: 300 9539 } 9540 9541 .founding-line { 9542 margin-top: 14px; 9543 font-family: var(--sans); 9544 font-size: 12px; 9545 line-height: 1.55; 9546 color: var(--mute) 9547 } 9548 9549 .founding-line .fl-tag { 9550 font-family: var(--mono); 9551 font-size: 10px; 9552 letter-spacing: .14em; 9553 text-transform: uppercase; 9554 color: var(--signal); 9555 margin-right: 8px 9556 } 9557 </style> 9558 </section> 9559 9560<style> 9561 .foot-social { 9562 display: inline-flex; 9563 align-items: center; 9564 gap: 8px; 9565 padding: 6px 0; 9566 font-family: var(--mono); 9567 font-size: 11px; 9568 color: var(--mute); 9569 letter-spacing: .06em; 9570 transition: color .25s var(--ease); 9571 } 9572 9573 .foot-social:hover { color: var(--paper); } 9574 9575 /* The badges sit tighter than the marketing rows and wrap rather than 9576 squeeze, because this column is the narrowest place they appear. */ 9577 .foot-apps { 9578 margin-top: 22px; 9579 gap: 10px; 9580 } 9581</style> 9582<footer class="foot"> 9583 <div class="foot-grid"> 9584 <div class="foot-brand"> 9585 9586 <a class="logo" href="https://talkify.nz" aria-label="Talkify, home" 9587 style="display:flex;align-items:center;gap:14px;color:inherit;text-decoration:none">
9588 <svg class="tk-logo" viewBox="-3 -3 317.81 106" 9589 width="125.92" height="42" 9590 xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Talkify" focusable="false"> 9591 <circle cx="50" cy="50" r="50" fill="var(--tk-word, #101820)"/> 9592 9593 <g fill="none" stroke="var(--tk-ground, #ffffff)" stroke-width="10" stroke-linecap="round"> 9594 <path d="M34 26 V54 C34 74 62 80 76 62"/> 9595 <path d="M20 40 H46"/> 9596 </g> 9597 9598 <g transform="translate(56 20) scale(0.30)"> 9599 <g class="tk-eye"> 9600 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" fill="var(--tk-ground, #ffffff)"/> 9601 </g> 9602 </g> 9603 <path d="M271.37 19.44 L274.1 19.47 L276.98 20.13 L279.56 21.51 L281.93 23.58 L276.86 28.65 L275.24 27.45 L274.04 26.97 L273.32 26.85 L270.62 26.97 L269.6 27.27 L268.28 28.05 L267.23 29.28 L266.57 30.96 L266.39 32.28 L266.39 37.38 L284.84 37.41 L293.66 59.85 L302.99 37.5 L311.81 37.44 L289.55 86.04 L289.34 86.37 L288.98 86.37 L280.61 86.34 L289.25 68.4 L276.89 39.18 L276.8 44.61 L266.39 44.64 L266.36 71.97 L258.47 71.94 L258.47 44.64 L250.19 44.58 L250.19 37.44 L258.44 37.41 L258.47 32.28 L258.71 30 L259.49 27.36 L260.69 25.14 L262.52 23.01 L264.98 21.21 L267.8 20.01 L270.08 19.53ZM190.01 20.16 L197.93 20.16 L197.93 71.94 L190.01 71.94ZM204.53 20.16 L212.45 20.16 L212.48 53.61 L226.46 37.41 L235.85 37.44 L221.33 53.94 L230.24 64.47 L236.57 71.94 L226.52 71.97 L212.48 55.05 L212.45 71.94 L204.53 71.94ZM131.63 23.04 L139.55 23.04 L139.58 37.41 L147.83 37.44 L147.8 44.61 L139.55 44.64 L139.55 71.94 L131.63 71.94 L131.63 44.64 L123.35 44.58 L123.38 37.41 L131.63 37.38ZM164.09 36.72 L167.06 36.81 L170.24 37.59 L171.92 38.37 L173.42 39.33 L175.4 41.19 L175.52 37.41 L183.41 37.44 L183.41 71.94 L175.52 71.97 L175.46 68.25 L174.08 69.57 L172.85 70.44 L170.84 71.55 L169.34 72.09 L167.84 72.45 L165.8 72.69 L163.76 72.69 L161.84 72.45 L159.92 71.97 L158.48 71.43 L156.44 70.35 L154.76 69.15 L152.27 66.66 L150.47 63.96 L149.57 62.04 L148.91 60.06 L148.55 58.5 L148.25 55.86 L148.37 52.2 L148.79 49.86 L149.39 47.88 L149.93 46.56 L151.01 44.58 L152.33 42.72 L153.65 41.28 L156.5 39.03 L158.54 37.95 L159.98 37.41 L161.9 36.93ZM239.21 37.44 L247.13 37.44 L247.13 71.94 L239.21 71.94ZM165.2 44.19 L163.04 44.61 L161.48 45.27 L159.98 46.29 L158.51 47.82 L157.73 49.02 L156.83 51.18 L156.41 53.52 L156.41 55.86 L156.65 57.48 L157.31 59.52 L158.51 61.56 L160.04 63.15 L161.48 64.11 L163.46 64.89 L165.32 65.19 L167.12 65.13 L169.34 64.77 L171.14 63.99 L172.34 63.15 L173.99 61.38 L175.01 59.64 L175.67 57.66 L175.97 55.44 L175.91 53.1 L175.49 51 L174.53 48.78 L173.81 47.7 L172.52 46.35 L170.84 45.21 L169.16 44.55 L167.18 44.19Z" fill="var(--tk-word, #101820)" fill-rule="evenodd"/> 9604 9605 <g transform="translate(231.30 6.84) scale(0.216)"> 9606 <path d="M50 8 Q55.5 39 92 50 Q55.5 61 50 92 Q44.5 61 8 50 Q44.5 39 50 8 Z" 9607 fill="var(--tk-word, #101820)"/> 9608 </g> 9609 </svg> 9610 </a> 9611 <p>The voice operating system for New Zealand business. Built in Aotearoa, hosted in Aotearoa, working while 9612 you don't.</p> 9613 <div 9614 style="margin-top:20px;font-family:var(--mono);font-size:12px;color:var(--mute);letter-spacing:.06em;line-height:1.7"> 9615 <span style="color:var(--mute);font-size:10px;text-transform:uppercase;letter-spacing:.18em">Sign up by phone</span><br> 9616 <a href="tel:+64800002967" style="color:var(--bone);transition:.25s">0800 002 967</a><br> 9617 <span 9618 style="color:var(--mute);font-size:10px;text-transform:uppercase;letter-spacing:.18em;margin-top:8px;display:inline-block">Hear an agent demo</span><br> 9619 <a href="tel:+6432421262" data-talkify-agent="default" style="color:var(--bone);transition:.25s">03 242 1262</a> 9620 <br> 9621 <span 9622 style="color:var(--mute);font-size:10px;text-transform:uppercase;letter-spacing:.18em;margin-top:8px;display:inline-block">Text our agent</span><br> 9623 <a href="sms:+64272048827" style="color:var(--bone);transition:.25s">027 204 8827</a> 9624 </div> 9625 <div style="margin-top:20px;
9625display:flex;flex-wrap:wrap;gap:8px 22px;align-items:center"> 9626 <a href="https://www.facebook.com/profile.php?id=61572226258048" target="_blank" 9627 rel="noopener noreferrer" aria-label="Facebook" 9628 class="foot-social"> 9629 <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"> 9630 <path 9631 d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/> 9632 </svg> 9633 Facebook 9634 </a> 9635 <a href="https://www.instagram.com/talkifynz/" target="_blank" 9636 rel="noopener noreferrer" aria-label="Instagram" 9637 class="foot-social"> 9638 <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"> 9639 <path 9640 d="M12 2.16c3.2 0 3.58.012 4.85.07 1.17.054 1.805.25 2.227.415.56.217.96.477 1.38.896.42.42.68.82.897 1.38.164.423.36 1.058.413 2.228.058 1.27.07 1.65.07 4.85s-.012 3.58-.07 4.85c-.054 1.17-.25 1.805-.413 2.227a3.72 3.72 0 0 1-.897 1.382c-.42.42-.82.68-1.38.896-.423.165-1.058.36-2.228.414-1.27.058-1.65.07-4.85.07s-3.58-.012-4.85-.07c-1.17-.054-1.805-.25-2.227-.414a3.72 3.72 0 0 1-1.38-.896 3.72 3.72 0 0 1-.897-1.382c-.164-.422-.36-1.057-.414-2.227C2.173 15.58 2.16 15.2 2.16 12s.013-3.58.07-4.85c.055-1.17.25-1.805.415-2.228.217-.56.477-.96.896-1.38.42-.42.82-.68 1.38-.896.423-.165 1.058-.36 2.228-.414C8.42 2.173 8.8 2.16 12 2.16zM12 0C8.74 0 8.333.014 7.053.072 5.775.13 4.905.333 4.14.63a5.88 5.88 0 0 0-2.126 1.384A5.88 5.88 0 0 0 .63 4.14C.333 4.905.13 5.775.072 7.053.014 8.333 0 8.74 0 12s.014 3.667.072 4.947c.058 1.277.261 2.148.558 2.913a5.88 5.88 0 0 0 1.384 2.126 5.88 5.88 0 0 0 2.126 1.384c.765.296 1.635.499 2.913.558C8.333 23.986 8.74 24 12 24s3.667-.014 4.947-.072c1.277-.06 2.148-.262 2.913-.558a5.88 5.88 0 0 0 2.126-1.384 5.88 5.88 0 0 0 1.384-2.126c.296-.765.499-1.636.558-2.913C23.986 15.667 24 15.26 24 12s-.014-3.667-.072-4.947c-.06-1.278-.262-2.148-.558-2.913a5.88 5.88 0 0 0-1.384-2.126A5.88 5.88 0 0 0 19.86.63c-.765-.297-1.636-.5-2.913-.558C15.667.014 15.26 0 12 0zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm7.846-10.405a1.44 1.44 0 1 1-2.88 0 1.44 1.44 0 0 1 2.88 0z"/> 9641 </svg> 9642 Instagram 9643 </a> 9644 <a href="https://www.linkedin.com/company/talkify-nz/" target="_blank" 9645 rel="noopener noreferrer" aria-label="LinkedIn" 9646 class="foot-social"> 9647 <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"> 9648 <path 9649 d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/> 9650 </svg> 9651 LinkedIn 9652 </a> 9653 </div> 9654 9655 9656 <div class="app-stores foot-apps" style="--app-badge-h: 38px"> 9657 <a class="app-badge" href="https://apps.apple.com/nz/app/talkify-mobile/id6766709308" 9658 target="_blank" rel="noopener"> 9659 <img src="https://talkify.nz/media/branding/apple-app-store.svg" 9660 alt="Download Talkify Mobile on the App Store" 9661 width="113.7" height="38" loading="lazy"> 9662 </a> 9663 <a class="app-badge" href="https://play.google.com/store/apps/details?id=com.talkifynz.app" 9664 target="_blank" rel="noopener"> 9665 <img src="https://talkify.nz/media/branding/google-app-store.svg" 9666 alt="Get Talkify Mobile on Google Play" 9667 width="128.3" height="38" loading="lazy"> 9668 </a> 9669</div> 9670 </div> 9671 <div> 9672 <h4>Agents</h4> 9673 <ul> 9674 <li><a href="https://talkify.nz/reception">Reception</a></li> 9675 <li><a href="https://talkify.nz/personal-assistant">Personal Assistant</a></li> 9676 <li><a href="https://talkify.nz/booking-service">Booking Service</a></li> 9677 <li><a href="https://talkify.nz/sales-agent">Sales Agent</a></li> 9678 <li><a href="https://talkify.nz/ai-phone-surveys">Campaign Agent</a></li> 9679 <li><a href="https://talkify.nz/debt-collection">Debt Collection</a></li> 9680 <li><a href="https://talkify.nz/ai-wellness-checks">Wellness Checks</a></li> 9681 <li>
9681<a href="https://talkify.nz/outbound-calls">Outbound Calls</a></li> 9682 <li><a href="https://talkify.nz/ai-marketing-campaigns">Marketing Campaigns</a></li> 9683 <li><a href="https://talkify.nz/website-chat">Website Chat</a></li> 9684 <li><a href="https://talkify.nz/calendar">Team Calendar</a></li> 9685 <li><a href="https://talkify.nz/dialler">Dialler</a></li> 9686 <li><a href="https://talkify.nz/agents">All agents →</a></li> 9687 </ul> 9688 </div> 9689 9690 <div> 9691 <h4>Trades</h4> 9692 <ul> 9693 <li><a href="https://talkify.nz/plumber">Plumbing</a></li> 9694 <li><a href="https://talkify.nz/electrician">Electricians</a></li> 9695 <li><a href="https://talkify.nz/builder">Builders</a></li> 9696 <li><a href="https://talkify.nz/hvac">Heat Pump & HVAC</a></li> 9697 <li><a href="https://talkify.nz/automotive">Mechanics & Workshops</a></li> 9698 <li><a href="https://talkify.nz/landscaping">Landscaping</a></li> 9699 <li><a href="https://talkify.nz/pest-control">Pest Control</a></li> 9700 <li><a href="https://talkify.nz/tradesman">All Trades</a></li> 9701 </ul> 9702 </div> 9703 <div> 9704 <h4>Industries</h4> 9705 <ul> 9706 <li><a href="https://talkify.nz/beauty">Beauty & Wellness</a></li> 9707 <li><a href="https://talkify.nz/real-estate">Real Estate</a></li> 9708 <li><a href="https://talkify.nz/retail">Retail</a></li> 9709 <li><a href="https://talkify.nz/professional-services">Professional Services</a></li> 9710 <li><a href="https://talkify.nz/barber">Barbers</a></li> 9711 <li><a href="https://talkify.nz/gym">Gyms & Studios</a></li> 9712 <li><a href="https://talkify.nz/personal-trainer">Personal Trainers</a></li> 9713 <li><a href="https://talkify.nz/hotel">Hotels & Motels</a></li> 9714 <li><a href="https://talkify.nz/accountant">Accountants</a></li> 9715 <li><a href="https://talkify.nz/industries">All industries →</a></li> 9716 </ul> 9717 </div> 9718 <div> 9719 9720 <h4>Call answering</h4> 9721 <ul> 9722 <li><a href="https://talkify.nz">AI receptionist NZ</a></li> 9723 <li><a href="https://talkify.nz/ai-phone-agent">AI phone agent NZ</a></li> 9724 <li><a href="https://talkify.nz/virtual-receptionist">Virtual receptionist NZ</a></li> 9725 <li><a href="https://talkify.nz/ai-answering-service">AI answering service NZ</a></li> 9726 <li><a href="https://talkify.nz/after-hours-answering">After hours answering NZ</a></li> 9727 <li><a href="https://talkify.nz/on-call-roster">On-Call Roster</a></li> 9728 <li><a href="https://talkify.nz/ai-call-centre">AI Call Centre Agents</a></li> 9729 <li><a href="https://talkify.nz/business-phone-lines">Business Phone Lines</a></li> 9730 9731 <li style="margin-top:6px;color:var(--mute);line-height:1.8"> 9732 By city: 9733 <a 9734 href="https://talkify.nz/ai-receptionist-auckland">Auckland</a><span 9735 style="color:var(--line-2)"> · </span><a 9736 href="https://talkify.nz/ai-receptionist-wellington">Wellington</a><span 9737 style="color:var(--line-2)"> · </span><a 9738 href="https://talkify.nz/ai-receptionist-christchurch">Christchurch</a><span 9739 style="color:var(--line-2)"> · </span><a 9740 href="https://talkify.nz/ai-receptionist-hamilton">Hamilton</a><span 9741 style="color:var(--line-2)"> · </span><a 9742 href="https://talkify.nz/ai-receptionist-tauranga">Tauranga</a><span 9743 style="color:var(--line-2)"> · </span><a 9744 href="https://talkify.nz/ai-receptionist-dunedin">Dunedin</a> </li> 9745 </ul> 9746 </div> 9747 <div> 9748 9749 <h4>Company</h4> 9750 <ul> 9751 <li><a href="https://talkify.nz/pricing">Pricing</a></li> 9752 <li><a href="https://talkify.nz/integrations">Integrations</a></li> 9753 9754 <li><a href="https://talkify.nz/compare">Compare Providers</a><span 9755 style="color:var(--line-2)"> · </span><a 9756 href="https://talkify.nz/alternatives">Alternatives</a></li> 9757 <li><a href="https://talkify.nz/missed-call-calculator">Missed Call Calculator</a></li> 9758 <li><a href="https://talkify.nz/blog">Journal</a></li> 9759 9760 <li><a href="https://talkify.nz/help">Help centre</a><span 9761 style="color:var(--line-2)"> · </span><a 9762 href="https://talkify.nz/contact-us">Contact us</a></li> 9763 <li><a href="https://talkify.nz/demo">Live demo</a></li> 9764 <li><a href="https://talkify.nz/signup">Get started</a></li> 9765 </ul> 9766 </div> 9767 </div> 9768 <div class="foot-bot">
9769 <span>© <span id="year">2026</span> · Talkify Limited · NZ owned and hosted</span> 9770 <span> 9771 9772 <span aria-current="page">New Zealand</span> · <a href="https://talkify.nz/au" style="color:var(--bone)">Australia</a> · 9773 <a href="https://talkify.nz/privacy" style="color:var(--bone)">Privacy</a> · 9774 <a href="https://talkify.nz/terms" style="color:var(--bone)">Terms</a> · 9775 <a href="https://talkify.nz/support" style="color:var(--bone)">Support</a> · 9776 <a href="https://talkify.nz/login" style="color:var(--bone)">Sign in</a> 9777 · <a href="https://d3v.nz" style="color:var(--bone)">Made by D3V</a> 9778 </span> 9779 </div> 9780</footer> 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790
9791<script> 9792 function tick() { 9793 const d = new Date(); 9794 const f = new Intl.DateTimeFormat('en-NZ', { 9795 timeZone: 'Pacific/Auckland', 9796 hour: '2-digit', 9797 minute: '2-digit', 9798 second: '2-digit', 9799 hour12: false 9800 }); 9801 const el = document.getElementById('clock'); 9802 if (el) el.textContent = f.format(d); 9803 } 9804 9805 tick(); 9806 setInterval(tick, 1000); 9807 const yEl = document.getElementById('year'); 9808 if (yEl) yEl.textContent = new Date().getFullYear(); 9809 9810 /* Scroll reveal. Fires once per block. Anybody who has asked for less 9811 motion, and any browser without IntersectionObserver, gets the lot 9812 revealed immediately rather than a page of invisible sections. */ 9813 (function () { 9814 const blocks = document.querySelectorAll('.r'); 9815 if (!blocks.length) return; 9816 const reduce = window.matchMedia 9817 && window.matchMedia('(prefers-reduced-motion: reduce)').matches; 9818 if (reduce || !('IntersectionObserver' in window)) { 9819 blocks.forEach(el => el.classList.add('in')); 9820 return; 9821 } 9822 const io = new IntersectionObserver((entries) => { 9823 entries.forEach(e => { 9824 if (e.isIntersecting) { 9825 e.target.classList.add('in'); 9826 io.unobserve(e.target); 9827 } 9828 }); 9829 }, {rootMargin: '-8% 0px -5% 0px'}); 9830 blocks.forEach(el => io.observe(el)); 9831 })(); 9832 9833 /* Agent phones. Each opens on a plain lock screen, then the clock drops to 9834 its compact size and the notifications land on top of it, which is the 9835 order an iPhone does it in. Plays once, when the panel is on screen. 9836 9837 The clock is the VISITOR'S OWN time and every stamp is counted back from 9838 it, so a screen can never show a notification that arrived after the time 9839 printed above it. Nothing is written into the markup, so a cached page 9840 cannot go stale either. 9841 9842 The tilt and the sheen are a couple of degrees and a highlight eased 9843 across the viewport. Both are off on coarse pointers, where there is no 9844 hover to reward them and the scroll handler is pure cost, and the whole 9845 thing collapses to "already arrived" under prefers-reduced-motion. */ 9846 (function () { 9847 const phones = [...document.querySelectorAll('[data-agent-phone]')]; 9848 if (!phones.length) return; 9849 9850 const clockOf = d => d.toLocaleTimeString('en-NZ', {hour: 'numeric', minute: '2-digit', hour12: false}); 9851 const stampOf = d => d.toLocaleTimeString('en-NZ', {hour: 'numeric', minute: '2-digit', hour12: true}) 9852 .replace(/\s/g, '').toLowerCase(); 9853 const dateOf = d => d.toLocaleDateString('en-NZ', {weekday: 'long', day: 'numeric', month: 'long'}); 9854 9855 const still = matchMedia('(prefers-reduced-motion: reduce)').matches; 9856 const coarse = matchMedia('(pointer: coarse)').matches; 9857 9858 phones.forEach(phone => { 9859 // A phone may pin its own clock with data-agent-at="HH:MM". The 9860 // after-hours story is an escalation at a quarter to midnight, and 9861 // stamped 2pm on a daytime visitor's own clock it reads as 9862 // nonsense. Everything else still shows the visitor's real time, 9863 // counted back from, so nothing arrives after the clock above it. 9864 const now = new Date(); 9865 const pinned = (phone.dataset.agentAt || '').match(/^(\d{1,2}):(\d{2})$/); 9866 if (pinned) now.setHours(+pinned[1], +pinned[2], 0, 0); 9867 9868 const t = phone.querySelector('[data-agent-time]'); 9869 const dt = phone.querySelector('[data-agent-date]'); 9870 if (t) t.textContent = clockOf(now); 9871 if (dt) dt.textContent = dateOf(now); 9872 9873 phone.querySelectorAll('[data-agent-ago]').forEach(el => { 9874 const mins = parseInt(el.dataset.agentAgo, 10); 9875 if (!Number.isFinite(mins)) return; 9876 el.textContent = stampOf(new Date(now.getTime() - mins * 60000)); 9877 }); 9878 9879 const clock = phone.querySelector('[data-agent-clock]'); 9880 const notes = [...phone.querySelectorAll('.hpn')]; 9881 if (!clock || !notes.length) return; 9882 9883 if (still) { 9884 clock.classList.add('is-compact');
9885 notes.forEach(n => n.classList.add('is-in')); 9886 return; 9887 } 9888 9889 let played = false; 9890 const play = () => { 9891 if (played) return; 9892 played = true; 9893 setTimeout(() => clock.classList.add('is-compact'), 420); 9894 notes.forEach((n, i) => setTimeout(() => n.classList.add('is-in'), 780 + i * 380)); 9895 }; 9896 9897 const io = new IntersectionObserver(entries => { 9898 entries.forEach(e => { 9899 if (!e.isIntersecting) return; 9900 play(); 9901 io.unobserve(phone); 9902 }); 9903 }, {threshold: .35}); 9904 io.observe(phone); 9905 9906 if (coarse) return; 9907 9908 const lean = phone.classList.contains('agent-phone--left') ? -1 : 1; 9909 let queued = false; 9910 const tilt = () => { 9911 queued = false; 9912 const r = phone.getBoundingClientRect(); 9913 if (r.bottom < 0 || r.top > innerHeight) return; 9914 // -0.5 above the fold, +0.5 below it 9915 const p = (r.top + r.height / 2 - innerHeight / 2) / innerHeight; 9916 phone.style.setProperty('--ag-tilt', (lean * (3 - p * 4.5)).toFixed(2) + 'deg'); 9917 phone.style.setProperty('--ag-sheen', (p * -150).toFixed(1) + '%'); 9918 }; 9919 addEventListener('scroll', () => { 9920 if (queued) return; 9921 queued = true; 9922 requestAnimationFrame(tilt); 9923 }, {passive: true}); 9924 tilt(); 9925 }); 9926 })(); 9927 9928 9929 /* Hero phone. The chips are the data source, so the markup stays the one 9930 place the copy lives. Cycling pauses the moment the visitor takes over, 9931 and never starts at all under prefers-reduced-motion. */ 9932 (function () { 9933 const root = document.querySelector('[data-hp-stack]'); 9934 if (!root) return; 9935 const chips = [...document.querySelectorAll('[data-hp-chip]')]; 9936 if (!chips.length) return; 9937 9938 const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 9939 const icon = document.querySelector('.hpn header img'); 9940 const iconSrc = icon ? icon.getAttribute('src') : ''; 9941 let i = 0, timer = null, taken = false; 9942 9943 // the phone shows the viewer's own clock, so it reads as their phone 9944 // rather than a screenshot taken at some other time 9945 const clock = () => { 9946 const now = new Date(); 9947 const t = document.querySelector('[data-hp-time]'); 9948 const d = document.querySelector('[data-hp-date]'); 9949 if (t) t.textContent = now.toLocaleTimeString('en-NZ', {hour: 'numeric', minute: '2-digit'}) 9950 .replace(/\s?(am|pm)$/i, ''); 9951 if (d) d.textContent = now.toLocaleDateString('en-NZ', {weekday: 'long', day: 'numeric', month: 'long'}); 9952 }; 9953 9954 const AGO = ['now', '2m ago', '8m ago']; 9955 9956 const build = (chip) => { 9957 const frag = document.createDocumentFragment(); 9958 // two or three per screen: one card at a time made the phone look 9959 // idle, and a digest is the thing being sold 9960 [['title', 'body'], ['title2', 'body2'], ['title3', 'body3']].forEach((keys, i) => { 9961 const title = chip.dataset[keys[0]], body = chip.dataset[keys[1]]; 9962 if (!title) return; 9963 const n = document.createElement('article'); 9964 n.className = 'hpn'; 9965 n.style.transitionDelay = (i * 620) + 'ms'; 9966 n.innerHTML = 9967 '<header><img src="' + iconSrc + '" alt="" width="18" height="18">' + 9968 '<span class="hpn-app">Talkify</span><span class="hpn-ago"></span></header>' + 9969 '<h4></h4><p></p>'; 9970 n.querySelector('.hpn-ago').textContent = AGO[i] || 'earlier'; 9971 n.querySelector('h4').textContent = title; 9972 n.querySelector('p').textContent = body; 9973 frag.appendChild(n); 9974 }); 9975 return frag; 9976 }; 9977 9978 const show = (idx) => { 9979 i = (idx + chips.length) % chips.length; 9980 chips.forEach((c, n) => c.classList.toggle('is-on', n === i)); 9981 chips.forEach((c, n) => c.setAttribute('aria-selected', n === i ? 'true' : 'false')); 9982 root.replaceChildren(build(chips[i])); 9983 // let the browser paint the start state before transitioning in 9984 requestAnimationFrame(() => requestAnimationFrame(() => 9985 root.querySelectorAll('.hpn').forEach(n => n.classList.add('is-in')))); 9986 }; 9987 9988 const stop = () => { if (timer) { clearInterval(timer); timer = null; } }; 9989 const start = () => { if (!reduce && !taken && !timer) timer = setInterval(() => show(i + 1), 7000); }; 9990 9991 chips.forEach((chip, n) => { 9992 const take = () => { taken = true; stop(); show(n); }; 9993 chip.addEventListener('click', take); 9994 chip.addEventListener('mouseenter', () => { stop(); show(n); }); 9995 chip.addEventListener('mouseleave', () => { if (!taken) start(); }); 9996 }); 9997 9998 // do not animate a phone nobody is looking at 9999 const vis = new IntersectionObserver((es) => {
10000 es.forEach(e => e.isIntersecting ? start() : stop()); 10001 }, {threshold: 0.2}); 10002 vis.observe(root); 10003 10004 clock(); 10005 setInterval(clock, 30000); 10006 show(0); 10007 })(); 10008 10009 (function () { 10010 const hero = document.querySelector('.hero-bg'); 10011 if (!hero) return; 10012 // Pointer parallax is a mouse affordance: a finger cannot hover, and 10013 // it is exactly the sort of movement prefers-reduced-motion is for. 10014 const mq = (q) => window.matchMedia && window.matchMedia(q).matches; 10015 if (mq('(prefers-reduced-motion: reduce)') || mq('(pointer: coarse)')) return; 10016 10017 let x = 0, y = 0, queued = false; 10018 const paint = () => { 10019 queued = false; 10020 hero.style.transform = `translate(${x}px,${y}px)`; 10021 }; 10022 document.addEventListener('mousemove', (e) => { 10023 x = (e.clientX / window.innerWidth - .5) * 24; 10024 y = (e.clientY / window.innerHeight - .5) * 24; 10025 if (!queued) { 10026 queued = true; 10027 requestAnimationFrame(paint); 10028 } 10029 }, {passive: true}); 10030 })(); 10031 10032 // âââ Live call deck, messages animate in as if the call is happening now âââ 10033 (function () { 10034 document.querySelectorAll('.deck').forEach(deck => { 10035 const rows = Array.from(deck.querySelectorAll('.deck-row')); 10036 if (!rows.length) return; 10037 10038 // Insert a typing indicator before each agent row 10039 rows.forEach(row => { 10040 if (row.classList.contains('agent')) { 10041 const ts = row.querySelector('.ts')?.textContent || ''; 10042 const typing = document.createElement('div'); 10043 typing.className = 'deck-typing'; 10044 typing.innerHTML = `<span class="ts">${ts}</span><span class="who">Talkify</span><span class="dotset"><i></i><i></i><i></i></span>`; 10045 row.parentNode.insertBefore(typing, row); 10046 } 10047 }); 10048 10049 let started = false; 10050 const start = () => { 10051 if (started) return; 10052 started = true; 10053 let t = 400; 10054 rows.forEach(row => { 10055 if (row.classList.contains('agent')) { 10056 const typing = row.previousElementSibling; 10057 if (typing && typing.classList.contains('deck-typing')) { 10058 setTimeout(() => typing.classList.add('on'), t); 10059 t += 900; 10060 setTimeout(() => typing.classList.remove('on'), t); 10061 t += 200; 10062 } 10063 } 10064 setTimeout(() => row.classList.add('in'), t); 10065 t += 1200; 10066 }); 10067 10068 // After the prepared script plays, optionally append a follow-up exchange 10069 const followup = deck.dataset.followup; 10070 if (followup === 'on') { 10071 setTimeout(() => { 10072 appendDeckExchange(deck); 10073 }, t + 1500); 10074 } 10075 }; 10076 10077 const io = new IntersectionObserver(entries => { 10078 entries.forEach(e => { 10079 if (e.isIntersecting) { 10080 start(); 10081 io.unobserve(deck); 10082 } 10083 }); 10084 }, {threshold: 0.25}); 10085 io.observe(deck); 10086 }); 10087 10088 function appendDeckExchange(deck) { 10089 // Append one extra caller + agent exchange to the home hero deck 10090 const followups = [ 10091 { 10092 caller: "One more thing, can my partner come too?", 10093 agent: "Of course. I'll add them to the appointment. Anything else?" 10094 }, 10095 { 10096 caller: "Is there parking?", 10097 agent: "Yep, two-hour free parking on Vivian Street, or paid building parking off the lobby." 10098 }, 10099 ]; 10100 const ex = followups[Math.floor(Math.random() * followups.length)]; 10101 const wave = deck.querySelector('.wave'); 10102 const insertBefore = wave || deck.querySelector('.deck-foot'); 10103 10104 const lastTs = deck.querySelectorAll('.deck-row .ts'); 10105 const baseSec = parseInt((lastTs[lastTs.length - 1]?.textContent || '00:14').split(':')[1]) + 6; 10106 const fmtTs = s => `00:${String(s).padStart(2, '0')}`; 10107 10108 const callerRow = document.createElement('div'); 10109 callerRow.className = 'deck-row caller'; 10110 callerRow.innerHTML = `<span class="ts">${fmtTs(baseSec)}</span><span class="who">Caller</span><span class="msg">${ex.caller}</span>`;
10111 deck.insertBefore(callerRow, insertBefore); 10112 10113 const typingRow = document.createElement('div'); 10114 typingRow.className = 'deck-typing'; 10115 typingRow.innerHTML = `<span class="ts">${fmtTs(baseSec + 2)}</span><span class="who">Talkify</span><span class="dotset"><i></i><i></i><i></i></span>`; 10116 deck.insertBefore(typingRow, insertBefore); 10117 10118 const agentRow = document.createElement('div'); 10119 agentRow.className = 'deck-row agent'; 10120 agentRow.innerHTML = `<span class="ts">${fmtTs(baseSec + 3)}</span><span class="who">Talkify</span><span class="msg">${ex.agent}</span>`; 10121 deck.insertBefore(agentRow, insertBefore); 10122 10123 requestAnimationFrame(() => callerRow.classList.add('in')); 10124 setTimeout(() => typingRow.classList.add('on'), 1100); 10125 setTimeout(() => typingRow.classList.remove('on'), 2400); 10126 setTimeout(() => agentRow.classList.add('in'), 2500); 10127 } 10128 })(); 10129 10130 // âââ Real conversations, bubbles type into existence as user scrolls in âââ 10131 (function () { 10132 document.querySelectorAll('.convo').forEach(convo => { 10133 const bubs = Array.from(convo.querySelectorAll('.bub')); 10134 if (!bubs.length) return; 10135 10136 let started = false; 10137 const start = () => { 10138 if (started) return; 10139 started = true; 10140 10141 let t = 200; 10142 bubs.forEach((bub) => { 10143 // Show typing indicator with the same alignment + colour, then swap to bubble 10144 const typing = document.createElement('div'); 10145 typing.className = 'convo-typing' + (bub.classList.contains('caller') ? ' caller' : ''); 10146 const who = bub.classList.contains('caller') ? 'Caller' : 'Talkify'; 10147 typing.innerHTML = `<span class="lbl">${who}</span><span class="dotset"><i></i><i></i><i></i></span>`; 10148 convo.insertBefore(typing, bub); 10149 10150 const typingMs = bub.classList.contains('caller') ? 500 : 800; 10151 setTimeout(() => typing.classList.add('on'), t); 10152 t += typingMs; 10153 setTimeout(() => { 10154 typing.classList.remove('on'); 10155 typing.remove(); 10156 }, t); 10157 setTimeout(() => bub.classList.add('in'), t + 50); 10158 t += 450; // settle time before next message 10159 }); 10160 }; 10161 10162 /* Watch the transcript's wrapper where it has one. On the home page 10163 the transcript sits inside a phone, and a clipped flex child that 10164 deep gets no intersection entries at all, so a threshold against 10165 the transcript itself never fires and the conversation never 10166 starts. The wrapper is an ordinary block in normal flow. */ 10167 const target = convo.closest('.convo-device') || convo; 10168 const io = new IntersectionObserver(entries => { 10169 entries.forEach(e => { 10170 if (e.isIntersecting) { 10171 start(); 10172 io.unobserve(target); 10173 } 10174 }); 10175 }, {threshold: 0.2}); 10176 io.observe(target); 10177 }); 10178 })(); 10179 10180 // âââ Live PA digest, notifications drop in on scroll, more arrive as you watch âââ 10181 (function () { 10182 document.querySelectorAll('.pa-floater').forEach(floater => { 10183 const initialRows = Array.from(floater.querySelectorAll('.row')); 10184 if (!initialRows.length) return; 10185 10186 const queue = [ 10187 { 10188 lbl: 'Returning client · routed', 10189 name: 'Liam, message taken for Tom', 10190 meta: '<span class="vip" style="color:var(--mute)">â Routine</span>' 10191 }, 10192 { 10193 lbl: 'New booking', 10194 name: 'Te Aroha · Saturday haircut', 10195 meta: '<span class="vip" style="color:var(--signal)">â Booked</span>' 10196 }, 10197 { 10198 lbl: 'Urgent · escalated to mobile', 10199 name: 'Maria @ Hartwell, sent to your phone', 10200 meta: '<span class="vip" style="color:var(--coral)">â VIP</span>' 10201 }, 10202 {lbl: 'Quietly handled', name: '14 vendors politely declined', meta: ''}, 10203 ]; 10204 let qIdx = 0; 10205 let started = false;
10206 10207 const start = () => { 10208 if (started) return; 10209 started = true; 10210 initialRows.forEach((row, i) => { 10211 setTimeout(() => { 10212 row.classList.add('in', 'ping'); 10213 setTimeout(() => row.classList.remove('ping'), 1400); 10214 }, i * 1200 + 400); 10215 }); 10216 10217 // After initial settle, push a new notification every 9 seconds 10218 const settled = initialRows.length * 1200 + 2000; 10219 setTimeout(() => { 10220 const interval = setInterval(() => { 10221 if (!floater.isConnected) { 10222 clearInterval(interval); 10223 return; 10224 } 10225 const item = queue[qIdx % queue.length]; 10226 qIdx++; 10227 const newRow = document.createElement('div'); 10228 newRow.className = 'row in fresh ping'; 10229 newRow.innerHTML = ` 10230 <span class="lbl">${item.lbl}</span> 10231 <span class="name">${item.name}</span> 10232 ${item.meta ? '<span>' + item.meta + '</span>' : ''} 10233 `; 10234 floater.insertBefore(newRow, floater.firstChild); 10235 10236 // Drop the oldest if we have too many, keep card from growing 10237 const all = floater.querySelectorAll('.row'); 10238 if (all.length > 4) { 10239 const oldest = all[all.length - 1]; 10240 oldest.style.transition = 'opacity .5s ease, transform .5s ease, max-height .5s ease, margin .5s ease, padding .5s ease'; 10241 oldest.style.opacity = '0'; 10242 oldest.style.transform = 'translateY(8px)'; 10243 setTimeout(() => oldest.remove(), 600); 10244 } 10245 10246 setTimeout(() => newRow.classList.remove('ping'), 1400); 10247 }, 9000); 10248 }, settled); 10249 }; 10250 10251 const io = new IntersectionObserver(entries => { 10252 entries.forEach(e => { 10253 if (e.isIntersecting) { 10254 start(); 10255 io.unobserve(floater); 10256 } 10257 }); 10258 }, {threshold: 0.3}); 10259 io.observe(floater); 10260 }); 10261 })(); 10262 10263 // âââ Conversion + engagement events â GA4 / GTM dataLayer âââ 10264 // Every tel: tap, CTA click and lead form submit lands in the dataLayer so 10265 // GTM/GA4 can build conversions without touching the templates again. 10266 (function () { 10267 const page = "home"; 10268 const push = (event, params) => { 10269 window.dataLayer = window.dataLayer || []; 10270 window.dataLayer.push(Object.assign({event: event, page_key: page}, params || {})); 10271 }; 10272 10273 // Phone taps: the demo line and the sign-up lines are separate conversions. 10274 // The demo lines come from App\Services\Market (they differ by country 10275 // and by how a visitor has to dial them), matched on their last eight 10276 // digits so the local and the international form are the same line. 10277 const demoTails = ["32421262","92420020"]; 10278 document.querySelectorAll('a[href^="tel:"]').forEach(a => { 10279 a.addEventListener('click', () => { 10280 const num = (a.getAttribute('href') || '').replace('tel:', ''); 10281 const digits = num.replace(/\D/g, ''); 10282 const isDemo = demoTails.some(t => t && digits.endsWith(t)); 10283 push(isDemo ? 'demo_call_click' : 'phone_signup_click', { 10284 phone_number: num, 10285 link_text: (a.textContent || '').trim().slice(0, 80), 10286 }); 10287 }); 10288 }); 10289 10290 // CTA buttons (primary/blue/ghost), which CTA, on which page 10291 document.querySelectorAll('a.btn').forEach(a => { 10292 a.addEventListener('click', () => { 10293 push('cta_click', { 10294 cta_text: (a.textContent || '').trim().slice(0, 80), 10295 cta_style: a.classList.contains('btn-primary') ? 'primary' 10296 : a.classList.contains('btn-blue') ? 'blue' : 'ghost', 10297 cta_href: a.getAttribute('href') || '', 10298 }); 10299 }); 10300 }); 10301 10302 // Lead forms: signup/contact, live demo call, support 10303 document.querySelectorAll('form').forEach(form => { 10304 const action = form.getAttribute('action') || ''; 10305 let event = null; 10306 if (action.includes('/signup/verify')) event = 'sign_up'; 10307 else if (action.includes('/signup/send-code')) event = 'sign_up_start'; 10308 else if (action.includes('/contact')) event = 'generate_lead'; 10309 else if (action.includes('/demo')) event = 'demo_call_request';
10310 else if (action.includes('/support')) event = 'support_request'; 10311 if (!event) return; 10312 form.addEventListener('submit', () => { 10313 const agent = form.querySelector('input[name="agent_type"]:checked'); 10314 push(event, { 10315 form_action: action, 10316 agent_type: agent ? agent.value : undefined, 10317 }); 10318 }); 10319 }); 10320 })(); 10321 10322 /* Agents mega-menu. Desktop opens it on hover/focus via CSS; this handles 10323 the click path, which is the only way in on touch, plus Escape and 10324 click-outside. */ 10325 (function () { 10326 const drops = document.querySelectorAll('[data-nav-drop]'); 10327 if (!drops.length) return; 10328 10329 const closeAll = (except) => drops.forEach((drop) => { 10330 if (drop === except) return; 10331 drop.classList.remove('is-open'); 10332 drop.querySelector('.nav-drop-btn')?.setAttribute('aria-expanded', 'false'); 10333 }); 10334 10335 drops.forEach((drop) => { 10336 const trigger = drop.querySelector('.nav-drop-btn'); 10337 if (!trigger) return; 10338 10339 trigger.addEventListener('click', (event) => { 10340 event.preventDefault(); 10341 event.stopPropagation(); 10342 const open = drop.classList.toggle('is-open'); 10343 trigger.setAttribute('aria-expanded', open ? 'true' : 'false'); 10344 closeAll(drop); 10345 }); 10346 }); 10347 10348 document.addEventListener('click', (event) => { 10349 if (!event.target.closest('[data-nav-drop]')) closeAll(); 10350 }); 10351 10352 document.addEventListener('keydown', (event) => { 10353 if (event.key === 'Escape') closeAll(); 10354 }); 10355 10356 window.talkifyCloseNavDrops = closeAll; 10357 })(); 10358 10359 (function () { 10360 const btn = document.querySelector('.menu-btn'); 10361 const nav = document.querySelector('.nav ul'); 10362 if (!btn || !nav) return; 10363 btn.addEventListener('click', () => { 10364 const open = nav.style.display === 'flex'; 10365 // Collapsing the menu should not leave the Agents accordion open 10366 // behind it, or it reappears expanded next time. 10367 if (open && window.talkifyCloseNavDrops) window.talkifyCloseNavDrops(); 10368 nav.style.display = open ? 'none' : 'flex'; 10369 nav.style.position = 'fixed'; 10370 nav.style.top = '92px'; 10371 nav.style.left = '20px'; 10372 nav.style.right = '20px'; 10373 nav.style.flexDirection = 'column'; 10374 nav.style.background = 'var(--ink-2)'; 10375 nav.style.border = '1px solid var(--line)'; 10376 nav.style.borderRadius = '14px'; 10377 nav.style.padding = '12px'; 10378 nav.style.zIndex = '85'; 10379 }); 10380 })(); 10381 10382 /* Theme toggle, persist choice, flip data-theme on <html> */ 10383 (function () { 10384 var toggles = document.querySelectorAll('[data-theme-toggle]'); 10385 if (!toggles.length) return; 10386 toggles.forEach(function (btn) { 10387 btn.addEventListener('click', function () { 10388 var current = document.documentElement.getAttribute('data-theme') === 'light' ? 'light' : 'dark'; 10389 var next = current === 'light' ? 'dark' : 'light'; 10390 document.documentElement.setAttribute('data-theme', next); 10391 try { 10392 localStorage.setItem('talkify-theme', next); 10393 } catch (e) { 10394 } 10395 }); 10396 }); 10397 })(); 10398</script>
10398 10399
10399<script> 10400 (function () { 10401 var CSRF = "2cZHQjhlrpDk2bAxkNOtWyU4l8TAY6RFoVgytF3j"; 10402 var SITE_KEY = null; 10403 var INITIAL_STEP = "details"; 10404 var ROUTES = { 10405 send: "https:\/\/talkify.nz\/outbound-demo\/send-code", 10406 verify: "https:\/\/talkify.nz\/outbound-demo\/verify", 10407 resend: "https:\/\/talkify.nz\/outbound-demo\/resend", 10408 reset: "https:\/\/talkify.nz\/outbound-demo\/reset", 10409 status: "https:\/\/talkify.nz\/demo-call\/status" }; 10410 var panels = { 10411 details: document.getElementById('odDetails'), 10412 verify: document.getElementById('odVerify'), 10413 calling: document.getElementById('odCalling'), 10414 done: document.getElementById('odDone') 10415 }; 10416 var stepFor = {details: 'details', verify: 'verify', calling: 'call', done: 'call'}; 10417 var err = document.getElementById('odErr'); 10418 var nameEl = document.getElementById('od-name'); 10419 var mobileEl = document.getElementById('od-mobile'); 10420 var codeEl = document.getElementById('od-code'); 10421 var sendBtn = document.getElementById('odSendBtn'); 10422 var verifyBtn = document.getElementById('odVerifyBtn'); 10423 var resendBtn = document.getElementById('odResendBtn'); 10424 var conversationId = null, pollTimer = null, pollStart = 0, callSafety = null, resendTimer = null; 10425 10426 function show(state) { 10427 for (var k in panels) { 10428 panels[k].hidden = (k !== state); 10429 } 10430 document.querySelectorAll('#odSteps [data-step]').forEach(function (el) { 10431 el.classList.toggle('on', el.getAttribute('data-step') === stepFor[state]); 10432 }); 10433 } 10434 10435 function setErr(msg) { 10436 if (msg) { 10437 err.textContent = 'â ' + msg; 10438 err.hidden = false; 10439 } else { 10440 err.hidden = true; 10441 } 10442 } 10443 10444 function refreshDetails() { 10445 sendBtn.disabled = !(nameEl.value.trim().length >= 2 && mobileEl.value.replace(/\D/g, '').length >= 8); 10446 } 10447 10448 function refreshVerify() { 10449 verifyBtn.disabled = !/^\d{6}$/.test(codeEl.value.trim()); 10450 } 10451 10452 nameEl.addEventListener('input', refreshDetails); 10453 mobileEl.addEventListener('input', refreshDetails); 10454 codeEl.addEventListener('input', function () { 10455 codeEl.value = codeEl.value.replace(/\D/g, '').slice(0, 6); 10456 refreshVerify(); 10457 }); 10458 refreshDetails(); 10459 refreshVerify(); 10460 10461 function getToken() { 10462 return new Promise(function (res) { 10463 if (SITE_KEY && window.grecaptcha) { 10464 grecaptcha.ready(function () { 10465 grecaptcha.execute(SITE_KEY, {action: 'demo_call'}).then(res, function () { 10466 res(''); 10467 }); 10468 }); 10469 } else res(''); 10470 }); 10471 } 10472 10473 function post(url, params) { 10474 var body = new URLSearchParams(); 10475 for (var k in params) { 10476 if (params[k] !== null && params[k] !== undefined) body.set(k, params[k]); 10477 } 10478 return fetch(url, { 10479 method: 'POST', 10480 headers: { 10481 'Accept': 'application/json', 10482 'X-CSRF-TOKEN': CSRF, 10483 'X-Requested-With': 'XMLHttpRequest', 10484 'Content-Type': 'application/x-www-form-urlencoded' 10485 }, 10486 body: body.toString() 10487 }).then(function (r) { 10488 return r.json().then(function (j) { 10489 return {ok: r.ok, j: j}; 10490 }).catch(function () { 10491 return {ok: false, j: {}}; 10492 }); 10493 }); 10494 } 10495 10496 function firstError(j) { 10497 if (j && j.message) return j.message; 10498 if (j && j.errors) { 10499 for (var k in j.errors) { 10500 if (j.errors[k] && j.errors[k].length) return j.errors[k][0]; 10501 } 10502 } 10503 return 'Something went wrong. Please try again.'; 10504 } 10505 10506 // -------- Step 1: send the code -------- 10507 panels.details.addEventListener('submit', function (e) { 10508 e.preventDefault(); 10509 setErr(null); 10510 if (sendBtn.disabled) return; 10511 if (!nameEl.checkValidity() || !mobileEl.checkValidity()) { 10512 setErr('Please enter your name and a valid mobile: NZ starting 020, 021, 022 or 027, or AU starting 04.'); 10513 return; 10514 } 10515 sendBtn.disabled = true; 10516 sendBtn.querySelector('.arr').textContent = 'â¦'; 10517 getToken().then(function (token) { 10518 return post(ROUTES.send, { 10519 name: nameEl.value.trim(), 10520 mobile: mobileEl.value.trim(), 10521 company_reference: document.getElementById('od-company-reference').value, 10522 'g-recaptcha-response': token || null 10523 }); 10524 }).then(function (o) { 10525 sendBtn.querySelector('.arr').textContent = 'â'; 10526 refreshDetails(); 10527 if (o.ok && o.j && o.j.ok) { 10528 document.getElementById('odMobileShown').textContent = o.j.mobile || mobileEl.value.trim(); 10529 document.getElementById('odCallingName').textContent = nameEl.value.trim(); 10530 document.getElementById('odDoneName').textContent = nameEl.value.trim(); 10531 codeEl.value = ''; 10532 refreshVerify(); 10533 show('verify'); 10534 startResendCountdown(); 10535 codeEl.focus(); 10536 } else { 10537 setErr(firstError(o.j)); 10538 } 10539 }).catch(function () { 10540 sendBtn.querySelector('.arr').textContent = 'â'; 10541 refreshDetails(); 10542 setErr('Network error. Please try again.'); 10543 }); 10544 }); 10545 10546 // -------- Step 2: verify + place the call -------- 10547 panels.verify.addEventListener('submit', function (e) { 10548 e.preventDefault(); 10549 setErr(null); 10550 if (verifyBtn.disabled) return; 10551 verifyBtn.disabled = true; 10552 verifyBtn.querySelector('.arr').textContent = 'â¦'; 10553 post(ROUTES.verify, {code: codeEl.value.trim()}).then(function (o) { 10554 verifyBtn.querySelector('.arr').textContent = 'â'; 10555 refreshVerify(); 10556 if (o.ok && o.j && o.j.ok) {
10557 conversationId = o.j.conversation_id || null; 10558 // The agent is dialling: somebody is about to hear the 10559 // product. Fired here rather than through a session 10560 // flash because this deck never navigates. 10561 if (window.talkifyTrack) { 10562 window.talkifyTrack("demo_call_started", { 10563 source_form: 'outbound_demo' 10564 }); 10565 } 10566 show('calling'); 10567 startCallSafety(); 10568 if (conversationId) startPolling(); else finishSoon(); 10569 } else if (o.j && o.j.expired) { 10570 setErr(firstError(o.j)); 10571 show('details'); 10572 } else { 10573 setErr(firstError(o.j)); 10574 } 10575 }).catch(function () { 10576 verifyBtn.querySelector('.arr').textContent = 'â'; 10577 refreshVerify(); 10578 setErr('Network error. Please try again.'); 10579 }); 10580 }); 10581 10582 document.getElementById('odChangeBtn').addEventListener('click', function () { 10583 post(ROUTES.reset, {}); 10584 clearInterval(resendTimer); 10585 setErr(null); 10586 show('details'); 10587 }); 10588 10589 resendBtn.addEventListener('click', function () { 10590 if (resendBtn.disabled) return; 10591 resendBtn.disabled = true; 10592 post(ROUTES.resend, {}).then(function (o) { 10593 if (o.ok && o.j && o.j.ok) { 10594 setErr(null); 10595 startResendCountdown(); 10596 } else if (o.j && o.j.expired) { 10597 show('details'); 10598 } else { 10599 setErr(firstError(o.j)); 10600 resendBtn.disabled = false; 10601 resendBtn.textContent = 'Resend'; 10602 } 10603 }); 10604 }); 10605 10606 function startResendCountdown() { 10607 clearInterval(resendTimer); 10608 var left = 30; 10609 resendBtn.disabled = true; 10610 resendBtn.innerHTML = 'Resend (<span id="odResendCount">' + left + '</span>)'; 10611 resendTimer = setInterval(function () { 10612 left--; 10613 var c = document.getElementById('odResendCount'); 10614 if (c) c.textContent = Math.max(0, left); 10615 if (left <= 0) { 10616 clearInterval(resendTimer); 10617 resendBtn.disabled = false; 10618 resendBtn.textContent = 'Resend'; 10619 } 10620 }, 1000); 10621 } 10622 10623 // -------- Step 3: follow the live call -------- 10624 function startCallSafety() { 10625 clearTimeout(callSafety); 10626 callSafety = setTimeout(function () { 10627 done(null); 10628 }, 360000); 10629 } 10630 10631 function startPolling() { 10632 pollStart = Date.now(); 10633 clearInterval(pollTimer); 10634 pollTimer = setInterval(function () { 10635 fetch(ROUTES.status + '?c=' + encodeURIComponent(conversationId), {headers: {'Accept': 'application/json'}}) 10636 .then(function (r) { 10637 return r.json(); 10638 }) 10639 .then(function (j) { 10640 if (j.status === 'finished') { 10641 done(j.summary); 10642 } else if (j.status === 'failed') { 10643 done(null); 10644 } else if (Date.now() - pollStart > 360000) { 10645 done(null); 10646 } 10647 }).catch(function () { 10648 }); 10649 }, 4000); 10650 } 10651 10652 function finishSoon() { 10653 clearTimeout(callSafety); 10654 callSafety = setTimeout(function () { 10655 done(null); 10656 }, 150000); 10657 } 10658 10659 function done(summary) { 10660 clearInterval(pollTimer); 10661 clearTimeout(callSafety); 10662 var s = document.getElementById('odSummary'); 10663 if (summary) { 10664 s.textContent = summary; 10665 s.hidden = false;
10666 } else { 10667 s.hidden = true; 10668 } 10669 show('done'); 10670 } 10671 10672 document.getElementById('odAgainBtn').addEventListener('click', function () { 10673 conversationId = null; 10674 nameEl.value = ''; 10675 mobileEl.value = ''; 10676 codeEl.value = ''; 10677 setErr(null); 10678 refreshDetails(); 10679 refreshVerify(); 10680 show('details'); 10681 }); 10682 10683 show(INITIAL_STEP === 'verify' ? 'verify' : 'details'); 10684 if (INITIAL_STEP === 'verify') startResendCountdown(); 10685 })(); 10686 </script>
vendor: 1 bytes, line 10686
10686
10687<script> 10688 (() => { 10689 const captions = (v, on) => { const tr = v.textTracks && v.textTracks[0]; if (tr) tr.mode = on ? 'showing' : 'disabled'; }; 10690 10691 // With sound, from the start: a chosen play (a fresh nonce makes it a new 10692 // play for the tracker, not the tail of the silent one). 10693 const withSound = (section) => { 10694 const v = section.querySelector('video'); 10695 const btn = section.querySelector('.pv-sound'); 10696 section.dataset.pvChosen = '1'; 10697 if (btn) btn.hidden = true; 10698 // Paused first, so play() below fires a fresh play event. 10699 v.pause(); 10700 v.dataset.autoplay = ''; 10701 v.dataset.playNonce = String(Date.now()); 10702 captions(v, false); 10703 v.muted = false; 10704 try { v.currentTime = 0; } catch (_) {} 10705 v.play().catch(() => {}); 10706 }; 10707 10708 // "Watch the film" links anywhere on the page. play() runs inside the 10709 // click, which is what lets it start with sound. 10710 document.addEventListener('click', (e) => { 10711 const link = e.target.closest('[data-play-film]'); 10712 if (!link) return; 10713 const section = document.getElementById(link.dataset.playFilm); 10714 if (!section) return; 10715 e.preventDefault(); 10716 withSound(section); 10717 section.scrollIntoView({ behavior: 'smooth', block: 'center' }); 10718 }); 10719 10720 const quiet = matchMedia('(prefers-reduced-motion: reduce)').matches 10721 || (navigator.connection && navigator.connection.saveData) 10722 || !('IntersectionObserver' in window); 10723 10724 document.querySelectorAll('.pv[data-pv-autoplay]').forEach((section) => { 10725 const v = section.querySelector('video'); 10726 const btn = section.querySelector('.pv-sound'); 10727 btn.addEventListener('click', () => withSound(section)); 10728 // Unmuting from the player's own controls carries on from where it is; 10729 // that play stays marked autoplay, since the page started it. 10730 v.addEventListener('volumechange', () => { 10731 if (!v.muted && v.dataset.autoplay === '1') { v.dataset.autoplay = ''; btn.hidden = true; section.dataset.pvChosen = '1'; captions(v, false); } 10732 }); 10733 if (quiet) return; 10734 new IntersectionObserver((entries) => { 10735 for (const entry of entries) { 10736 if (section.dataset.pvChosen === '1') return; 10737 if (entry.isIntersecting && entry.intersectionRatio >= 0.5) { 10738 if (!v.paused) continue; 10739 v.muted = true; 10740 v.dataset.autoplay = '1'; 10741 captions(v, true); 10742 v.play().then(() => { btn.hidden = false; }).catch(() => {}); 10743 } else if (!v.paused && v.dataset.autoplay === '1') { 10744 v.pause(); 10745 } 10746 } 10747 }, { threshold: [0, 0.5] }).observe(v); 10748 }); 10749 })(); 10750</script>
10750 10751
10751<script> 10752 (function () { 10753 const root = document.querySelector('[data-tst]'); 10754 if (!root) return; 10755 const track = root.querySelector('[data-tst-track]'); 10756 const dots = root.querySelector('[data-tst-dots]'); 10757 const cards = [...track.children]; 10758 if (!cards.length) return; 10759 10760 const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 10761 let timer = null, taken = false; 10762 10763 // how many fit per view, so the dots page rather than count cards 10764 const perView = () => Math.max(1, Math.round(track.clientWidth / cards[0].offsetWidth)); 10765 const pages = () => Math.max(1, Math.ceil(cards.length / perView())); 10766 const current = () => Math.round(track.scrollLeft / (track.clientWidth || 1)); 10767 10768 const goto = (page) => { 10769 const total = pages(); 10770 const p = ((page % total) + total) % total; 10771 track.scrollTo({left: p * track.clientWidth, behavior: reduce ? 'auto' : 'smooth'}); 10772 }; 10773 10774 const syncDots = () => { 10775 const c = current(); 10776 [...dots.children].forEach((d, i) => d.classList.toggle('is-on', i === c)); 10777 }; 10778 10779 const buildDots = () => { 10780 dots.replaceChildren(); 10781 for (let i = 0; i < pages(); i++) { 10782 const b = document.createElement('button'); 10783 b.type = 'button'; 10784 b.className = 'tst-dot'; 10785 b.setAttribute('role', 'tab'); 10786 b.setAttribute('aria-label', 'Reviews page ' + (i + 1)); 10787 b.addEventListener('click', () => { 10788 taken = true; 10789 stop(); 10790 goto(i); 10791 }); 10792 dots.appendChild(b); 10793 } 10794 syncDots(); 10795 }; 10796 10797 const stop = () => { 10798 if (timer) { 10799 clearInterval(timer); 10800 timer = null; 10801 } 10802 }; 10803 const start = () => { 10804 if (!reduce && !taken && !timer) timer = setInterval(() => goto(current() + 1), 7000); 10805 }; 10806 10807 root.querySelector('[data-tst-next]').addEventListener('click', () => { 10808 taken = true; 10809 stop(); 10810 goto(current() + 1); 10811 }); 10812 root.querySelector('[data-tst-prev]').addEventListener('click', () => { 10813 taken = true; 10814 stop(); 10815 goto(current() - 1); 10816 }); 10817 10818 // expanding a review must not leave the rail sliding out from under it 10819 root.querySelectorAll('[data-tst-expand]').forEach(btn => { 10820 btn.addEventListener('click', () => { 10821 taken = true; 10822 stop(); 10823 const quote = btn.previousElementSibling; 10824 const open = !quote.classList.toggle('is-clamped'); 10825 btn.setAttribute('aria-expanded', String(open)); 10826 btn.querySelector('span').textContent = open ? 'Show less' : 'Read the full review'; 10827 }); 10828 }); 10829 10830 root.addEventListener('mouseenter', stop); 10831 root.addEventListener('focusin', () => { 10832 taken = true; 10833 stop(); 10834 }); 10835 root.addEventListener('mouseleave', start); 10836 track.addEventListener('scroll', syncDots, {passive: true}); 10837 window.addEventListener('resize', buildDots); 10838 10839 // do not rotate a rail nobody is looking at 10840 new IntersectionObserver(es => es.forEach(e => e.isIntersecting ? start() : stop()), {threshold: 0.25}).observe(root); 10841 10842 buildDots(); 10843 })(); 10844 </script>
10844 10845 10846</body> 10847</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.