MapAlert

First Hand Competitive Intelligence

You focus on your customers. We focus on your competitors. Be the first to know with your own local intelligence report.

Sign up for only $29 per month!


Google Maps

Maps monitoring at its finest. New rivals, competitor updates, and every juicy review. Always know what happens in your area.


Social Media

We monitor your competition on Facebook and Instagram. We scan their posts and filter out the noise. We'll report what matters to you.


Website Activity

A quiet pricing update or a new service added. We scan competitor websites and catch every change. Nothing slips through unnoticed.


Social Media

We monitor your competition on Facebook and Instagram. We scan their posts and cut the noise. We'll report what matters to you.


Website Activity

A quiet pricing update or a new service added. We scan competitor websites and catch every change. Nothing goes unnoticed.


First To Know

Every signal from every source combined into one compact report. Cleansed, curated, and easy to read. Delivered straight to your inbox.


Local Insight

Local yet comprehensive. Our proprietary monitoring engine tracks every platform your competitors are active on. It closely follows every change through time so you always see the full picture rather than a single frame.

Price adjustments, new treatments or services, job openings and opening hours.

Treat yourself to our state of the art market intelligence for only $29 per month!

No commitment, cancel anytime.


How It Works

We continuously monitor your competitors for operational updates. We trace their profiles and websites and flag every relevant change.

.

Tailored Briefing

Everything we find gets bundled, filtered and polished into one compact report. Tailored to your local area and delivered straight to your inbox, ready to read, every two weeks.

.

No Setup Required

There is no need to install or connect anything to get started. We send you a quick scan of your Competitor Portfolio and start monitoring it. Changes only show from your second report onwards. All still within your free trial.


Contact Us

Questions or curious how we operate? Leave a message and we'll personally get in touch.


Start Trial

MapAlert is free for the first month.
You focus on your customers. We focus on your competitors. Stay ahead with MapAlert.

(function waitForStripe() { if (!window.Stripe) return setTimeout(waitForStripe, 50); initStripe(); })(); async function initStripe() { const msg = document.getElementById("pay-msg"); const stripe = Stripe("pk_live_51Sjl10JU2qjtla5tRzk7kDisUSJuFkxeEnzm61Nm62OliMY7KMnTvzzPDYcXBa5ohwRVbAJg03qmK40bXGRjiFij00E2u7k1IR"); let place_id = ""; try { place_id = sessionStorage.getItem("ma_place_id") || ""; if (!place_id) { const hash = window.location.hash || ""; const qi = hash.indexOf("?"); if (qi !== -1) { const params = new URLSearchParams(hash.slice(qi + 1)); place_id = params.get("place_id") || ""; } } if (!place_id) { const params = new URLSearchParams(window.location.search); place_id = params.get("place_id") || ""; } } catch(e) {} let plan = "insights"; try { const hash = window.location.hash || ""; const qi = hash.indexOf("?"); let found = null; if (qi !== -1) { const hashParams = new URLSearchParams(hash.slice(qi + 1)); found = hashParams.get("plan"); } if (!found) { const queryParams = new URLSearchParams(window.location.search); found = queryParams.get("plan"); } if (found) plan = found; } catch(e) {} const elements = stripe.elements(); const card = elements.create("card", { style: { base: { fontFamily: "Inter, system-ui, sans-serif", fontSize: "16px", color: "#585D6B" } } }); card.mount("#pay-card-element"); const intentRes = await fetch("https://mapalert-places-api.vercel.app/api/x_create-setup-intent", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ place_id: place_id }) }); const intentData = await intentRes.json(); if (!intentData.client_secret) { msg.textContent = "Unable to initialize payment. Please refresh."; return; } const email = intentData.email || ""; document.getElementById("pay-submit-btn").addEventListener("click", async () => { msg.textContent = "Setting up your free trial..."; const name = document.getElementById("pay-name").value.trim(); if (!name) { msg.textContent = "Please enter your cardholder name."; return; } const setupResult = await stripe.confirmCardSetup( intentData.client_secret, { payment_method: { card, billing_details: { name: name, email: email } } } ); if (setupResult.error) { msg.textContent = setupResult.error.message; return; } const paymentMethodId = setupResult.setupIntent.payment_method; const subRes = await fetch("https://mapalert-places-api.vercel.app/api/x_create-subscription", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ place_id: place_id, email: email, payment_method: paymentMethodId, cardholder_name: name, plan: plan }) }); const subData = await subRes.json(); if (!subRes.ok || !subData.ok) { msg.textContent = subData.error || "Subscription creation failed."; return; } sessionStorage.removeItem("ma_place_id"); window.location.href = "/#verified"; }); }

