Mann Made Mann Made SEO & Performance Proposal
21 May 2026 Prepared for Maya
Mann MadeMann Made MayaMaya Mobile Vol. 1 · No. 01

Why the views
are going quiet.

A direct read of maya.net, its robots policy, its 424-URL sitemap, and the parts of the funnel competitors are eating. Filed from the live HTML on 21 May 2026. Built in 10 days, then a month of ongoing SEO support.

Sitemap URLs
0
191 country pages · 212 ES mirrors
Homepage H1 count
0
No topical anchor for Google
AI crawlers allowed
0/9
GPTBot, ClaudeBot, Perplexity blocked
Blog / guide URLs
0
Zero content-marketing surface
01Executive summary

Four reasons. None of them are the product.

How to read thisOrdered by likely impact on the recent view loss. Every finding is verified directly from the live site.
01

The homepage has no H1.

The SSR HTML ships a single H2 ("One Plan.") and a stack of footer H3s. Google has no primary topical heading. A 30-minute fix.

P0 · critical
02

AI bots are blocked.

robots.txt blocks GPTBot, ClaudeBot, Google-Extended, PerplexityBot's sources, Applebot-Extended, Bytespider and more. ChatGPT and Perplexity cannot cite Maya.

P0 · critical
03

Zero blog content.

424 URLs, of which 191 are country landing pages and 212 are Spanish mirrors. No blog, no guides, no how-tos. Airalo publishes weekly into the gap.

P0 · critical
04

Heavy fonts on mobile.

Nine weights of a custom display font, all in legacy .otf. The full Bootstrap palette inlined. Viewport blocks zoom. Each one a measurable LCP loss.

P0 · critical
02Site vitals

What the homepage actually ships.

MethodPulled live with a browser user-agent, parsed the head, walked the sitemap, read the robots file. Every number traces to a live HTTP response.
Maya hero mountain illustration
Fig. 01 · Hero asset The travel illustration is loaded above the fold. The H1 is not. src: maya.net/home/hero-mountain-bg.webp
Homepage HTML
0 KB
Mostly inlined Bootstrap CSS
H1 tags
0
No primary heading
Font weights, .otf
0
JuturuBlaarr, 100 to 900
JSON-LD schemas
0
Should be 4 to 6
Country pages
0
Indexed via sitemap
Hreflang languages
0
en, es. Nothing else.
03Detailed findings

Findings, with receipts.

How to readPriority left. Evidence pulled live in the middle. The fix on the right.
P0 · Critical on-page · structure

No <h1> on the homepage.

The hero ships "One Plan." as an H2. The footer contributes six H3s. There is no H1 anywhere in the served HTML. For Google, this is a page with no primary topic. For screen readers, it's a fragment.

# grep -oE '<h[123][^>]*>' maya.net/ H1: (none) H2: "One Plan." H3: Useful Links, Popular Destinations, Help, Our Address, Follow Us, Available Languages # all in footer

The fix

  1. Add an H1 in the hero. Suggested copy: "Travel eSIM for 165+ countries. Install once, roam everywhere."
  2. Drop "One Plan." to H2 inside that section.
  3. Walk every /esim/{country} page and check the same.
P0 · Critical discoverability · ai

Every AI search crawler is blocked.

robots.txt sets Content-Signal: ai-train=no and disallows nine major bots. That includes the agents that power ChatGPT search, Perplexity, Claude answers, Google AI Overviews, and Apple Intelligence. When someone asks an AI assistant which eSIM to use in Japan, Airalo and Holafly can be cited. Maya cannot. This is the single most likely cause of the recent traffic drop.

# maya.net/robots.txt, current User-agent: Amazonbot Disallow: / User-agent: Applebot-Extended Disallow: / # Apple Intelligence User-agent: Bytespider Disallow: / User-agent: CCBot Disallow: / # Perplexity sources User-agent: ClaudeBot Disallow: / User-agent: Google-Extended Disallow: / # Google AI Overviews User-agent: GPTBot Disallow: / User-agent: meta-externalagent Disallow: /

