Home / Blog / SEO Checklist for Publishing Any Page: The Step-By-Step C...
SEO

SEO Checklist for Publishing Any Page: The Step-By-Step Checklist

By Aamir Khan .. 06 Sep 2025 .. 06 Sep 2025 • BOFU

The exact on-page SEO checklist to run before publishing any new page the items that consistently separate pages that rank from pages that do not.

Get Consultation ?
? Back to Pillar Guide

Why a pre-publish SEO checklist matters

A page published without basic on-page SEO optimisation will rank below its content quality ceiling because technical and structural signals are missing that help Google understand and position the page correctly. The checklist below takes 15 20 minutes per page and ensures every published page has the technical and content signals that support ranking.

This is not about keyword stuffing or gaming algorithms. It is about ensuring Google gets the right signals about what the page covers, who it is for, and why it is trustworthy.

The 18-item pre-publish SEO checklist

Title tag and meta description

  • [ ] Title tag contains the primary keyword, is under 60 characters, and is unique. Check page source for </code>. If using a CMS, confirm the SEO plugin is setting the title correctly. Unique means no other page on the site uses the same title.</li><li>[ ] <strong>Meta description is 140 160 characters, contains the primary keyword, and is a genuine description of the page.</strong> Not a keyword list. A sentence or two that would make someone click from Google results.</li></ul> <h3 class="fade-up-element">URL structure</h3> <ul class="fade-up-element"><li>[ ] <strong>URL is descriptive, uses hyphens (not underscores), and contains the primary keyword.</strong> <code>/blog/technical-seo-audit-cost</code> not <code>/blog/?p=1247</code> or <code>/blog/technical_seo_audit_cost</code>.</li><li>[ ] <strong>URL is under 75 characters.</strong> Shorter URLs are cleaner in search results and easier to share.</li></ul> <h3 class="fade-up-element">Heading structure</h3> <ul class="fade-up-element"><li>[ ] <strong>There is exactly one H1 tag on the page, containing the primary keyword.</strong> Check page source for <code><h1></code>. The H1 is the page's main heading there should be only one.</li><li>[ ] <strong>H2 subheadings cover the main topics of the page and include supporting keywords naturally.</strong> H2s are used by Google to understand the page's structure and topic coverage.</li><li>[ ] <strong>H3 tags are used for sub-points within H2 sections where appropriate.</strong> Do not skip heading levels (H1 ? H3 without an H2).</li></ul> <h3 class="fade-up-element">Content quality</h3> <ul class="fade-up-element"><li>[ ] <strong>The primary keyword appears in the first 100 words of the page body.</strong> This is an early relevance signal.</li><li>[ ] <strong>The content answers the search intent for the target keyword.</strong> Read the top 5 Google results for the keyword. Does your page match or exceed their usefulness?</li><li>[ ] <strong>Content is at least as comprehensive as the top-ranking competitor pages for the target keyword.</strong> If competitors have 1,200 words on the topic and your page has 300, you are unlikely to outrank them on this signal alone.</li></ul> <h3 class="fade-up-element">Images</h3> <ul class="fade-up-element"><li>[ ] <strong>Every image has a descriptive alt attribute.</strong> <code>alt="technical seo audit checklist for mumbai website"</code> not <code>alt=""</code> or <code>alt="image1.jpg"</code>.</li><li>[ ] <strong>Images are in WebP format and compressed.</strong> Check file size no image should be over 200KB for most use cases.</li><li>[ ] <strong>The LCP image (usually the hero) has explicit width and height attributes and loading="eager".</strong> See <a href="/blog/image-optimisation-for-faster-pages">image optimisation for faster pages</a>.</li></ul> <h3 class="fade-up-element">Internal and external links</h3> <ul class="fade-up-element"><li>[ ] <strong>At least 2 3 internal links from related pages point to this new page.</strong> A new page with no internal links is an orphan Google finds it slowly and ranks it lower. Add links from your most relevant existing pages.</li><li>[ ] <strong>This new page links to 2 4 relevant internal pages.</strong> Internal links distribute page authority and help Google understand content relationships.</li><li>[ ] <strong>External links (if any) point to authoritative sources and open in the same tab (not a new tab for internal links).</strong> Linking to authoritative external sources is an EEAT signal. Excessive outbound links dilute page authority.</li></ul> <h3 class="fade-up-element">Schema and structured data</h3> <ul class="fade-up-element"><li>[ ] <strong>The page has appropriate JSON-LD schema in the <code><head></code>.</strong> Blog posts: BlogPosting + BreadcrumbList. Service pages: Service + LocalBusiness. FAQ sections: FAQPage. Test with Google Rich Results Test before publishing.</li></ul> <h3 class="fade-up-element">Canonical and indexability</h3> <ul class="fade-up-element"><li>[ ] <strong>The page has a canonical tag pointing to its own URL.</strong> Confirm the canonical uses the correct protocol (https), domain variant, and slash convention for your site.</li><li>[ ] <strong>The page is not inadvertently set to noindex.</strong> Check page source for <code><meta name="robots" content="noindex"></code>. Should not be present on pages meant to rank.</li></ul> <div class="inline-cta fade-up-element"> <h3>Ready to take the next step?</h3> <p>Let Perceptra scope the right approach for your business.</p> <a href="/contact" class="btn btn-primary" style="margin-top:12px;">Book a Free Strategy Session ?</a> </div> <h2 id="after-publishing" class="premium-section-title fade-up-element">After publishing</h2> <ul class="fade-up-element"><li>Submit the URL to Google Search Console ? URL Inspection ? Request Indexing. This speeds up Google's discovery of the new page.</li><li>Add internal links from 2 3 existing related pages to the new page (if not done before publishing).</li><li>Monitor the page's ranking and click performance in Search Console for the first 90 days.</li></ul> <h2 id="frequently-asked-questions" class="premium-section-title fade-up-element">Frequently asked questions</h2> <p class="fade-up-element"><strong>How long should the SEO checklist take per page?</strong> 15 20 minutes for a page that was written with SEO in mind. 45 60 minutes if retroactively optimising a page that was written without these considerations.</p> <p class="fade-up-element"><strong>Should every page on the site go through this checklist?</strong> Yes, for new pages. For existing pages, prioritise your highest-value service and product pages first. Work through the rest systematically over 3 6 months.</p> <p class="fade-up-element"><strong>What is the single most impactful item on this checklist?</strong> Internal links from existing pages to the new page. A new page with no internal links may not be discovered and indexed for weeks. Three internal links from related pages accelerates discovery and signals relevance.</p> <div class="author-box fade-up-element"> <div class="author-avatar">AK</div> <div class="author-info"> <h4>Aamir Khan</h4> <p>Founder of <a href="/about" class="author-company-link">Perceptra</a>, a Mumbai digital growth studio. Builds AI automation systems for Indian businesses and writes plainly about what works and what does not.</p> <a href="/our-team" class="author-profile-btn">View Profile ?</a> </div> </div> </div> </article> <aside class="blog-v2-sidebar" aria-label="Article sidebar"> <!-- Table of contents (auto-generated by JS) --> <div class="sidebar-box p-widget"> <h3 class="widget-title">ON THIS PAGE</h3> <ul class="toc-list" id="toc"></ul> </div> <!-- Service CTA --> <style id="premium-sidebar-cta"> .premium-sidebar-cta { background: linear-gradient(145deg, rgba(20,20,25,0.8) 0%, rgba(10,10,12,0.95) 100%); backdrop-filter: blur(12px); border: 1px solid rgba(255,255,255,0.05); border-radius: 20px; padding: 32px 24px; margin-bottom: 40px; text-align: center; position: relative; overflow: hidden; box-shadow: 0 20px 40px rgba(0,0,0,0.5); transition: transform 0.4s ease, box-shadow 0.4s ease; } .premium-sidebar-cta:hover { transform: translateY(-5px); box-shadow: 0 30px 60px rgba(230,0,0,0.15); } .premium-sidebar-cta::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 4px; background: var(--accent-red); box-shadow: 0 0 15px var(--accent-red); } .psc-icon-container { width: 64px; height: 64px; margin: 0 auto 20px auto; border-radius: 50%; background: rgba(230,0,0,0.1); border: 1px solid rgba(230,0,0,0.2); display: flex; align-items: center; justify-content: center; color: var(--accent-red); box-shadow: inset 0 0 15px rgba(230,0,0,0.2), 0 0 20px rgba(230,0,0,0.1); transition: all 0.4s ease; } .premium-sidebar-cta:hover .psc-icon-container { transform: scale(1.1); box-shadow: inset 0 0 20px rgba(230,0,0,0.3), 0 0 30px rgba(230,0,0,0.2); background: rgba(230,0,0,0.15); } .psc-icon-container svg { width: 28px; height: 28px; } .psc-title { font-size: 1.3rem; font-weight: 700; color: #fff; margin-bottom: 12px; line-height: 1.3; } .psc-text { font-size: 0.95rem; color: rgba(255,255,255,0.7); margin-bottom: 24px; line-height: 1.5; } .psc-btn { width: 100%; text-align: center; padding: 14px; border-radius: 10px; font-size: 1.05rem; font-weight: 600; background: var(--accent-red); color: #fff; border: none; cursor: pointer; text-decoration: none; display: inline-block; transition: all 0.3s ease; box-shadow: 0 10px 20px rgba(230,0,0,0.3); } .psc-btn:hover { background: #ff1a1a; box-shadow: 0 15px 30px rgba(230,0,0,0.5); transform: translateY(-2px); color: #fff; } </style> <div class="premium-sidebar-cta fade-up-element"> <div class="psc-icon-container"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 8V4H8"></path> <rect x="4" y="8" width="16" height="12" rx="2" ry="2"></rect> <path d="M2 14h2"></path> <path d="M20 14h2"></path> <path d="M15 13v2"></path> <path d="M9 13v2"></path> </svg> </div> <h3 class="psc-title">Want an AI chatbot that actually converts?</h3> <p class="psc-text">We build custom chatbots that answer, qualify, and close on autopilot.</p> <a href="/services/ai-chatbot-development" class="psc-btn">Get Consultation ?</a> </div> <!-- Related posts --> <style id="premium-related-articles"> .p-related-widget { background: transparent !important; border: none !important; padding: 0 !important; box-shadow: none !important; } .p-related-widget .widget-title { font-size: 0.85rem; color: var(--accent-red); text-transform: uppercase; letter-spacing: 2px; font-weight: 700; margin-bottom: 24px; display: flex; align-items: center; gap: 12px; } .p-related-widget .widget-title::before { content: ''; width: 24px; height: 2px; background: var(--accent-red); } .premium-related-card { display: flex; gap: 16px; padding: 16px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.05); border-radius: 16px; margin-bottom: 16px; text-decoration: none; transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); align-items: center; } .premium-related-card:hover { background: rgba(255,255,255,0.05); border-color: rgba(230,0,0,0.3); transform: translateX(8px); box-shadow: -10px 10px 20px rgba(0,0,0,0.3); } .prc-icon-wrapper { width: 50px; height: 50px; border-radius: 12px; background: rgba(230,0,0,0.05); border: 1px solid rgba(230,0,0,0.2); display: flex; align-items: center; justify-content: center; flex-shrink: 0; color: var(--accent-red); transition: all 0.4s ease; } .premium-related-card:hover .prc-icon-wrapper { background: rgba(230,0,0,0.15); transform: scale(1.1) rotate(-5deg); box-shadow: 0 0 15px rgba(230,0,0,0.3); } .prc-icon-wrapper svg { width: 24px; height: 24px; } .prc-content { flex: 1; } .prc-content h4 { font-size: 0.95rem; color: #fff; margin: 0 0 8px 0; line-height: 1.4; font-weight: 600; transition: color 0.3s; } .premium-related-card:hover .prc-content h4 { color: var(--accent-red); } .prc-meta { font-size: 0.75rem; color: #a1a1aa; display: flex; align-items: center; gap: 6px; text-transform: uppercase; letter-spacing: 1px; } .prc-meta svg { width: 12px; height: 12px; } </style> <div class="p-related-widget fade-up-element"> <h3 class="widget-title">Related Guides</h3> <div class="p-related-list"> <a href="/guides/ai-automation-setup" class="premium-related-card"> <div class="prc-icon-wrapper"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg> </div> <div class="prc-content"> <h4>AI Automation for Businesses: Complete 2026 Guide</h4> <div class="prc-meta"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg> 10 min read </div> </div> </a> <a href="/blog" class="premium-related-card"> <div class="prc-icon-wrapper"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline></svg> </div> <div class="prc-content"> <h4>AI Chatbot Use Cases That Generate Massive ROI</h4> <div class="prc-meta"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg> 8 min read </div> </div> </a> </div> </div> </aside> </div><!-- /blog-layout --> </main> <style id="dynamic-linking-css"> .ind-section { padding: 60px 24px; } .ind-container { max-width: 1200px; margin: 0 auto; } .ind-section-header { text-align: left; margin-bottom: 40px; } .ind-heading { color: #fff; font-size: 1.5rem; margin-bottom: 12px; font-weight: 700; display: flex; align-items: center; gap: 8px; } .ind-subheading { color: #a0aabf; font-size: 1rem; max-width: 600px; } .industries-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px; } .industry-card { background: linear-gradient(145deg, rgba(20,24,34,0.6) 0%, rgba(9,13,22,0.8) 100%); border: 1px solid rgba(255,255,255,0.05); border-radius: 12px; overflow: hidden; display: block; text-decoration: none; transition: all 0.4s ease; position: relative; } .industry-card:hover { transform: translateY(-5px); border-color: rgba(230,0,0,0.4); box-shadow: 0 10px 30px rgba(230,0,0,0.1); } .industry-card::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 3px; background: var(--accent-red); transform: scaleX(0); transform-origin: left; transition: transform 0.4s ease; } .industry-card:hover::before { transform: scaleX(1); } .card-content { padding: 32px 24px; display: flex; flex-direction: column; height: 100%; } .industry-subtitle { color: var(--accent-red); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 1px; font-weight: 600; margin-bottom: 12px; } .industry-title { color: #fff; font-size: 1.2rem; font-weight: 600; margin-bottom: 16px; line-height: 1.4; transition: color 0.3s; } .industry-card:hover .industry-title { color: var(--accent-red); } .industry-link { margin-top: auto; display: flex; align-items: center; gap: 8px; color: #fff; font-size: 0.9rem; font-weight: 600; transition: color 0.3s; } .industry-card:hover .industry-link { color: var(--accent-red); } .link-icon { width: 16px; height: 16px; transition: transform 0.3s; } .industry-card:hover .link-icon { transform: translateX(4px); } </style> <!-- DYNAMIC SECTION LINKING --> <section class="ind-section" style="padding-bottom: 20px;"> <div class="ind-container"> <div class="ind-section-header"> <h2 class="ind-heading">⚡ EXPLORE OTHER INSIGHTS</h2> <p class="ind-subheading">Continue exploring our strategic guides, case studies, and technical breakdowns.</p> </div> <div class="industries-grid"> <a href="/blog/where-a-custom-assistant-beats-a-generic-chatbot" class="industry-card"> <div class="card-content"> <span class="industry-subtitle">Strategic Guide</span> <h3 class="industry-title">Where A Custom Assistant Beats A Generic Chatbot</h3> <div class="industry-link"> <span class="link-text">Read Insight</span> <svg class="link-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg> </div> </div> </a> <a href="/blog/when-to-worry-about-website-downtime" class="industry-card"> <div class="card-content"> <span class="industry-subtitle">Case Study</span> <h3 class="industry-title">When TO Worry About Website Downtime</h3> <div class="industry-link"> <span class="link-text">Read Insight</span> <svg class="link-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg> </div> </div> </a> <a href="/blog/shipping-and-returns-setup-that-builds-trust" class="industry-card"> <div class="card-content"> <span class="industry-subtitle">Strategic Guide</span> <h3 class="industry-title">Shipping And Returns Setup That Builds Trust</h3> <div class="industry-link"> <span class="link-text">Read Insight</span> <svg class="link-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg> </div> </div> </a> <a href="/blog/sales-automation-for-mumbai-b2b-companies" class="industry-card"> <div class="card-content"> <span class="industry-subtitle">Actionable Insight</span> <h3 class="industry-title">Sales Automation For Mumbai B2B Companies</h3> <div class="industry-link"> <span class="link-text">Read Insight</span> <svg class="link-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg> </div> </div> </a> </div> </div> </section> <!-- SECTION 10: INTERNAL LINKS --> <section class="ind-section" style="padding-top: 0;"> <div class="ind-container"> <div style="background: linear-gradient(145deg, rgba(20,24,34,0.6) 0%, rgba(9,13,22,0.8) 100%); border: 1px solid rgba(255,255,255,0.05); border-radius: 16px; padding: 40px; display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 40px; box-shadow: 0 10px 30px rgba(0,0,0,0.5);"> <!-- Explore Services --> <div> <h4 style="color: #fff; font-size: 1.2rem; margin-bottom: 24px; display: flex; align-items: center; gap: 8px;"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--accent-red)" stroke-width="2"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg> Explore Services </h4> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;"> <a href="/services/ai-email-automation" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.05); border-radius: 8px; transition: all 0.3s ease;" onmouseover="this.style.color='#fff'; this.style.borderColor='rgba(230,0,0,0.5)'; this.style.transform='translateY(-2px)'; this.style.boxShadow='0 4px 12px rgba(230,0,0,0.15)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderColor='rgba(255,255,255,0.05)'; this.style.transform='translateY(0)'; this.style.boxShadow='none';">AI Email Automation</a> <a href="/services/internal-company-ai-systems" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.05); border-radius: 8px; transition: all 0.3s ease;" onmouseover="this.style.color='#fff'; this.style.borderColor='rgba(230,0,0,0.5)'; this.style.transform='translateY(-2px)'; this.style.boxShadow='0 4px 12px rgba(230,0,0,0.15)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderColor='rgba(255,255,255,0.05)'; this.style.transform='translateY(0)'; this.style.boxShadow='none';">Internal Company AI Systems</a> <a href="/services/ai-knowledge-bases" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.05); border-radius: 8px; transition: all 0.3s ease;" onmouseover="this.style.color='#fff'; this.style.borderColor='rgba(230,0,0,0.5)'; this.style.transform='translateY(-2px)'; this.style.boxShadow='0 4px 12px rgba(230,0,0,0.15)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderColor='rgba(255,255,255,0.05)'; this.style.transform='translateY(0)'; this.style.boxShadow='none';">AI Knowledge Bases</a> <a href="/services/website-engineering" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.05); border-radius: 8px; transition: all 0.3s ease;" onmouseover="this.style.color='#fff'; this.style.borderColor='rgba(230,0,0,0.5)'; this.style.transform='translateY(-2px)'; this.style.boxShadow='0 4px 12px rgba(230,0,0,0.15)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderColor='rgba(255,255,255,0.05)'; this.style.transform='translateY(0)'; this.style.boxShadow='none';">Website Engineering</a> <a href="/services/marketing-automation" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.05); border-radius: 8px; transition: all 0.3s ease;" onmouseover="this.style.color='#fff'; this.style.borderColor='rgba(230,0,0,0.5)'; this.style.transform='translateY(-2px)'; this.style.boxShadow='0 4px 12px rgba(230,0,0,0.15)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderColor='rgba(255,255,255,0.05)'; this.style.transform='translateY(0)'; this.style.boxShadow='none';">Marketing Automation</a> <a href="/services/growth-retainers" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.05); border-radius: 8px; transition: all 0.3s ease;" onmouseover="this.style.color='#fff'; this.style.borderColor='rgba(230,0,0,0.5)'; this.style.transform='translateY(-2px)'; this.style.boxShadow='0 4px 12px rgba(230,0,0,0.15)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderColor='rgba(255,255,255,0.05)'; this.style.transform='translateY(0)'; this.style.boxShadow='none';">Growth Retainers</a> </div> </div> <!-- Insights --> <div> <h4 style="color: #fff; font-size: 1.2rem; margin-bottom: 24px; display: flex; align-items: center; gap: 8px;"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--accent-red)" stroke-width="2"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path></svg> Latest Insights </h4> <div style="display: flex; flex-direction: column; gap: 4px;"> <a href="/blog/whatsapp-broadcast-vs-spam-staying-compliant" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-left: 2px solid transparent; transition: all 0.3s ease; border-bottom: 1px solid rgba(255,255,255,0.02);" onmouseover="this.style.color='#fff'; this.style.borderLeft='2px solid var(--accent-red)'; this.style.transform='translateX(4px)'; this.style.background='rgba(255,255,255,0.01)'; this.querySelector('.insight-arrow').style.color='var(--accent-red)'; this.querySelector('.insight-arrow').style.transform='translateX(2px)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderLeft='2px solid transparent'; this.style.transform='translateX(0)'; this.style.background='transparent'; this.querySelector('.insight-arrow').style.color='#666'; this.querySelector('.insight-arrow').style.transform='translateX(0)';"> <span style="flex: 1; padding-right: 16px; line-height: 1.4;">Whatsapp Broadcast VS Spam Staying Compliant</span> <span class="insight-arrow" style="color: #666; transition: all 0.3s ease; font-weight: bold;">?</span> </a> <a href="/blog/where-ai-search-traffic-actually-comes-from" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-left: 2px solid transparent; transition: all 0.3s ease; border-bottom: 1px solid rgba(255,255,255,0.02);" onmouseover="this.style.color='#fff'; this.style.borderLeft='2px solid var(--accent-red)'; this.style.transform='translateX(4px)'; this.style.background='rgba(255,255,255,0.01)'; this.querySelector('.insight-arrow').style.color='var(--accent-red)'; this.querySelector('.insight-arrow').style.transform='translateX(2px)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderLeft='2px solid transparent'; this.style.transform='translateX(0)'; this.style.background='transparent'; this.querySelector('.insight-arrow').style.color='#666'; this.querySelector('.insight-arrow').style.transform='translateX(0)';"> <span style="flex: 1; padding-right: 16px; line-height: 1.4;">Where AI Search Traffic Actually Comes From</span> <span class="insight-arrow" style="color: #666; transition: all 0.3s ease; font-weight: bold;">?</span> </a> <a href="/blog/seo-for-mumbai-service-businesses" style="color: #cbd5e1; text-decoration: none; font-size: 0.95rem; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-left: 2px solid transparent; transition: all 0.3s ease; border-bottom: 1px solid rgba(255,255,255,0.02);" onmouseover="this.style.color='#fff'; this.style.borderLeft='2px solid var(--accent-red)'; this.style.transform='translateX(4px)'; this.style.background='rgba(255,255,255,0.01)'; this.querySelector('.insight-arrow').style.color='var(--accent-red)'; this.querySelector('.insight-arrow').style.transform='translateX(2px)';" onmouseout="this.style.color='#cbd5e1'; this.style.borderLeft='2px solid transparent'; this.style.transform='translateX(0)'; this.style.background='transparent'; this.querySelector('.insight-arrow').style.color='#666'; this.querySelector('.insight-arrow').style.transform='translateX(0)';"> <span style="flex: 1; padding-right: 16px; line-height: 1.4;">SEO For Mumbai Service Businesses</span> <span class="insight-arrow" style="color: #666; transition: all 0.3s ease; font-weight: bold;">?</span> </a> </div> </div> <!-- Contact Short (Dynamic) --> <div style="display: flex; flex-direction: column;"> <h4 style="color: #fff; font-size: 1.2rem; margin-bottom: 24px; display: flex; align-items: center; gap: 8px;"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--accent-red)" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect><line x1="8" y1="21" x2="16" y2="21"></line><line x1="12" y1="17" x2="12" y2="21"></line></svg> Direct Contact </h4> <p style="color: #a0aabf; font-size: 0.95rem; line-height: 1.6; margin-bottom: 16px;">Need an immediate <strong style="color: #fff;">SEO Checklist For Publishing ANY Page</strong> strategy? Reach out directly.</p> <div style="display: flex; flex-direction: column; gap: 12px;"> <a href="mailto:hello@perceptra.in" style="color: var(--accent-red); text-decoration: none; font-weight: 600; display: inline-flex; align-items: center; gap: 8px;"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg> hello@perceptra.in </a> <a href="https://wa.me/917977036723" style="color: #25D366; text-decoration: none; font-weight: 600; display: inline-flex; align-items: center; gap: 8px;"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path></svg> +91 79770 36723 </a> <a href="tel:+917977036723" style="color: #4da3ff; text-decoration: none; font-weight: 600; display: inline-flex; align-items: center; gap: 8px;"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path></svg> Call Us Now </a> </div> </div> </div> </div> </section> <!-- Footer Code : EXACT PASTE --> <footer class="site-footer" aria-label="Site Footer"> <div class="container"> <div class="footer-grid-5"> <!-- Col 1: Brand --> <div class="footer-brand"> <div class="footer-logo-wrap"> <svg class="footer-logo-svg" viewBox="0 0 40 40" width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path d="M10 5H24C30.6274 5 36 10.3726 36 17C36 23.6274 30.6274 29 24 29H18V35H10V5Z" fill="#E60000"/> <path d="M18 13H23C25.2091 13 27 14.7909 27 17C27 19.2091 25.2091 21 23 21H18V13Z" fill="#030407"/> </svg> <span class="footer-brand-name">PERCEPTRA</span> </div> <div class="footer-brand-title">Crafting Digital Authority</div> <div class="footer-brand-desc">AI automation and digital growth systems for ambitious businesses.</div> <div class="social-links"> <a href="https://www.linkedin.com/in/perceptra-aamirkhan" class="social-link" aria-label="LinkedIn" target="_blank"> <svg viewBox="0 0 24 24"><path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/></svg> </a> <a href="https://www.instagram.com/perceptra.co/" class="social-link" aria-label="Instagram" target="_blank"> <svg viewBox="0 0 24 24"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/></svg> </a> <a href="https://twitter.com/perceptraco" class="social-link" aria-label="X (Twitter)" target="_blank"> <svg viewBox="0 0 24 24"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg> </a> <a href="https://www.youtube.com/channel/UCraygAM8bbZFWbAmIeBIDVA" class="social-link" aria-label="YouTube" target="_blank"> <svg viewBox="0 0 24 24"><path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z"/></svg> </a> </div> </div> <!-- Col 2: Services --> <div class="footer-col"> <h4>Services</h4> <ul> <li><a href="/services/ai-automation">AI Automation</a></li> <li><a href="/services/ai-chatbot-development">AI Chatbots</a></li> <li><a href="/services/crm-automation">CRM Automation</a></li> <li><a href="/services/business-automation">Business Automation</a></li> <li><a href="/services/seo">SEO & AEO</a></li> <li><a href="/services/website-development">Web Development</a></li> </ul> </div> <!-- Col 3: Company --> <div class="footer-col"> <h4>Company</h4> <ul> <li><a href="/">Home</a></li> <li><a href="/about">About Us</a></li> <li><a href="/our-team">Our Team</a></li> <li><a href="/portfolio">Portfolio</a></li> <li><a href="/process">Process</a></li> <li><a href="/pricing">Pricing</a></li> <li><a href="/reviews">Reviews</a></li> <li><a href="/contact">Contact</a></li> </ul> </div> <!-- Col 4: Resources --> <div class="footer-col"> <h4>Resources</h4> <ul> <li><a href="/case-studies">Case Studies</a></li> <li><a href="/guides">Guides</a></li> <li><a href="/portfolio">Portfolio</a></li> <li><a href="/blog">Blog</a></li> <li><a href="/faq">FAQs</a></li> <li><a href="/glossary">Glossary</a></li> <li><a href="/resources">Resources</a></li> </ul> </div> <!-- Col 5: Contact --> <div class="footer-col contact-list"> <h4>Contact</h4> <div class="contact-item"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"></path><circle cx="12" cy="10" r="3"></circle></svg> <a href="https://www.google.com/maps/place/Urmi+corporate+park+solaris/@19.1239421,72.8899484,18.96z/data=!4m7!3m6!1s0x3be7c90e9e797ec5:0x91224e7ca88ef4b4!4b1!8m2!3d19.1238217!4d72.8907552!16s%2Fg%2F11y1byxqjx?entry=ttu&g_ep=EgoyMDI2MDIyNS4wIKXMDSoASAFQAw%3D%3D" target="_blank" rel="noopener noreferrer" style="line-height: 1.6;">Powai, Mumbai<br>Maharashtra, India</a> </div> <div class="contact-item"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg> <a href="mailto:hello@perceptra.in">hello@perceptra.in</a> </div> <div class="contact-item"> <svg 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 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path></svg> <a href="tel:+917977036723">+91 79770 36723</a> </div> <div class="contact-item"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"></line></svg> <a href="https://www.instagram.com/perceptra.co/" target="_blank" rel="noopener noreferrer">@perceptra.co</a> </div> </div> </div> <div class="footer-bottom-bar"> <div>© 2026 Perceptra. All rights reserved.</div> <div class="footer-bottom-links"> <a href="/privacy-policy">Privacy Policy</a> <span class="divider">|</span> <a href="/terms-and-conditions">Terms of Service</a> <span class="divider">|</span> <a href="/refund-policy">Refund Policy</a> </div> </div> </div> </footer> <style> /* --- FAQ SECTION ACCORDION --- */ .faq-container { display: flex; flex-direction: column; gap: 0; } .faq-item { border-bottom: 1px solid rgba(255,255,255,0.05); } .faq-question { width: 100%; background: transparent; border: none; color: #fff; padding: 24px 0; font-size: 1.1rem; font-weight: 700; letter-spacing: 1px; display: flex; justify-content: space-between; align-items: center; cursor: pointer; text-align: left; font-family: 'Inter', sans-serif; transition: color 0.3s ease; } .faq-question:hover { color: var(--accent-red); } .faq-icon { width: 24px; height: 24px; color: #4a5568; transition: transform 0.3s ease, color 0.3s ease; } .faq-question[aria-expanded="true"] .faq-icon { transform: rotate(45deg); color: var(--accent-red); } .faq-answer { max-height: 0; overflow: hidden; transition: max-height 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94), opacity 0.3s ease; opacity: 0; } .faq-answer p { padding-bottom: 24px; color: var(--text-muted); font-size: 1rem; line-height: 1.7; margin: 0; } .faq-question[aria-expanded="true"] + .faq-answer { max-height: 300px; opacity: 1; } </style> <script> // --- CUSTOM CURSOR --- const cursor = document.getElementById('dsn-cursor'); const cursorText = cursor.querySelector('.cursor-text'); if (window.matchMedia("(pointer: fine)").matches) { document.body.classList.add('cursor-active'); let mouseX = window.innerWidth / 2; let mouseY = window.innerHeight / 2; let cursorX = mouseX; let cursorY = mouseY; function animateCursor() { cursorX += (mouseX - cursorX) * 0.2; cursorY += (mouseY - cursorY) * 0.2; if (cursor) { cursor.style.transform = `translate(${cursorX}px, ${cursorY}px)`; } requestAnimationFrame(animateCursor); } requestAnimationFrame(animateCursor); window.addEventListener('mousemove', (e) => { mouseX = e.clientX; mouseY = e.clientY; }); const hoverTargets = document.querySelectorAll('a, button, .move-circle, .btn, [tabindex="0"]'); hoverTargets.forEach(el => { el.addEventListener('mouseenter', () => cursor.classList.add('cursor-hover')); el.addEventListener('mouseleave', () => cursor.classList.remove('cursor-hover')); }); const textTargets = document.querySelectorAll('[data-cursor]'); textTargets.forEach(el => { el.addEventListener('mouseenter', function() { const text = this.getAttribute('data-cursor'); cursor.classList.add('has-text'); cursorText.textContent = text; }); el.addEventListener('mouseleave', function() { cursor.classList.remove('has-text'); cursorText.textContent = ''; }); }); } // ============================== // PREMIUM SCROLL PROGRESS SYSTEM (Removed) // ============================== // --- PRELOADER & DSN ENTRY ANIMATIONS --- document.addEventListener("DOMContentLoaded", () => { let percent = 0; const preloader = document.getElementById('preloader'); const percentText = document.getElementById('preloader-percent'); const fillLogo = document.querySelector('.text-fill-logo'); document.body.style.overflow = 'hidden'; const loadingInterval = setInterval(() => { percent += Math.floor(Math.random() * 12) + 1; if (percent >= 100) { percent = 100; clearInterval(loadingInterval); setTimeout(completeLoading, 300); } if (percentText) percentText.innerText = percent + '%'; if (fillLogo) fillLogo.style.setProperty('--fill-width', percent + '%'); }, 30); function completeLoading() { if (preloader) preloader.classList.add('hidden'); document.body.style.overflow = ''; setTimeout(() => { const animElements = document.querySelectorAll('.dsn-load-animate'); animElements.forEach((el, index) => { setTimeout(() => { el.classList.add('dsn-active'); }, index * 100); }); }, 400); } }); // --- HERO PARALLAX SCROLL EFFECT --- const parallaxBg = document.querySelector('.dsn-hero-parallax-img'); window.addEventListener('scroll', () => { if (parallaxBg) { const scrollY = window.pageYOffset || document.documentElement.scrollTop; parallaxBg.style.transform = `translateY(${scrollY * 0.4}px)`; } }); // --- TESTIMONIAL SWIPER LOGIC (Drag & Touch) --- const track = document.getElementById('swiperTrack'); if (track) { const swiperSlides = Array.from(track.children); const nextBtn = document.getElementById('nextBtn'); const prevBtn = document.getElementById('prevBtn'); let currentIndex = 0; let startPos = 0; let currentTranslate = 0; let prevTranslate = 0; let isDragging = false; let animationID; function updateSliderPosition() { track.style.transform = `translateX(${currentTranslate}px)`; } function setSliderPositionByIndex() { const swiperWidth = track.parentElement.offsetWidth; currentTranslate = currentIndex * -swiperWidth; prevTranslate = currentTranslate; track.style.transition = 'transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94)'; updateSliderPosition(); } // Arrow Controls if (nextBtn) { nextBtn.addEventListener('click', () => { if (currentIndex < swiperSlides.length - 1) { currentIndex += 1; setSliderPositionByIndex(); } }); } if (prevBtn) { prevBtn.addEventListener('click', () => { if (currentIndex > 0) { currentIndex -= 1; setSliderPositionByIndex(); } }); } // Touch & Drag Logic function touchStart(index) { return function(event) { isDragging = true; startPos = getPositionX(event); animationID = requestAnimationFrame(animation); track.style.transition = 'none'; // remove transition during drag } } function touchMove(event) { if (isDragging) { const currentPosition = getPositionX(event); currentTranslate = prevTranslate + currentPosition - startPos; } } function touchEnd() { isDragging = false; cancelAnimationFrame(animationID); const movedBy = currentTranslate - prevTranslate; if (movedBy < -100 && currentIndex < swiperSlides.length - 1) currentIndex += 1; if (movedBy > 100 && currentIndex > 0) currentIndex -= 1; setSliderPositionByIndex(); } function getPositionX(event) { return event.type.includes('mouse') ? event.pageX : event.touches[0].clientX; } function animation() { updateSliderPosition(); if (isDragging) requestAnimationFrame(animation); } swiperSlides.forEach((slide, index) => { slide.addEventListener('touchstart', touchStart(index), {passive: true}); slide.addEventListener('touchend', touchEnd); slide.addEventListener('touchmove', touchMove, {passive: true}); slide.addEventListener('mousedown', touchStart(index)); slide.addEventListener('mouseup', touchEnd); slide.addEventListener('mouseleave', () => { if(isDragging) touchEnd(); }); slide.addEventListener('mousemove', touchMove); }); window.addEventListener('resize', setSliderPositionByIndex); } // --- INTERSECTION OBSERVER FOR "MOVE-UP" ELEMENTS --- const observerOptions = { root: null, rootMargin: '0px 0px -50px 0px', threshold: 0.15 }; const scrollObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('dsn-active'); observer.unobserve(entry.target); } }); }, observerOptions); document.querySelectorAll('.move-up').forEach(el => { scrollObserver.observe(el); }); // --- FLOATING CHATBOT LOGIC --- const chatbotToggle = document.getElementById('chatbot-toggle'); const chatbotWindow = document.getElementById('chatbot-window'); const chatbotInput = document.getElementById('chatbot-input'); const chatbotSend = document.getElementById('chatbot-send'); const chatbotBody = document.getElementById('chatbot-body'); if (chatbotToggle && chatbotWindow) { chatbotToggle.addEventListener('click', () => { chatbotWindow.classList.toggle('hidden'); if (chatbotWindow.classList.contains('hidden')) { chatbotToggle.innerHTML = '<svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="11" width="18" height="10" rx="2"></rect><circle cx="12" cy="5" r="2"></circle><path d="M12 7v4"></path><line x1="8" y1="16" x2="8" y2="16"></line><line x1="16" y1="16" x2="16" y2="16"></line></svg>'; } else { chatbotToggle.innerHTML = '<svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>'; setTimeout(() => chatbotInput.focus(), 300); } }); function sendChatMessage() { const text = chatbotInput.value.trim(); if (!text) return; const userMsg = document.createElement('div'); userMsg.className = 'chat-message user-message'; userMsg.innerHTML = `<p>${text}</p>`; chatbotBody.appendChild(userMsg); chatbotInput.value = ''; chatbotBody.scrollTop = chatbotBody.scrollHeight; setTimeout(() => { const botMsg = document.createElement('div'); botMsg.className = 'chat-message bot-message'; botMsg.innerHTML = ` <p style="margin-bottom: 0;">Thank you for your message! Our team will get back to you shortly. For immediate assistance, please use the options below.</p> <div class="chat-actions"> <a href="tel:+917977036723" class="chat-btn"> <svg viewBox="0 0 24 24"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></svg> PHONE </a> <a href="mailto:info@perceptra.in" class="chat-btn"> <svg viewBox="0 0 24 24"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg> MAIL </a> <a href="https://wa.me/917977036723?text=Hi+Perceptra+team,+I+would+like+to+discuss+my+requirements." class="chat-btn chat-btn-full" target="_blank"> <svg viewBox="0 0 24 24"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg> WHATSAPP </a> </div> `; chatbotBody.appendChild(botMsg); chatbotBody.scrollTop = chatbotBody.scrollHeight; }, 800); } chatbotSend.addEventListener('click', sendChatMessage); chatbotInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') sendChatMessage(); }); } // --- FAQ ACCORDION LOGIC --- const faqQuestions = document.querySelectorAll('.faq-question'); faqQuestions.forEach(question => { question.addEventListener('click', () => { const expanded = question.getAttribute('aria-expanded') === 'true'; question.setAttribute('aria-expanded', !expanded); }); }); // --- SECURITY SCRIPT: Disable Inspect / Dev Tools --- // Disable Right-Click document.addEventListener('contextmenu', event => event.preventDefault()); // Disable Keyboard Shortcuts document.addEventListener('keydown', function(e) { // Block F12 (Dev Tools) if (e.key === 'F12') { e.preventDefault(); } // Block Ctrl+Shift+I (Inspect), Ctrl+Shift+J (Console), Ctrl+Shift+C (Element Inspect) if (e.ctrlKey && e.shiftKey && (e.key === 'I' || e.key === 'i' || e.key === 'J' || e.key === 'j' || e.key === 'C' || e.key === 'c')) { e.preventDefault(); } // Block Ctrl+U (View Source), Ctrl+S (Save), Ctrl+C (Copy), Ctrl+A (Select All) if (e.ctrlKey && (e.key === 'U' || e.key === 'u' || e.key === 'S' || e.key === 's' || e.key === 'C' || e.key === 'c' || e.key === 'A' || e.key === 'a')) { e.preventDefault(); } }); </script> <!-- Global Anchor URL Fix --> <script> document.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { e.preventDefault(); targetElement.scrollIntoView({ behavior: 'smooth' }); } }); }); }); </script> <script> document.addEventListener('DOMContentLoaded', () => { const tocContainer = document.getElementById('toc'); if (!tocContainer) return; const headings = document.querySelectorAll('.blog-v2-main h2:not(.foundation-sticky-card h2):not(.section-title)'); let tocHtml = ''; headings.forEach((h2, index) => { const id = h2.id; const text = h2.textContent.trim(); const num = index + 1; tocHtml += ` <li> <span class="toc-num">${num}.</span> <a href="#${id}" class="toc-link">${text}</a> </li> `; }); tocContainer.innerHTML = tocHtml; // Intersection Observer for highlighting the active section const observerOptions = { root: null, rootMargin: '0px 0px -80% 0px', threshold: 0 }; const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { // Remove active class from all links document.querySelectorAll('.toc-link').forEach(link => { link.style.color = '#a1a1aa'; link.style.fontWeight = 'normal'; }); // Add active class to current link const activeLink = document.querySelector(`.toc-link[href="#${entry.target.id}"]`); if (activeLink) { activeLink.style.color = '#fff'; activeLink.style.fontWeight = '700'; } } }); }, observerOptions); headings.forEach(h2 => observer.observe(h2)); // Smooth scrolling for TOC links document.querySelectorAll('.toc-link').forEach(link => { link.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); if (targetElement) { window.scrollTo({ top: targetElement.getBoundingClientRect().top + window.scrollY - 120, // offset for sticky header behavior: 'smooth' }); } }); }); }); </script> <script> document.addEventListener('DOMContentLoaded', () => { const faqItems = document.querySelectorAll('.faq-item'); faqItems.forEach(item => { const questionBtn = item.querySelector('.faq-question'); questionBtn.addEventListener('click', () => { const isActive = item.classList.contains('active'); // Close all others faqItems.forEach(otherItem => { otherItem.classList.remove('active'); otherItem.querySelector('.faq-answer').style.maxHeight = null; }); if (!isActive) { item.classList.add('active'); const answer = item.querySelector('.faq-answer'); answer.style.maxHeight = answer.scrollHeight + "px"; } }); }); }); </script> <style id="content-polish-v1"> /* content-polish-v1 : Related Guides card fix only. FAQ accordion left to the site's original CSS/JS (collapsed by default, click to expand). Presentation only. */ /* Related Guides: overlapping watermark icon -> clean leading icon tile */ .premium-related-card { gap: 14px !important; align-items: center !important; } .premium-related-card .prc-icon-wrapper { position: static !important; right: auto !important; bottom: auto !important; width: 44px !important; height: 44px !important; opacity: 1 !important; flex-shrink: 0 !important; pointer-events: auto !important; z-index: auto !important; border-radius: 10px !important; background: rgba(230,0,0,0.08) !important; border: 1px solid rgba(230,0,0,0.15) !important; color: #e60000 !important; } .premium-related-card .prc-icon-wrapper svg { width: 22px !important; height: 22px !important; } .premium-related-card .prc-content { min-width: 0 !important; } </style> <!-- Floating Contact Options --> <div class="floating-contact-widget" style="position: fixed; bottom: 100px; left: 20px; z-index: 9999; display: flex; flex-direction: column; gap: 15px;"> <!-- Floating Phone Button --> <a href="tel:+917977036723" class="floating-action-btn floating-phone" aria-label="Call Us" style="display:flex; justify-content:center; align-items:center; width:50px; height:50px; border-radius:50%; background:rgba(10,12,18,0.85); border:1px solid rgba(255,255,255,0.3); color:#fff; box-shadow:0 4px 10px rgba(0,0,0,0.3); transition:all 0.3s ease;"> <svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></svg> </a> <!-- Floating Email Button --> <a href="mailto:hello@perceptra.in" class="floating-action-btn floating-email" aria-label="Email Us" style="display:flex; justify-content:center; align-items:center; width:50px; height:50px; border-radius:50%; background:rgba(10,12,18,0.85); border:1px solid rgba(255,255,255,0.3); color:#fff; box-shadow:0 4px 10px rgba(0,0,0,0.3); transition:all 0.3s ease;"> <svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg> </a> <!-- Floating WhatsApp Button --> <a href="https://wa.me/917977036723?text=*URGENT%3A%20Floating%20Quick-Connect*%0A%0AHi%20Perceptra%20team%2C%20I%20just%20clicked%20the%20quick-connect%20button%20on%20your%20site.%20I%20have%20an%20immediate%20requirement%20and%20need%20to%20speak%20with%20an%20expert%20right%20now.%20Please%20bypass%20the%20standard%20queue." target="_blank" class="floating-wa" aria-label="Chat on WhatsApp" style="display:flex; justify-content:center; align-items:center; width:50px; height:50px; border-radius:50%; background:#25D366; border:none; color:#fff; box-shadow:0 4px 15px rgba(37,211,102,0.4); transition:all 0.3s ease;"> <svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"> <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.505-.883-.814-1.479-1.82-1.653-2.118-.173-.298-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a12.8 12.8 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413Z"/> </svg> </a> </div> <style> .floating-contact-widget a:hover { transform: translateY(-3px) scale(1.05); } </style> </body></html>
GROWTH STRATEGY

Ready to Build
This For Your Business?

Book a strategy session. We scope your first project in 30 minutes, no jargon, no obligation.

Custom ScopingTailored to your needs
Fixed PricingNo hidden surprises
Expert TeamLocal Mumbai devs
Quick LaunchLive in under 14 days