✓ Automatic monitoring
✓ Biweekly reporting
✓ Cancel anytime
$29 p/m


Thanks!

Thanks again for reaching out. We'll try to respond as soon as possible. You may always expect a personal message from us.


Try Out Now!

Find your business by simply entering its
ZIP code and name. We will verify your business profile within seconds.

(() => { function ready(fn) { if (document.readyState !== "loading") { fn(); } else { document.addEventListener("DOMContentLoaded", fn); } } ready(() => { const root = document.getElementById("xwf-app"); if (!root) return; const API_BASE = "https://mapalert-places-api.vercel.app"; const NEXT = root.getAttribute("data-next") || "/#select"; const byId = (id) => document.getElementById(id); const setMsg = (t, isErr) => { const m = byId("xwf-msg"); m.textContent = t || ""; m.style.color = isErr ? "#c0392b" : "#8a93a0"; }; let business = null; let busy = false; try { const sp = sessionStorage.getItem("xw_find_postcode"); const sn = sessionStorage.getItem("xw_find_name"); if (sp) byId("xwf-pc").value = sp; if (sn) byId("xwf-bn").value = sn; } catch (e) {} const doFind = async () => { if (busy) return; const pc = byId("xwf-pc").value.trim(); const bn = byId("xwf-bn").value.trim(); if (!pc || !bn) { return setMsg("Please enter your postcode and business name.", true); } busy = true; setMsg("Finding your business..."); try { const r = await fetch(API_BASE + "/api/xw_preview", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ postcode: pc, business_name: bn }) }); const d = await r.json(); busy = false; if (d && d.chain_detected) { return setMsg("That looks like a national chain - MapAlert is built for independent local businesses.", true); } if (!r.ok || !d || !d.place_id) { return setMsg((d && d.error) || "We couldn't find that business. Check the details and try again.", true); } business = d; byId("xwf-c-name").textContent = d.name || ""; byId("xwf-c-addr").textContent = d.address || ((d.address_postal_code || "") + " " + (d.address_city || "")); const cat = byId("xwf-c-cat"); if (d.category_display) { cat.textContent = d.category_display; cat.style.display = ""; } else { cat.style.display = "none"; } setMsg(""); byId("xwf-modal").style.display = "flex"; } catch (e) { busy = false; setMsg("Something went wrong. Please try again.", true); } }; const confirmYes = () => { if (!business || !business.place_id) return; try { sessionStorage.setItem("xw_business", JSON.stringify(business)); sessionStorage.setItem("xw_own_place_id", business.place_id); sessionStorage.setItem("xw_find_postcode", byId("xwf-pc").value.trim()); sessionStorage.setItem("xw_find_name", byId("xwf-bn").value.trim()); } catch (e) {} window.location.href = NEXT; }; const confirmNo = () => { byId("xwf-modal").style.display = "none"; }; byId("xwf-find").addEventListener("click", doFind); byId("xwf-yes").addEventListener("click", confirmYes); byId("xwf-no").addEventListener("click", confirmNo); }); })();

.


Your Portfolio

Select up to 12 competitors and we will start monitoring them. We'll track them on Google Maps, Social Media and their websites