Split the policy

  1. Allow citation bots: OAI-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended, ClaudeBot.
  2. Keep blocking training: GPTBot, CCBot, Bytespider if the IP stance still matters.
  3. Add a Sitemap: directive at the top of robots.txt. Currently missing.
Maya global coverage illustration
Fig. 02 · Global mark Maya's globe sells the breadth of coverage. The robots policy ensures AI assistants cannot pass that promise along. src: maya.net/home/hero-global-illustration.webp
P0 · Critical content · strategy

The sitemap has no blog content.

424 URLs total. Not one of them is a blog post, guide, article, or how-to. Airalo's blog owns the top-of-funnel queries: "how to install eSIM on iPhone," "best eSIM for Japan," "eSIM vs SIM." Maya competes only at the bottom, on transactional pages. The awareness layer is conceded by default.

# Sitemap inventory, maya.net/sitemap.xml Total URLs: 424 /esim/<country>: 191 # good programmatic work /es/* Spanish mirror: 212 /plans/*: 9 /blog | /guide | /article: 0

First 12 posts

  1. How to install eSIM on iPhone, Pixel, Samsung Galaxy.
  2. eSIM compatible phones, kept evergreen.
  3. Maya vs Airalo, vs Holafly, vs Saily.
  4. Best eSIM for Japan, Thailand, the EU, the US, the UK, Mexico.
P1 · High international · hreflang

Only English and Spanish are declared.

The hreflang block lists en, es, and x-default. Nothing else. Travel eSIM demand is global. Japanese, Korean, German, French, Italian, Portuguese, Arabic and Chinese audiences are all high-LTV. Either the language variants exist and aren't declared, or they don't exist yet. Both cases are fixable.

<link rel="alternate" hreflang="en" href="https://maya.net/"> <link rel="alternate" hreflang="es" href="https://maya.net/es"> <link rel="alternate" hreflang="x-default" href="https://maya.net/"> # Missing: fr, de, it, pt, ja, ko, zh, ar, ru

The fix

  1. Start with French, German, Italian, Portuguese, Japanese, Korean.
  2. Every page in every language declares reciprocal hreflang to every other.
  3. Self-canonical to the language URL, never to the English root.
P1 · High structured data · rich results

One JSON-LD block, when there should be five.

Trustpilot has 2,585 reviews at 4.6 stars. None of that is wired into Product or AggregateRating schema on the country pages. The homepage FAQ accordion has no FAQPage schema. There's no Organization, no WebSite with SearchAction. Each one is SERP real estate competitors already own.

Schema to add

  1. Organization + WebSite with SearchAction on the homepage.
  2. FAQPage wired to the existing FAQ accordion.
  3. Product + Offer + AggregateRating on every /esim/{country}.
  4. BreadcrumbList on country and shop pages.
P2 · Hygiene head · meta

Obsolete meta tags, missing social cards.

The head still carries <meta name="keywords">. Google has ignored that since 2009. There's also a non-standard secondary_keywords tag doing nothing. At the same time, og:image, og:type, twitter:card and twitter:image are all missing, so any link shared in Slack, WhatsApp, or X previews as a plain URL.

# Present, useless <meta name="keywords" content="global eSIM, affordable data eSIM..."> <meta name="secondary_keywords" content="..."> # Missing, needed <meta property="og:image" content=".../og-card.png"> <meta property="og:type" content="website"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:image" content=".../twitter-card.png">

The fix

  1. Delete keywords and secondary_keywords.
  2. Ship a 1200×630 OG card and a Twitter card image.
  3. Normalize canonical to include the trailing slash.
P2 · Hygiene canonical · url

Canonical does not match the served URL.

The page resolves at https://maya.net/. The canonical points to https://maya.net. Low impact, but it's a mismatch signal the SSR template can fix in one line. Worth auditing all 424 sitemap URLs for the same pattern.

The fix

  1. One-line change in the head template.
  2. Run a sitemap sweep for any other canonical drift.
~0%of travel queries now resolve inside an AI surface · industry estimate, 2026

