# Store Locator Scraper: Franchise Location Counter (`ausbizstack/multi-location-franchise-footprint-mapper`) Actor

Store locator scraper for multi-location brands. Counts store, clinic and franchise locations from each brand's own website and store locator page, groups them by state and suburb, detects the booking stack (HotDoc, Cliniko, Mindbody) and adds Australian ABN/GST checks.

- **URL**: https://apify.com/ausbizstack/multi-location-franchise-footprint-mapper.md
- **Developed by:** [AusBizStack Intelligence](https://apify.com/ausbizstack) (community)
- **Categories:** Lead generation, Business, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 multi-location footprint records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Store Locator Scraper: Franchise Location Counter** lets you run a store locator scraper for a list of brands in bulk. Counts store, clinic and franchise locations from each brand's own website and store locator page, groups them by state and suburb, detects the booking stack (HotDoc, Cliniko, Mindbody) and adds Australian ABN/GST checks.

Store Locator Scraper: Franchise Location Counter is built by AusBizStack, reads only public web pages and DNS, and returns one clean row per brand that you can export to CSV, Excel, JSON or Google Sheets, or call through the Apify API.

### What does Store Locator Scraper: Franchise Location Counter do?

Store locator scraper for multi-location brands. Counts store, clinic and franchise locations from each brand's own website and store locator page, groups them by state and suburb, detects the booking stack (HotDoc, Cliniko, Mindbody) and adds Australian ABN/GST checks.

- **Footprint in one row per brand:** `estimatedLocationCount`, `multiSiteTier`, the states and suburbs covered (up to 15) and sample location URLs, read from the brand's own sitemaps and location pages.
- **Booking and ops stack detected:** HotDoc, Cliniko, Mindbody, SevenRooms and others, so you can see which vendor each group already runs.
- **AU-ready qualification:** optional ABN and GST verification plus a rough monthly contract-size estimate and pitch hooks. $10 / 1,000 results (Free $10 · Bronze $9 · Silver $8 · Gold+ $7). Failed or unreachable domains cost $0.

### What data can I get with Store Locator Scraper: Franchise Location Counter?

#### What It Extracts & Scores Per Domain

| Field | Description |
|---|---|
| `brandName` & `verticalCategory` | Classifies into `Dental & Orthodontics`, `Medical, Podiatry & Allied Health`, `Fitness, Strength & Wellness`, `Hospitality, Dining & Venues`, `Property, Strata & Facilities`, or `Multi-Site Retail & Commercial Services` |
| `estimatedLocationCount` & `multiSiteTier` | Estimates the number of sites by counting discovered clinic/branch/venue URLs via XML sitemaps (`/sitemap_index.xml`, child location sitemaps), on-page directory links, and Schema.org `LocalBusiness` / `MedicalClinic` / `Dentist` / `Restaurant` JSON-LD (`ENTERPRISE_NATIONAL_20_PLUS`, `REGIONAL_GROUP_5_TO_19`, `MULTI_SITE_2_TO_4`, `SINGLE_OR_CENTRAL_SITE`) |
| `statesOrRegionsDetected` & `sampleSuburbsOrCities` | Maps state/region footprint (`NSW`, `VIC`, `QLD`, `WA`, `SA`, `TAS`, `ACT`, `NT`, `UK`) and up to 15 sample suburbs/cities |
| `sampleLocationUrls` | Up to 15 discovered branch/clinic landing page URLs |
| `bookingAndOperationsStack` | Detects **HotDoc**, **Cliniko**, **HealthEngine**, **Centaur / Dental4Windows**, **CorePractice**, **Halaxy**, **Mindbody**, **SevenRooms**, **OpenTable**, **NowBookIt**, **ServiceM8**, **Simpro**, **PropertyMe**, **MRI Strata**, **HubSpot**, **Salesforce**, **GA4**, **GTM**, and **Meta Pixel** |
| `abn`, `legalEntityName` & `gstRegistered` | Live Australian Business Register (`abr.business.gov.au`) lookup + ATO Modulo-89 mathematical checksum validation |
| `roleEmails` & `phones` | Extracts only role-based corporate inboxes (`info@`, `enquiries@`, `reception@`, `admin@`, `facilities@`, `property@`, `accounts@`, `bookings@`) and business phone lines (`1300` / `1800` / `13` / landlines) |
| `estimatedMonthlyCommercialContractAud` & `commercialContractScore` | A **rough estimate** of monthly B2B contract value (`$ AUD/mo`, see "How to read the estimates" below) and a 0–100 score for commercial cleaning, medical infection control, managed IT, or multi-site local SEO retainers |
| `commercialFacilitiesPitchHook` & `multiSiteMarketingAgencyHook` | Copy-paste cold outreach hooks tailored for commercial facilities/cleaning/IT providers and multi-location marketing agencies |

### How to use Store Locator Scraper: Franchise Location Counter

1. Click **Try for free** (or **Start**) on this page and sign in to Apify. The free plan's monthly credit covers a first test.
2. Paste your brands into **Multi-Location Brand Domains or URLs** (`domains`), one per line.
3. Leave the other options on their defaults, or switch checks on or off.
4. Click **Start**. Each brand usually finishes in a few seconds.
5. Open the **Output** tab and export to CSV, Excel or JSON, or connect the dataset to Google Sheets, Make, n8n or Clay.

### How much does Store Locator Scraper: Franchise Location Counter cost?

Store Locator Scraper: Franchise Location Counter uses pay-per-event pricing: **$10 per 1,000 brands** (Free $10 · Bronze $9 · Silver $8 · Gold+ $7, by Apify plan), plus a tiny start fee per run. Failed, timed-out or unreachable brands still appear in the dataset with a `status` and reason, but cost **$0**. Apify's free plan includes monthly platform credit, which is enough to test Store Locator Scraper: Franchise Location Counter on a short list.

### Input example

| Field | Type | Default | What it does |
|---|---|---|---|
| `domains` | array of strings | — | Brand websites or URLs to map (one row per domain). `targets` is accepted as an alias. |
| `inspectSitemaps` | boolean | `true` | Read XML sitemaps to find location pages. Turn off for faster, homepage-only runs. |
| `verifyAustralianAbn` | boolean | `true` | Look up the brand's ABN, legal name and GST status on the Australian Business Register. |
| `maxConcurrency` | integer | `50` | Domains processed in parallel. 10 is plenty for small lists. |
| `requestTimeoutSecs` | integer | `5` | Per-request timeout in seconds. |

Example input:

```json
{
  "domains": [
    "pacificsmilesdental.com.au",
    "myfootdr.com.au",
    "kieser.com.au",
    "dishoom.com",
    "1300smiles.com.au"
  ],
  "inspectSitemaps": true,
  "verifyAustralianAbn": true,
  "maxConcurrency": 10,
  "requestTimeoutSecs": 5
}
```

### Output example

A trimmed row from a real run (29 Oct 2026). Long text fields are shortened. This brand is outside Australia, so the ABN fields show the non-AU defaults.

```json
{
  "domain": "dishoom.com",
  "url": "https://www.dishoom.com/",
  "status": "mapped",
  "brandName": "Dishoom",
  "verticalCategory": "Hospitality, Dining & Venues",
  "estimatedLocationCount": 9,
  "multiSiteTier": "REGIONAL_GROUP_5_TO_19",
  "statesOrRegionsDetected": [
    "UK"
  ],
  "sampleSuburbsOrCities": [
    "Leeds",
    "Battersea",
    "Canary Wharf",
    "Carnaby"
  ],
  "sampleLocationUrls": [
    "https://dishoom.com/leeds/",
    "https://dishoom.com/battersea/",
    "https://dishoom.com/canary-wharf/",
    "https://dishoom.com/carnaby/"
  ],
  "bookingAndOperationsStack": [
    "SevenRooms",
    "Klaviyo",
    "Google Tag Manager",
    "Google Analytics 4"
  ],
  "abn": "Non-AU / Not Listed",
  "legalEntityName": "International / Non-ABR Entity",
  "gstRegistered": false,
  "roleEmails": [
    "info@dishoom.com",
    "enquiries@dishoom.com"
  ],
  "primaryRoleEmail": "info@dishoom.com",
  "estimatedMonthlyCommercialContractAud": 4950,
  "estimatedMonthlyContractRangeAud": "$3,500 - $6,500/mo AUD",
  "commercialContractScore": 85,
  "commercialFacilitiesPitchHook": "Dishoom (dishoom.com) operates ~9 Hospitality, Dining & Venues site(s) across UK (REGIONAL_GROUP_5_TO_19) — pitch a consolidated multi-site facilities, infection-control…",
  "auditedAt": "2026-10-29T07:16:25.592Z"
}
```

#### How to read the estimates

- `estimatedLocationCount` is an **estimate** based on the location pages, sitemaps and JSON-LD the brand publishes. Sites that hide locations behind a JavaScript store-finder or map widget can be undercounted, and shared or duplicate pages can occasionally be overcounted.
- `estimatedMonthlyCommercialContractAud` and `estimatedMonthlyContractRangeAud` are a **rough estimate** only: location count × a flat per-site rate (about A$550, or A$650 for dental and medical), capped between A$1,500 and A$120,000. They are not based on the brand's actual spend and should be used for rough prioritisation, not quoting.

### Use cases

- Lead generation: find multi-site franchise, clinic and retail groups to sell to.
- Market research: compare the footprint of competing chains by state.
- Franchise analysis: track location growth over time.

#### How many locations does a brand have?

Add the brand's domain. The Actor reads its store locator and location pages and returns `estimatedLocationCount` plus the states and suburbs detected.

#### How do I scrape a store locator?

Pass a list of brand domains; the Actor finds the store locator or locations page on each site and its sitemaps, so you don't need to build a scraper per site.

#### How do I find multi-location businesses?

Run a list of domains and filter by location count to find franchise groups, clinic networks and retail chains.

### Integrations (API, Make, n8n, Clay, MCP)

Call Store Locator Scraper: Franchise Location Counter from the Apify API, schedule it in Apify, or plug it into Make, n8n, Clay, Zapier or an AI agent through the Apify MCP server (`mcp.apify.com`). Ready-to-import Make and n8n templates that send results to Google Sheets are free to download at https://ausbizstack.github.io/#templates.

##### Apify API (`curl`, synchronous)

```bash
curl -X POST "https://api.apify.com/v2/acts/ausbizstack~multi-location-franchise-footprint-mapper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["kieser.com.au", "dishoom.com"], "maxConcurrency": 10, "requestTimeoutSecs": 5}'
```

##### Clay, Make or n8n

Call the same endpoint with an HTTP request step (`POST`, headers `Content-Type: application/json` and `Authorization: Bearer YOUR_APIFY_TOKEN`) and the body `{"domains": ["{{Company Domain}}"]}`. Map `estimatedLocationCount`, `multiSiteTier`, `statesOrRegionsDetected` and `bookingAndOperationsStack` into your table.

Pass your token as a header, never in the URL:

```bash
curl -X POST "https://api.apify.com/v2/acts/ausbizstack~multi-location-franchise-footprint-mapper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" -H "Content-Type: application/json" -d '{...}'
```

### FAQ

**What does Store Locator Scraper: Franchise Location Counter do?**
For each brand domain it finds the location, clinic or venue pages the brand publishes, then returns an estimated location count, multi-site tier, states and suburbs covered, booking and operations tools detected, role-based contacts and (for Australian brands) ABN and GST status.

**How accurate is the location count?**
It is an estimate. It counts the location pages the brand publishes in sitemaps, location directories and JSON-LD. Store finders that only load through JavaScript or a map widget may be missed, so treat the number as a lower bound for those sites.

**Does it work outside Australia?**
Yes. Footprint mapping, the booking stack and contacts work for any website (UK regions are recognised too). ABN and GST checks only apply to Australian businesses; other brands show `Non-AU / Not Listed`.

**How much does it cost?**
$10 per 1,000 results (Free $10 · Bronze $9 · Silver $8 · Gold+ $7). Invalid, timed-out or unreachable domains still appear in the dataset but cost $0.

**What output formats are supported?**
One JSON row per domain (see the Output tab), exportable as JSON, CSV or Excel or readable via the API. It uses plain HTTP requests, not a headless browser, and each domain has a time cap of about 12 seconds.

**Who do I contact for help or a custom version?**
Email ausbizstack@outlook.com.

### Acceptable use

This Actor returns publicly available business information only. You are responsible for how you use it. If you send commercial electronic messages to Australian recipients you must comply with the *Spam Act 2003* (Cth): have consent (express or inferred), identify yourself accurately, and include a functional unsubscribe. Respect any website notice stating that unsolicited messages are not wanted, and comply with the Privacy Act 1988 (Cth), GDPR and other applicable laws. Do not use this Actor for bulk unsolicited messaging.

### Other AusBizStack Actors

- [Tech Stack Detector](https://apify.com/ausbizstack/b2b-tech-stack-contact-abn-enricher): tech stack detector and website technology lookup with role-based contact enrichment.
- [llms.txt Generator & GEO Audit](https://apify.com/ausbizstack/ai-geo-llms-txt-auditor): llms.txt generator and GEO audit for AI search visibility.
- [DMARC, SPF & DKIM Checker](https://apify.com/ausbizstack/b2b-email-security-dmarc-spf-auditor): bulk DMARC checker, SPF checker and DKIM lookup.
- [ABN Lookup Australia](https://apify.com/ausbizstack/au-abn-kyb-commercial-lead-enricher): bulk ABN lookup, ACN and GST check for Australian businesses.
- [Shopify Apps Detector](https://apify.com/ausbizstack/shopify-ecommerce-tech-pixel-auditor): Shopify apps detector and store tech stack checker.
- [ATS Detector & Careers Page Finder](https://apify.com/ausbizstack/b2b-hiring-intent-ats-careers-enricher): ATS detector and careers page finder with hiring signals.
- [SaaS Pricing Page Scraper](https://apify.com/ausbizstack/b2b-saas-pricing-tier-plg-auditor): SaaS pricing page scraper for plans, tiers and prices.

Questions or a custom version? Email ausbizstack@outlook.com.

# Actor input Schema

## `domains` (type: `array`):

Enter multi-location business domains or URLs (e.g. 'pacificsmilesdental.com.au', 'myfootdr.com.au', 'kieser.com.au', 'dishoom.com', '1300smiles.com.au').

## `targets` (type: `array`):

Optional alias for domains so Clay, n8n, Make, and MCP agents can pass either `domains` or `targets`.

## `inspectSitemaps` (type: `boolean`):

When true, parses `/robots.txt`, `/sitemap.xml`, `/sitemap_index.xml`, and child location/clinic/store sitemaps to accurately count and sample branch URLs.

## `verifyAustralianAbn` (type: `boolean`):

When true, validates any on-page ABN or queries `abr.business.gov.au` for Australian domains using the official ATO Modulo-89 checksum.

## `maxConcurrency` (type: `integer`):

Number of domains processed in parallel (1 to 200, default 50). 10 is plenty for small lists.

## `requestTimeoutSecs` (type: `integer`):

HTTP timeout in seconds per request.

## Actor input object example

```json
{
  "domains": [
    "pacificsmilesdental.com.au",
    "myfootdr.com.au",
    "kieser.com.au",
    "dishoom.com",
    "1300smiles.com.au"
  ],
  "inspectSitemaps": true,
  "verifyAustralianAbn": true,
  "maxConcurrency": 10,
  "requestTimeoutSecs": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domains": [
        "pacificsmilesdental.com.au",
        "myfootdr.com.au",
        "kieser.com.au",
        "dishoom.com",
        "1300smiles.com.au"
    ],
    "maxConcurrency": 10,
    "requestTimeoutSecs": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("ausbizstack/multi-location-franchise-footprint-mapper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "domains": [
        "pacificsmilesdental.com.au",
        "myfootdr.com.au",
        "kieser.com.au",
        "dishoom.com",
        "1300smiles.com.au",
    ],
    "maxConcurrency": 10,
    "requestTimeoutSecs": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("ausbizstack/multi-location-franchise-footprint-mapper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domains": [
    "pacificsmilesdental.com.au",
    "myfootdr.com.au",
    "kieser.com.au",
    "dishoom.com",
    "1300smiles.com.au"
  ],
  "maxConcurrency": 10,
  "requestTimeoutSecs": 5
}' |
apify call ausbizstack/multi-location-franchise-footprint-mapper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ausbizstack/multi-location-franchise-footprint-mapper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fFoBaSfqwFmc8BVke/builds/eSzgHxvuFUzjCJObz/openapi.json