0 selected
(() => { function ready(fn) { if (document.readyState !== "loading") { fn(); } else { document.addEventListener("DOMContentLoaded", fn); } } ready(() => { const root = document.getElementById("xws-app"); if (!root) return; const API_BASE = "https://mapalert-places-api.vercel.app"; const NEXT = root.getAttribute("data-next") || "/#email"; const PRESELECT = parseInt(root.getAttribute("data-preselect"), 10) || 3; const MAX_PICK = parseInt(root.getAttribute("data-max"), 10) || 12; const byId = (id) => document.getElementById(id); const setMsg = (t, isErr) => { const m = byId("xws-msg"); m.textContent = t || ""; m.style.color = isErr ? "#c0392b" : "#8a93a0"; }; const st = { business: null, competitors: [], nextToken: null, busy: false }; try { st.business = JSON.parse(sessionStorage.getItem("xw_business") || "null"); } catch (e) {} if (!st.business || !st.business.place_id) { setMsg("Your session expired - please start again.", true); return; } const country = st.business.country_code || st.business.address_country || ""; const fmtDist = (km) => { if (km == null) return ""; const c = (country || "").toLowerCase(); if (c.indexOf("netherland") !== -1 || c.indexOf("nederland") !== -1) return km.toFixed(1) + " km"; return (km * 0.621371).toFixed(1) + " mi"; }; const selectedCount = () => { let n = 0; st.competitors.forEach((c) => { if (c.sel) n++; }); return n; }; const styleRow = (row, sel) => { row.style.cssText = "display:flex;align-items:center;gap:13px;border:1.5px solid " + (sel ? "#F59273" : "#e7e9ee") + ";border-radius:13px;padding:12px 14px;cursor:pointer;text-align:left;background:" + (sel ? "#fff7f3" : "#fff"); const chk = row.querySelector(".xws-check"); chk.style.cssText = "width:24px;height:24px;border-radius:7px;flex:none;display:flex;align-items:center;justify-content:center;color:#fff;font-size:14px;font-weight:700;border:2px solid " + (sel ? "#F59273" : "#d7dbe2") + ";background:" + (sel ? "#F59273" : "transparent"); chk.textContent = sel ? "\u2713" : ""; }; const renderList = () => { const list = byId("xws-list"); list.innerHTML = ""; const tpl = byId("xws-row-tpl"); st.competitors.forEach((c, i) => { const row = tpl.cloneNode(true); row.removeAttribute("id"); styleRow(row, c.sel); row.querySelector(".xws-cname").textContent = c.name || ""; const vic = row.querySelector(".xws-vic"); if (c.vicinity) { vic.textContent = c.vicinity; vic.style.display = ""; } else { vic.style.display = "none"; } row.querySelector(".xws-dist").textContent = fmtDist(c.distance_km); const rt = row.querySelector(".xws-rating"); if (c.rating != null) { rt.textContent = "\u2605 " + c.rating; rt.style.display = ""; } else { rt.style.display = "none"; } const rv = row.querySelector(".xws-reviews"); if (c.review_count != null) { rv.textContent = c.review_count + " reviews"; rv.style.display = ""; } else { rv.style.display = "none"; } row.addEventListener("click", () => toggle(i)); list.appendChild(row); }); byId("xws-count").textContent = st.competitors.length + " nearby"; byId("xws-selcount").textContent = selectedCount(); byId("xws-more").style.display = st.nextToken ? "" : "none"; }; const toggle = (i) => { const c = st.competitors[i]; if (!c) return; if (!c.sel && selectedCount() >= MAX_PICK) { return setMsg("We monitor up to " + MAX_PICK + " - pick your closest rivals.", true); } c.sel = !c.sel; setMsg(""); renderList(); }; const fetchCompetitors = async (append) => { const b = st.business; const body = { lat: b.lat, lng: b.lng, category_keyword: b.category_keyword, own_place_id: b.place_id }; if (append && st.nextToken) body.page_token = st.nextToken; try { const r = await fetch(API_BASE + "/api/xw_competitors", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) }); const d = await r.json(); if (!r.ok || !d || !d.competitors) { return setMsg((d && d.error) || "We couldn't load competitors. Please try again.", true); } const fresh = d.competitors.map((c) => { c.sel = false; return c; }); if (append) { const seen = {}; st.competitors.forEach((c) => { seen[c.place_id] = 1; }); fresh.forEach((c) => { if (!seen[c.place_id]) st.competitors.push(c); }); } else { st.competitors = fresh; st.competitors.forEach((c, i) => { c.sel = i < PRESELECT; }); } st.nextToken = d.next_page_token || null; setMsg(""); renderList(); } catch (e) { setMsg("Something went wrong. Please try again.", true); } }; const doContinue = () => { const picks = st.competitors.filter((c) => c.sel); if (picks.length === 0) { return setMsg("Tap at least one competitor to monitor.", true); } try { sessionStorage.setItem("xw_selected", JSON.stringify(picks.map((c) => ({ place_id: c.place_id, name: c.name, address: c.vicinity != null ? c.vicinity : null, distance_km: c.distance_km != null ? c.distance_km : null, rating: c.rating != null ? c.rating : null, review_count: c.review_count != null ? c.review_count : null })))); } catch (e) {} window.location.href = NEXT; }; byId("xws-more").addEventListener("click", () => fetchCompetitors(true)); byId("xws-continue").addEventListener("click", doContinue); byId("xws-list").innerHTML = ""; setMsg("Finding your competitors..."); fetchCompetitors(false); }); })();