The lost views are not lost.
They went somewhere Maya isn't allowed.

"Best eSIM for Tokyo," "cheapest data plan for Europe," "how do I get internet on a cruise." These queries used to land on a search-results page. Now they often resolve inside ChatGPT, Claude, Perplexity, or Google's AI Overview, with two or three brands cited. The brands that get cited are the ones whose robots.txt allows it. Maya, by current policy, doesn't.

The fix is not "give up your data to AI training." A split policy lets the indexing-only bots through while still refusing model training. Most competitors have already made this trade.

04Speed & core web vitals

Speed, the parts that actually move LCP.

MethodFindings below come from direct inspection of the SSR HTML. Each one maps to a concrete change in the codebase and a measurable Lighthouse improvement.
Lighthouse · Mobile · 21 May 2026, 18:45 GMT+2 PageSpeed Insights · Moto G Power · Slow 4G · Lighthouse 13.0.1
0
Performance
0
Accessibility
0
Best Practices
0
SEO
FCP0 s
LCP0 s
TBT0 ms
CLS0
Speed Index0 s
Real users vs lab

Field data from real users over the last 28 days passes Core Web Vitals: LCP 1.7s, INP 122ms, CLS 0. The lab test scores 45/100 because it simulates cold caches and slow networks. That's exactly the condition most travelers connect under. The lab is the more honest measurement for Maya's audience, and the score competitors and stakeholders see when they audit the site.

Maya travel-mode toggle on smartphone
Fig. 03 · Mobile UI The hero smartphone illustration loads above the fold. The fonts behind the type on this screen ship as nine separate OTF files. That's where the LCP goes. src: maya.net/home/travel-mode-toggle.webp
P0 · Critical fonts · lcp

Nine weights of JuturuBlaarr in legacy .otf.

The hero display font ships every weight from Thin to Black, served as OpenType binaries. OTF is roughly a third larger than WOFF2, and the browser cache treats it as second class. Lighthouse currently measures TBT at 1,230 ms (target: under 200), and a meaningful slice of that is the font-swap window. Subset to Latin, convert to WOFF2, preload only the hero weight, set font-display:optional on the rest.

# Current @font-face{font-family:JuturuBlaarr;src:url(.../juturu-blaarr-extrabold.otf) format("opentype");font-weight:800} # Repeated for 100, 200, 300, 400, 500, 600, 700, 800, 900 # Recommended @font-face{font-family:JuturuBlaarr;src:url(.../juturu-blaarr-extrabold.woff2) format("woff2"); font-weight:800; font-display:optional; unicode-range:U+0000-00FF}

Expected gain

  1. Font payload down 60 to 80 percent.
  2. Mobile LCP down 200 to 600 ms in practice.
  3. font-display:optional on non-hero weights kills the late-swap CLS.
P1 · High css · render-blocking

The full Bootstrap palette is inlined.

The homepage uses a tiny subset of Bootstrap (containers, rows, a handful of utility classes). The HTML ships the whole variable palette plus most of the utility library. The result is a 765 KB document where most of the CSS is dead weight that still has to parse before the page can paint. Lighthouse confirms: 124 KiB of unused CSS on the homepage alone.

The fix

  1. Run PurgeCSS or Angular's CSS optimizer against actual templates.
  2. Inline only critical above-the-fold styles. The rest is already in styles-UKKZPLNH.css.
  3. Realistic target: 80 to 120 KB HTML, down from 765 KB.
P0 · Critical js · unused bundles

514 KiB of JavaScript is shipped and never used.

The single largest PageSpeed opportunity. The Angular bundle includes route-level chunks the visitor never hits, polyfills for browsers that no longer exist, and legacy JS that targets pre-ES2018 syntax. JavaScript execution time on the main thread is 3.1 s, total main-thread work is 7.1 s, and Lighthouse counts 20 long tasks blocking input during page load.

# From the May 21 PageSpeed run Reduce unused JavaScript: 514 KiB ← biggest single win Reduce unused CSS: 124 KiB Use efficient cache lifetimes: 247 KiB Legacy JavaScript: 50 KiB Improve image delivery: 39 KiB JS execution time: 3.1 s Total main-thread work: 7.1 s Long tasks during load: 20

The fix

  1. Use Angular's esbuild production target with differential loading disabled for modern browsers only.
  2. Route-split aggressively. Country pages do not need the cruise booking module loaded up front.
  3. Drop polyfills for browsers below the 99% support threshold.
  4. Set Cache-Control: max-age=31536000, immutable on hashed bundles for the 247 KiB cache win.
P1 · High a11y · lighthouse

Viewport blocks zoom.

The meta viewport sets maximum-scale=1, user-scalable=no. That violates WCAG 1.4.4 and triggers a Lighthouse accessibility failure. Beyond compliance, it stops low-vision users (a meaningful share of the senior travel demographic) from pinch-to-zoom on mobile.

<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> # Recommended <meta name="viewport" content="width=device-width,initial-scale=1">

The fix

  1. Drop maximum-scale and user-scalable. One change, ships in seconds.
  2. Lighthouse accessibility and SEO scores climb the next deploy.
P2 · Medium js · preload

Ten Angular chunks preloaded on every page.

The head fires ten modulepreload directives covering chunks the visitor may never reach. That puts non-critical JS on the critical request path. Switch the route-specific ones to prefetch so the browser fetches when idle.

The fix

  1. Audit Angular's route map. Only preload chunks the current view actually needs.
  2. Demote the rest to <link rel="prefetch">.
P2 · Medium images · cls

Image elements are missing width and height.

Flagged by Lighthouse Best Practices. Real-user CLS is currently 0 because the field cache is warm and layout settles before paint, but on a cold mobile load the browser has to reflow when each image resolves. That's part of why the lab CLS is 0.003 and the Speed Index is 9.9 s. Setting explicit dimensions also helps with displayed-images-with-incorrect-aspect-ratio, another current Best Practices fail.

The fix

  1. Add explicit width and height attributes to every <img> in the SSR templates.
  2. Pair with aspect-ratio in CSS so the slot is reserved before the image resolves.
Already done scripts · 3rd-party

The third-party tags are properly deferred.

GTM, Klaviyo, TikTok Pixel, and Usercentrics CMP are all wrapped in requestIdleCallback with a 5-second fallback. Hero images are .webp. Preconnects exist for the font origin and the asset CDN. Whoever built the performance layer here knew what they were doing. Keep that person in the room for the next pass.

Next level

  1. Add AVIF fallback for hero images. Another 20 to 30 percent on supported browsers.
  2. Use size-adjust and ascent-override on @font-face to lock layout against the swap.
05Competitor landscape

The league, read honestly.

SourcePublic reviews, Trustpilot, the brands' own marketing, and our own work in adjacent travel-tech accounts.
Brand SEO surface Their moat Where Maya wins
Maya 191 country pages. No blog. Two hreflang languages. Cruise plans (20+), 24/7 human support, unlimited data, 4.6 from 2,585 reviews. Lead on cruise and human support. Build the content layer. Open the AI bot policy.
Airalo Biggest country library. Deep blog. Dominant on brand search. App-first install, programmatic SEO at scale, paid affiliate flywheel. Their UX is fiddly. Their support is slower. Lead with humans and web-only simplicity.
Holafly Strong PR for unlimited. Big in the EU and LATAM. Influencer marketing, "unlimited" brand association. They limit tethering on many plans. Maya offers free hotspot. Say so above the fold.
Saily Young brand, growing fast via NordVPN cross-sell. Brand trust from Nord, paid acquisition. Saily is generalist. Maya is travel-specialist with cruise. Niche outranks generic.
Nomad Strong in APAC. Thin English content. APAC pricing, carrier deals. Maya's geography is wider. The English copy is better. Cruise is the wedge.
Ubigi Strong B2B and in-flight. Weak D2C SEO. Airline and OEM partnerships (Transatel, NTT). Direct-to-consumer is theirs to lose. Maya should own "easy travel eSIM" intent.
Scroll table horizontally
06The plan