.


Enter Email

Provide your email to start our free trial. We'll monitor your rivals and each week you get notifed about changes in their online presence

(() => { function ready(fn) { if (document.readyState !== "loading") { fn(); } else { document.addEventListener("DOMContentLoaded", fn); } } ready(() => { const root = document.getElementById("xwe-app"); if (!root) return; const API_BASE = "https://mapalert-places-api.vercel.app"; const CHECKOUT = root.getAttribute("data-checkout") || "/#scan"; const byId = (id) => document.getElementById(id); const setMsg = (t, isErr) => { const m = byId("xwe-msg"); m.textContent = t || ""; m.style.color = isErr ? "#c0392b" : "#8a93a0"; }; let busy = false; const submit = async () => { if (busy) return; const email = byId("xwe-email").value.trim(); if (!email) { return setMsg("Please enter your email address.", true); } let business = null; let picks = []; try { business = JSON.parse(sessionStorage.getItem("xw_business") || "null"); picks = JSON.parse(sessionStorage.getItem("xw_selected") || "[]"); } catch (e) {} if (!business || !business.place_id || !picks.length) { return setMsg("Your selection expired. Please start again.", true); } busy = true; setMsg("Setting things up..."); try { const r = await fetch(API_BASE + "/api/xw_website-lead", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email: email, place_id: business.place_id, business_name: business.name || null, address_line1: business.address_line1 || null, address_line2: business.address_line2 || null, address_city: business.address_city || null, address_postal_code: business.address_postal_code || null, address_country: business.address_country || business.country_code || null, rating: business.rating != null ? business.rating : null, review_count: business.review_count != null ? business.review_count : null, maps_url: business.maps_url || null, category_keyword: business.category_keyword || null, category_display: business.category_display || null, competitors: picks }) }); let d = null; try { d = await r.json(); } catch (e) { d = null; } busy = false; if (!r.ok) { return setMsg((d && d.error) || "We couldn't start your scan. Please try again.", true); } try { sessionStorage.setItem("ma_place_id", business.place_id); sessionStorage.setItem("xw_email", email); } catch (e) {} window.location.href = CHECKOUT; } catch (e) { busy = false; setMsg("Something went wrong. Please try again.", true); } }; byId("xwe-btn").addEventListener("click", submit); }); })();

.


Thank You!

We'll start monitoring your competitors. Their websites, their Socials, and their Google Maps Profiles. You'll always stay ahead with us now.

.

Live Monitoring

We continuously monitor your competitors for operational updates and flag every change.

Everything we find gets bundled, filtered and polished into one compact report. Tailored to your local area and delivered straight to your inbox, ready to read, every two weeks.

.

MapAlert

You focus on your customers. We focus on your competitors. Be the first to know with your own local intelligence report.

Sign up for only $29 per month!