The plan, in three lanes.

OrderLane 1 recovers ground. Lane 2 grows share. Lane 3 builds the moat.
Lane 01

Recover

Days 1 to 3 · Engineering
  1. Add an H1 to the homepage hero. Walk the country pages and check the same.
  2. Split the AI bot policy. Allow OAI-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended, ClaudeBot. Add a Sitemap directive.
  3. Convert JuturuBlaarr from OTF to WOFF2, subset Latin, set font-display:optional on non-hero weights.
  4. Remove zoom-blocking flags from the viewport meta. One-character fix.
  5. Add og:image, og:type, twitter:card, twitter:image. Ship a 1200×630 OG card.
  6. Delete obsolete meta tags. No more keywords or secondary_keywords.
  7. Normalize the canonical across all 424 sitemap URLs.
Lane 02

Grow

Days 4 to 10 · SEO & Content
  1. Add JSON-LD: Organization, WebSite (SearchAction), FAQPage on homepage. Product, Offer, AggregateRating on every country page. BreadcrumbList everywhere.
  2. Expand hreflang to fr, de, it, pt, ja, ko, zh, ar. At minimum, declare what already exists.
  3. Launch /blog with 12 cornerstone posts: install guides for iPhone and Pixel, "eSIM compatible phones," "Maya vs Airalo / Holafly / Saily," "Best eSIM for {Japan, Thailand, EU, US, Mexico, UK}."
  4. Audit Angular SSR output on every country and shop page. Content must paint in HTML, not after hydration.
  5. PurgeCSS pass to cut homepage HTML to 150 KB or less.
  6. Visible breadcrumbs on country and shop pages.
Lane 03

Moat

Ongoing 30-day support · Marketing
  1. Programmatic country guides. For each of the 191 country plans, publish a paired travel-data guide that internal-links to its plan page.
  2. An eSIM compatibility checker tool. Natural backlink magnet in this exact niche.
  3. Digital PR push: Nomadic Matt, The Points Guy, Wirecutter, CNET, Forbes Travel. AI Overviews lean heavily on these citations.
  4. Customer-review schema sitewide pulling from the 4.6 rating on 2,585 reviews.
  5. Comparison pages: maya-vs-airalo, maya-vs-holafly, maya-vs-saily. Bottom-of-funnel intent, high commercial value.
  6. Affiliate or creator program to match Airalo's distribution flywheel.
07The engagement

What it takes. What it costs.

Term10-day build, then 30 days of ongoing SEO support. Fixed fee, all in.
Total · 10-day build + 30-day support
$0
USD · fixed fee · all in

50% on signature. $4,500 to start. Work begins the day after the SOW is signed.

50% on build delivery. $4,500 at the end of day 10, before the 30-day support month begins.

The support month is included in the $9,000. No surprise invoices.

Mann Made

Everything includedAll in

  • All Lane 01 engineering fixes (7 items, in 3 days)
  • All Lane 02 SEO and content fixes (6 items, in 7 days)
  • Lane 03 strategic foundation kicked off in the support month
  • Schema markup implementation across the site
  • Blog setup with first 3 cornerstone posts shipped
  • Comparison page templates (Maya vs Airalo / Holafly / Saily)
  • Open Graph & Twitter Card assets
  • PurgeCSS pass on the homepage
  • Font conversion to WOFF2 with subset
  • 30 days of post-build SEO support and tuning
  • Weekly status reports + direct Slack channel
  • Search Console & PageSpeed monitoring through support month
Build
0 days
Lanes 01 + 02 shipped
Support
0 days
Lane 03 + monitoring
Team
0 specialists
SEO · Eng · Content · PM
Start
Day 1
After signed SOW

Ready to start?

Reply with a yes and we'll send a signed SOW the same day. Work begins the day after the SOW is signed. Kickoff call inside the first 24 hours, first commit to the maya.net repo before the first week is out.

Mann Made Media +27 83 253 6490
mannmade.co.za