Documentation
A reference for everything in the product: the ten map types and what each one expects from your data, how data gets in and stays current, how a map is styled, and how it is published, embedded and moderated. Sections are linkable — click the beside a heading to copy its address.
Mapji turns a dataset into an interactive map that lives at its own web address. There is no code to write and nothing to host: you pick a map type, bring your data in, adjust how it looks and behaves, and the map is already live.
Four ideas cover almost everything in the product, and the rest of this manual is organised around them.
| Concept | What it means |
|---|---|
| A map is a site | Each map you create is a self-contained site with its own address, its own data, its own styling and its own settings. Maps never share data or configuration, so changing one cannot affect another. One account can hold as many as you like. |
| Map type | The type decides how your data is drawn and what the editor offers you — clusters, a heat surface, shaded regions, a scrolling story, a submission form. It is chosen when you create the map and can be changed later in Settings. |
| Data source | Where the features come from: a file you upload, shapes you draw, a connected Google Sheet that keeps syncing, or submissions from visitors. A map holds one dataset — except Compare, which holds one per side. |
| The published map | Every map is immediately live at yourmap.mapji.com, can take a custom domain, and has a separate embed URL for putting inside someone else's page. |
Everything in the editor saves as you work. There is no publish step and no draft state: an edit is live once it is written, so preview the public map in another tab if you want to watch it change.
Worth knowing before you plan a project around it, because each of these is a design decision rather than a gap waiting to be filled.
From nothing to a published map is about five minutes, most of it spent choosing how the data should look.
Sign in
Use a GitHub, Google or Microsoft account. The dashboard lives at app.mapji.com.
Create a map
The create dialog asks for a map type first. Nine types are filled with your own data; Crowdsourced Map is listed separately because its data comes from visitors. Then name the map — the web address is slugified from the name as you type, and you can override it.
Bring your data in
Upload a file, connect a Google Sheet, or build the map by hand on the canvas. See Importing files for what each type expects.
Configure the type
The Settings tab in the editor sidebar holds the settings specific to your map type: the heat gradient, the cluster bands, the time column, the store fields.
Style it and set the behaviour
The buttons on the map itself cover the basemap, what visitors are allowed to do with the map, and which widgets appear. Lock an opening view from the status bar under the map if you want it to always start in one place.
Share it
The map is already live at yourmap.mapji.com. Point a custom domain at it, or copy the embed snippet to put it inside an existing page.
Accounts are created by signing in — there is no separate registration step and no password to manage. Three providers are supported: GitHub, Google and Microsoft Entra ID (work or school accounts).
Which one you choose matters in exactly one place. Google Sheets live sync reads the sheet as you, so it needs a Google connection — signing in with Google grants Mapji read-only access to spreadsheets and an offline token so the background sync can keep running when you are not at the keyboard. Signed in with GitHub or Microsoft, every other feature works normally; only Sheets sync is unavailable.
app.mapji.com for editing, yourmap.mapji.com for the live map. Visitors never need an account; published maps are public.Every map type uses the same editor shell, so the same things are always in the same place. Only the contents change.
| Area | What lives there |
|---|---|
| The map | The working canvas, and a live preview of what visitors see. Style and behaviour changes apply here immediately. |
| Buttons on the map | Top left of the canvas: Style (basemap, terrain, 3D buildings, contours), Interactions (what visitors can do with the map), Widgets (which on-map widgets appear), and on Draw and Compare a Layers button for background services. A map type that has no use for a popover simply does not show it. |
| Sidebar | A tabbed panel beside the map: a list of what is on the map, and the settings for this map type. |
| Status bar | A thin strip under the map showing where the camera is, with the opening-view lock. |
| Header | The map name, a link to the live site, and — on the data-driven types — the Import button and the Google Sheets connection. |
Most types get a Features list and a Settings tab. Types with a richer editing surface replace or extend them.
| Map type | Tabs |
|---|---|
| Draw, Cluster, Heatmap, Time Slider | Features · Settings |
| Isochrone | Markers (n/5) · Settings |
| Choropleth | Selected areas (n) · Settings |
| Story Map | Chapters · Settings |
| Store Locator | Settings only — its location list already lives inside the map panel |
| Crowdsourced Map | Pins · Area · Fields · Rules · Display |
| Compare | Per-side editors, one for each half |
The Features list is read-only and built for finding things: it has a filter box, and clicking a row flies the map to that feature. It stops at 200 rows, so on a large dataset use the filter rather than scrolling. Settings that belong to the site rather than to the data — search, the opening view — stay available before you have imported anything; type-specific sections show as disabled until there is data to configure.
The strip under an editable map is a readout of the current camera. It updates as you pan and zoom.
| Readout | Detail |
|---|---|
| Centre | Latitude and longitude of the middle of the viewport. Click to copy. |
| Zoom | Current zoom level to two decimals. |
| Radius | Ground distance from the centre to the edge of the viewport — a quick sense of scale. |
| Bounding box | The visible extent, on wider screens only. Click to copy, which is the fastest way to grab a bbox for another tool. |
| Lock | Pins the current camera as the map's opening view. See below. |
By default a map opens fitted to its data — whatever you have imported decides the starting camera. That is usually right, and occasionally exactly wrong: a national dataset with one outlier opens zoomed out to nothing, and a map built to show one neighbourhood should not re-frame itself every time the data changes.
Locking the opening view pins the camera. Press the lock in the status bar and the map captures where you are standing right now — centre, zoom, bearing and pitch. From then on the editor, the public map and the embed all open exactly there.
| Field | Range |
|---|---|
| Latitude / longitude | Decimal degrees, typed directly |
| Zoom | 0 – 24 |
| Bearing | −180° – 180° (rotation, 0 is north up) |
| Pitch | 0° – 85° (tilt, 0 is straight down) |
Fine-tune the numbers under Opening view in the Settings tab, where each has an input and a slider, and bearing and pitch share a dial preview. On a Crowdsourced Map the same settings live in the Display tab.
Story Map is the exception and has no lock. Its chapters own the camera, so a fixed opening view would be overwritten by the first scroll. It still shows the readouts.
Ten types, each built around a different question about your data. The fastest way to choose is to ask what the reader should take away: individual places, density, regional comparison, reachability, change over time, or a narrative.
| Type | Expects | Sheets sync | Search panel |
|---|---|---|---|
| Draw | Anything — you draw it or import it | No | Yes |
| Cluster | Many points | Yes | Yes |
| Heatmap | Many points, optionally weighted | Yes | Yes |
| Choropleth | One value per region | Yes | Yes |
| Isochrone | Up to 5 origin points | No | Yes (origins) |
| Store Locator | Points with attributes | Yes | Built-in sidebar |
| Time Slider | Features with a time column | Yes | Yes |
| Story Map | Places plus written chapters | No | No |
| Crowdsourced Map | Nothing — visitors supply it | No | Yes |
| Compare | Two datasets, one per side | No | No |
You can change type later from Settings → General, and your imported features are kept. What does not carry across is the type-specific configuration, because it describes a different rendering: a heat gradient means nothing to a store locator. Draw is the one to be careful with — its features are stored where a Cluster or Heatmap import writes, so switching a Draw map to one of those and then importing replaces the drawing.
A blank canvas for maps you build by hand: markers on the places that matter, a shaded catchment area, a traced boundary, a route between stops. It is the right choice when the map is the data rather than a rendering of a table.
| Tool | What it does |
|---|---|
| Add Marker | Drops a pin where you click. Seven pin shapes and eight preset colours from the split buttons beside it. |
| Add Object | A marker rendered as an icon instead of a pin, from the Maki or Lucide icon libraries, in any colour and size. |
| Add Image | Places an uploaded image on the map as a marker — a logo, a floor plan pin, a photo. |
| Add Route | Builds a multistop route that follows real roads. See below. |
| Drawing toolbar | On the map itself: point, line, polygon, rectangle, circle and freehand, plus select and delete. Finished shapes can be reshaped vertex by vertex. |
| Import / Export | Import merges a file into what is already on the canvas — it never replaces it. Export downloads everything as GeoJSON. |
Click any feature to open its properties: a name, a description that becomes the popup body, and a colour. Lines show their measured length. Icon markers can have their icon and size changed after the fact from the same panel.
A route is drawn along the real road network, not as a straight line between points. Build the stop list in a dialog — search an address or switch to picking on the map, insert a stop between two existing ones, reorder by deleting and re-adding.
| Setting | Detail |
|---|---|
| Stops | 2 – 10 per route |
| Travel modes | Driving (car, truck, bus, motorcycle, scooter), cycling (bicycle, mountain bike, road bike), on foot (walk, hike). No public transit. |
| Stop markers | A numbered badge by default; switch any stop to a Maki or Lucide icon, and back again. |
| What gets saved | One line for the path plus one point per stop, as ordinary features. They export, restyle and delete like anything else you drew. |
| Deleting | Deleting the route line removes its stop markers too. Deleting a single stop leaves the rest of the route alone. |
The route's distance and duration are stored on the line, and its length shows in the feature list alongside every other line you have drawn.
Full Draw Map guideThousands of overlapping pins tell you nothing. A cluster map groups nearby points into a single numbered circle that splits apart as you zoom in, so the shape of the dataset is readable at every scale. Click a cluster to zoom to its contents.
It expects points. Lines and polygons are reduced to a representative point when the map is drawn, so a mixed file still renders — but if your data is mostly areas, a choropleth will say more.
| Setting | Range / default |
|---|---|
| Grouping radius | 20 – 200 px (default 80). Larger means fewer, bigger clusters. |
| Break apart at zoom | 0 – 22 (default 14). Past this zoom every point is drawn individually. |
| Size bands | Two thresholds — medium at 10 and large at 50 by default — that drive the circle size and colour steps. |
| Band colours | One colour per band, all three editable. |
| Spiderfy | Fans out points that sit at the same coordinates so each can be clicked. Off by default. |
| Donut clusters | Draws each cluster as a ring split by category instead of a solid circle. |
Pick a property to categorise by, then define the categories. Each is matched either by exact values (one or more values from that column) or by a numeric range. Anything that matches nothing is drawn in a separate uncategorised colour, which is also a quick way to spot dirty data. The result is a cluster that shows composition, not just count — how many of these incidents were severe, how many of these stores are franchises.
Full Cluster Map guideA heatmap answers “where is this concentrated?” It blurs individual points into a continuous density surface, which makes patterns obvious and individual records unreadable — that is the trade, and it is the reason a heatmap is a poor choice for data someone needs to look things up in.
Points contribute equally by default. Set a weight column and each point contributes in proportion to that number instead, which is what you want for sales figures or population, and what you do not want for raw events where every record already counts once.
| Setting | Range / default |
|---|---|
| Colour gradient | 10 presets, Magma by default — a perceptually even ramp that reads better than the classic rainbow. Also included: Blue → Red, Green → Yellow → Red, Purple → Orange, Cyan → Magenta, Fire, Teal → Yellow, and blue, green and grey monochromes. |
| Intensity | 0.5 – 3.0 (default 1). How hot a given density burns. |
| Radius | 5 – 50 px (default 20). How far each point's influence spreads. |
| Opacity | 0.1 – 1 (default 1). |
| Weight by | Any numeric column, optional. Unset means every point counts once. |
Regions shaded by a value: unemployment by county, turnout by constituency, revenue by country. You do not need boundary files — Mapji ships the geometry and you supply the numbers.
The area picker is a single search box over a catalog of basemaps. Start with the whole world or a continent, or search for a country and pick the level you want inside it. Choose an entry and you land on a checkbox grid of its regions, so you can take all of them or just a subset.
| Level | Coverage |
|---|---|
| Countries | Every country, from the geoBoundaries open dataset (ADM0). |
| States / provinces | First-level subdivisions wherever geoBoundaries publishes them (ADM1). |
| Counties / districts | Second-level subdivisions where available (ADM2). |
| NUTS 1 / 2 / 3 | The European statistical regions, from Eurostat — the levels most EU data is published against. |
| Your own boundaries | Upload a GeoJSON, TopoJSON, KML, KMZ, GPX or zipped Shapefile and nominate the property that names each region. Use this for sales territories, school catchments, delivery zones — anything with no official code. |
Areas appear immediately, grey until they have data, and you can come back and add more at any time without disturbing the values already entered.
Upload a CSV or Excel file with a region column and a value column, connect a Google Sheet to keep the values live, or type them straight into the table in the sidebar. The join tries the region name first, then the official code (ISO 3166-2 or the NUTS code), then the country, then an internal identifier, then a partial name match — so “Bavaria”, “Bayern” and DE-BY all find the same region. Anything that fails to match is listed before you commit, so a typo is visible rather than silently absent.
| Setting | Detail |
|---|---|
| Colour scales | 8 presets — 5 sequential (blues, greens, reds, oranges, purples) for low-to-high, and 3 diverging (red–blue, red–green, brown–teal) for data with a meaningful midpoint. |
| Range | Calculated from your values, or set manually so several maps share one scale. |
| Legend | Generated from the scale and the range. |
| Editing | Values can be corrected inline, and individual regions removed, without re-uploading. |
An isochrone shades everywhere you can reach from a point within a given time or distance, following the real network rather than drawing a circle. “Fifteen minutes’ walk” is a far more useful catchment than “one kilometre”, and the two look nothing alike once rivers and motorways are involved.
| Setting | Options |
|---|---|
| Origins | Up to 5 points, each nameable and given its own icon |
| Travel modes | Walk, bike, car, transit |
| Time bands | 5, 10, 15, 30, 45 and 60 minutes |
| Distance bands | 500 m, 1 km, 2 km, 5 km and 10 km |
| Mode | Time or distance — one or the other, with as many bands selected as you like |
Place origins by clicking the map, or import a point file to seed them (the first five are used). Bands are drawn as nested translucent polygons, colour-coded from nearest to furthest, over any basemap.
A searchable directory with a map attached: a scrollable list of locations beside the map, filters down the side, and a detail panel for each one. This is the type to reach for when the visitor has a task — find the nearest branch, find one that is open now, find one that does the thing they need.
Free-text search covers every field on every location, so a visitor can type a city, a postcode already in your data, a manager's name or a service. On top of that you define faceted filters from your own columns:
Any one filter can also drive the map: nominate it and each of its options gets its own marker icon, so branches, kiosks and warehouses are distinguishable at a glance without opening anything.
| Setting | Detail |
|---|---|
| Display fields | Title, subtitle, description and image, each mapped to one of your columns |
| Extra fields | Up to 5 more, typed as text, phone, email or URL so they render as the right kind of link |
| Working hours | Point at an hours column — plain text, structured JSON, or let Mapji work it out — to get an open-now badge |
| Near Me | A geolocation button that sorts by distance from the visitor. Off by default. |
| Clustering | Groups nearby markers on the map. On by default. |
| Appearance | Accent, panel, card, text and border colours, font, title size, corner radius, card style, and a sidebar width of 280 – 600 px |
A timeline under the map that steps through your data one period at a time, with play, pause and scrub. Use it when when is as much of the story as where — an outbreak spreading, a chain opening branches, a fleet moving through a day.
It needs one column holding the time. Mapji tries to detect it on import; confirm or change it in Settings, along with how the values should be read.
| Setting | Options |
|---|---|
| Time format | ISO date (YYYY-MM-DD), Unix timestamp (seconds since 1970), or custom — displayed exactly as written, which suits labels like quarters or era names |
| Label format | An optional pattern for how each step is written — YYYY, MMM, MMMM, DD, HH, mm, with literal text in [brackets] |
| Steps | One per distinct value, or grouped into calendar periods — hourly, daily, weekly, monthly, quarterly, yearly — or a fixed number of equal bins |
| What's on screen | Just the current step, everything up to it, or a rolling window of the last few steps |
| Trails | Earlier periods stay on the map behind the current one and fade toward an opacity floor over a chosen number of steps, so age reads as distance from the cursor |
| Playback speed | 0.25s, 0.5s, 1s, 2s, 3s or 5s per step |
| Loop | Restart from the beginning when the timeline ends |
| Cross-fade | Fade features in and out across a step instead of cutting between them |
| Markers | Circles in any colour and size, or a Maki or Lucide icon; either can take its colour — and an icon its glyph — from a category column, and its size from a number column |
| Density bars | A bar per step behind the slider showing how many features fall in it |
| Legend | Lists each value of the category column on the map |
| Popup | Choose which properties a marker shows when clicked |
| Panel | Custom title, and the option to start collapsed so the map is not covered on load |
Long-form writing beside a map that moves as the reader scrolls. Each chapter has its own text and its own camera; crossing into a chapter flies the map to that place. It is the format for a journey, an investigation, a field report, a guided tour.
Write chapters by hand, or import a point file to get one chapter per feature and edit from there. Chapter text is Markdown, so headings, links, emphasis and lists all work.
| Per chapter | Options |
|---|---|
| Camera | Centre, zoom, bearing 0 – 360°, pitch 0 – 85°, and a flight duration (2000 ms by default) |
| Marker | Show or hide it; a Maki or Lucide icon, or the chapter number, in any colour and size |
| Animation | Seven presets — none, fade, slide up, slide left, scale in, blur in, spring — with an optional delay |
| Whole story | Options |
|---|---|
| Scroll trigger | Where in the viewport a chapter becomes active — the middle by default |
| Progress indicator | On or off, down the left or right edge |
| Center crosshair | Off by default; six styles — cross, dot, reticle, target, frame, pin — in any color, 32–160 px, at any opacity |
| Appearance | Panel and card colours, font, title size, corner radius, card style, and a panel width of 280 – 600 px |
| Navigation | Scrolling, plus keyboard |
The one type you do not supply data for. Visitors drop a pin, fill in a form you designed, and their submission arrives in a moderation queue. Approve it and the pin joins the public map. Community reporting, field surveys, directories, contests, citizen science.
| Area mode | Behaviour |
|---|---|
| Global | Anywhere on Earth |
| Region | One or more countries, states, counties or NUTS regions, picked by name |
| Bounding box | A rectangle, drawn on the map or typed as coordinates |
| Polygon | Any shape you draw — a city limit, a park, a catchment |
Whatever you choose is rendered as a spotlight: everything outside the area is dimmed and the allowed region is a clear window, so visitors can see where they are allowed to contribute before they try.
Region searches the same boundary catalog the choropleth map uses — geoBoundaries for countries, states and counties worldwide, and Eurostat NUTS levels across Europe. Pick “Serbia”, or three counties in Germany, and pins are held to the real administrative border rather than a box you eyeball. The boundary is simplified for display, so a pin within a few hundred metres of the border may fall on either side; draw a polygon when you need an exact line.
Fourteen field types: text, textarea, number, email, URL, date, time, phone, rating, select, radio, multiselect, checkbox and image. Six starter templates — report a pothole, business listing, photo contest, event submission, site review, sighting log — give you a working form to adapt. A live preview shows exactly what visitors will see as you build.
| Setting | Default |
|---|---|
| Open for submissions | Open. Turn it off, or set a closing date and time, and the form stops accepting entries with a message you write. Approved pins stay on the map either way — closing stops new submissions, it does not take the map down. |
| Auto-approve | Off. On, submissions skip the queue and appear immediately — worth turning on only once you have watched the abuse defences hold. |
| Rate limit | 5 submissions per hour and 20 per day, per visitor |
| Image uploads | Allowed, 1 attachment per submission (up to 5), 5 MB each. JPEG, PNG and WebP only, verified by inspecting the file itself rather than trusting what it claims to be. |
| Honeypot | On. An invisible field with a name unique to your map that bots fill in and humans never see. |
| CAPTCHA | Off. Cloudflare Turnstile can be switched on when a campaign attracts attention. |
| Allowed origins | Unrestricted. Set a list and the form only accepts submissions from pages you name, which is how you lock an embed to your own site. |
X-Mapji-Signature header — an HMAC of the body using your shared secret — so your receiver can prove it came from Mapji. Failures are retried, and the last deliveries are listed in the editor so you can see what your endpoint actually returned.| Setting | Options |
|---|---|
| Public visibility | Hidden (nobody sees approved pins), pins only, or pins with a details popup |
| Pin rendering | Clustered (default), heatmap, or every pin drawn plainly |
| Field mapping | Which fields become the pin's title, description, image, colour and value |
| Public fields | An allowlist. Only mapped fields and fields you tick here are ever published — everything else stays in the dashboard, which is how you collect a phone number without publishing it. |
| Feedback | The success message, or a URL to redirect to after submitting |
Two maps of the same place, locked to the same camera, so a reader can hold one dataset against another. Before and after, plan and reality, two years, two scenarios.
| Setting | Options |
|---|---|
| Layout | Swipe — both maps full-bleed with a draggable divider revealing one under the other — or split, two half-panes side by side |
| Orientation | Left/right or top/bottom |
| Sync | Always on in swipe (the maps overlap, so they must agree). Optional in split, if you want the halves to move independently. |
| Labels | A caption per side, shown over the map |
Each side is configured independently and holds its own dataset, imported from its own button in the sidebar.
| Per side | Options |
|---|---|
| Display mode | Overlay (the raw geometry, with fill, line and circle styling), heatmap, cluster, or isochrone from a single origin |
| Basemap | Inherit the site's theme, any of the seven built-ins, or one of your custom themes |
| Background layers | Its own list, independent of the other half |
| Colours | Its own accent, used consistently across every mode |
One import pipeline serves every map type. It reads the file server-side, normalises it to WGS84 and hands it to whichever type you are working in — so a Shapefile and a KML behave identically once they are in.
| Format | Extensions |
|---|---|
| GeoJSON / TopoJSON | .geojson .json .topojson |
| Shapefile | .zip containing at least .shp, .shx, .dbf and .prj — reprojected for you |
| Google Earth | .kml .kmz |
| GPS tracks | .gpx |
| Spreadsheets | .csv .xlsx .xls with latitude and longitude columns |
Every one of these works on every map type that imports at all — which is all of them except Crowdsourced Map, whose data comes from visitors.
Most types import from the Import button in the editor header. Four import from their own surface instead, because each needs to know something the generic dialog does not:
| Map type | Where |
|---|---|
| Cluster, Heatmap, Choropleth, Store Locator, Time Slider | The Import button in the editor header |
| Draw | Import in the drawing toolbar — merges into the canvas |
| Story Map | The chapter builder — one chapter per feature |
| Isochrone | The origin picker — seeds up to 5 origins |
| Compare | The per-side button in the sidebar |
A spreadsheet is converted in your browser, so you see a preview of the columns before anything is uploaded. Latitude and longitude are detected from common column names; confirm or correct them in the mapping dialog. Every other column is carried onto the features as a property, which is what makes it available later to search, filters, popups, cluster categories and heatmap weights.
52.3676, not 52° 22' 3" N. Rows with a blank or out-of-range coordinate are skipped rather than plotted somewhere wrong.If the map already has data, you are asked whether to replace it or add to it. Draw always merges — it would otherwise delete the drawing you are in the middle of — and Compare always replaces the side you are importing into.
Your appearance settings survive either way. The one thing that does not is configuration that names a column of the old data: if a heatmap's weight column is missing from the new file the weighting is dropped back to unweighted, and if a time slider's time column is gone the slider configuration is cleared and re-detected — a slider pointing at a column that no longer exists renders nothing at all, which is worse than starting over.
Draw, Cluster, Heatmap, Time Slider, Choropleth and Compare accept any geometry. Store Locator, Story Map and Isochrone are point-based, so lines and polygons are reduced to a representative point on import. Features with no usable coordinates are dropped.
Instead of uploading a file, connect a Google Sheet and the map follows it. Your team keeps editing the spreadsheet they already use; the map updates itself. This is the right answer whenever the data has an owner who is not the person who built the map.
Paste the sheet URL
Any spreadsheet your Google account can read. It does not need to be shared publicly.
Pick the tab
One tab per map. Mapji lists what the workbook contains.
Map the columns
Latitude and longitude, plus title and description. A time column for a Time Slider, region and value columns for a Choropleth, a weight column for a Heatmap. Optionally pass every remaining column through as feature properties — do this if you plan to search or filter on them.
Leave it running
Mapji re-checks the sheet about every five minutes and rewrites the map only when the contents have actually changed. There is a Sync Now button for an immediate pull, and a status widget showing the last successful sync and any error.
| Fact | Detail |
|---|---|
| Supported types | Cluster, Heatmap, Choropleth, Store Locator, Time Slider |
| Not supported | Draw, Isochrone, Story Map, Crowdsourced Map, Compare — each has its own data flow |
| Access | Read-only. Mapji requests only the read scope, so it cannot write to, reformat or delete anything in your spreadsheet. |
| Sign-in | Requires a Google connection, since the sheet is read as you |
| Row limit | The first 10,000 mappable rows; the status widget reports how many were skipped |
A Crowdsourced Map gets its own dashboard page for reviewing what comes in. It is laid out like a map editor rather than a report: a list of submissions beside a live map. Clicking a row flies the map to its pin; clicking a pin selects and scrolls to its row. Pins are coloured by status, and the map mirrors whatever filter is active rather than only showing approved pins.
| Capability | Detail |
|---|---|
| Moderate | Approve, reject or mark spam — one at a time from the row, or in bulk across a selection |
| Filter | By status, by name or email, by whether a photo was attached, and by a date range |
| Inspect | A detail view with every field value, the attached photos, and the visitor's own coordinates |
| Correct | Edit field values and move the pin, for the submission that got the right information into the wrong place |
| Export | Everything currently filtered, as CSV |
| Deep links | Every submission has its own URL, which is what the notification email links to |
Submissions are rendered against the form as it was when they were made. Change your form later and old submissions still display with the questions their author actually answered, rather than being reshaped to fit the current version.
To make moderation possible, each submission records what the request revealed: IP address, an approximate country, region, city and timezone, the page it was submitted from, and the browser and device. It is used for rate limiting and for judging whether a batch of submissions is genuine.
This is personal data and it is visible only to you, the map's owner. It is never published to the map, never included in the public GeoJSON, and never shown to other visitors. If you collect submissions from the public, say so in your own privacy notice.
| Limit | Value |
|---|---|
| Features per data source | 10,000 |
| Import file size | 25 MB |
| Google Sheets rows per sync | 10,000 mappable rows |
| Isochrone origins | 5 per map |
| Route stops | 2 – 10 per route |
| Background layers | 5 per map, or 5 per Compare side; up to 8 source layers from one vector archive |
| Form field types | 14 |
| Submission attachments | Up to 5 per submission, 5 MB each by default |
| Map name | 32 characters |
| Map description | 140 characters in the create dialog |
| 404 message | 240 characters |
| Thumbnail / logo upload | 10 MB |
| Web address | Letters, numbers and hyphens; a short list of reserved names is unavailable |
Over the feature limit, the usual answers are to aggregate before importing (one row per region rather than per event), to split the dataset across several maps, or to publish it as a background layer, which is fetched live and is not subject to the cap.
The basemap is what your data sits on. Seven are built in, and switching between them is instant and non-destructive — your data and every setting are untouched. Change it from the Style button on the map.
| Theme | Description |
|---|---|
| Light | A clean, low-contrast vector map. The default, and the safest backdrop for coloured data. |
| Dark | The same map inverted — good for bright markers and heatmaps. |
| White | Near-blank: geometry with almost no fill. Maximum contrast for the data on top. |
| Black | The inverse, for dark presentations and screens. |
| Grayscale | Neutral monochrome, so the only colour on the map is yours. |
| Satellite | Aerial and satellite imagery, on its own. |
| Hybrid | The same imagery with roads, boundaries and place names drawn over it — usually what people mean when they say satellite. |
Vector themes are drawn from OpenStreetMap data via Protomaps; imagery comes from Esri World Imagery. Attribution is rendered on the map automatically.
When none of the seven fits — a brand palette, a print style, a deliberately quiet backdrop — build your own. Custom themes are saved to your account and can be applied to any of your maps from the Style picker, so one theme can carry a whole set of maps. Create and edit them under Settings → Custom Map Styles, with a full live map beside the editor.
| Tab | What you control |
|---|---|
| Colours | Around 45 individually settable colours: water, land, parks, woodland, scrub, sand, beach, glacier, buildings, hospitals, schools, industrial, airports, every road class and its casing, bridges, tunnels, boundaries, and every label and halo. |
| Roads | A width scale per group — highway, major, minor, railway, boundaries — plus whether roads get a casing and how thick it is. |
| Dashes | A dash pattern per line class: solid, dashed, dotted, long dash or dot-dash. This is what turns a boundary into a dotted line or a railway into a proper hatched track. |
| Labels | Halo width and text size, plus independent zoom bands controlling when buildings, POIs, minor roads and labels appear at all — the most effective way to quieten a busy map. |
| Patterns | Tileable textures over parks (forest hatch, forest dots, park cross), water (wave) and beach (stipple), at an opacity you set. Useful for a hand-drawn or cartographic look. |
Start a custom theme from any of the five vector themes as a base, then override only what you need. Editing a saved theme updates every map using it.
Three optional layers, toggled from the Style button and available on any theme. They work together — terrain with a tilted pitch and contours makes a landscape map, buildings with terrain makes a city one.
| Layer | What it adds |
|---|---|
| 3D terrain | Real elevation, so the ground has relief. Combined with automatic hillshading, tuned per theme so it reads on light and dark basemaps alike. Tilt the map to see it. |
| 3D buildings | Real building footprints extruded to their real heights, from the Overture Maps dataset. They appear from zoom 13, so tilt in over a built-up area to see them. |
| Contour lines | Elevation contours generated from the same terrain data, with the interval chosen for the zoom level, major and minor lines distinguished, and elevations labelled. |
Draw and Compare maps can render a published map service beneath your own data: aerial imagery, a cadastral layer, a scanned historical sheet, a soil or flood dataset. Nothing is imported — the tiles are fetched live from the publisher every time someone opens your map, so the layer stays current and none of it counts against your feature limit. Add one from the Layers button. On a Compare map each side keeps its own list, so you can put imagery behind one half and a reference layer behind the other.
| Service | What to paste, and what happens |
|---|---|
| WMS | The service URL. Mapji reads its capabilities document and lists every layer it publishes so you can pick one or several. Versions 1.1.1 and 1.3.0 are both handled; projection, image format and tile size are worked out for you. |
| ArcGIS | A MapServer or ImageServer endpoint. A cached service is drawn straight from its tiles where the cache allows it and rendered on demand where it does not — either way you just paste the URL. |
| PMTiles | A single-file tile archive on ordinary storage — S3, R2, or any static host that serves byte ranges. Image archives draw as imagery; vector archives let you pick which of their layers to draw, up to eight, and in what colour. |
| XYZ tiles | Any standard {z}/{x}/{y} tile template, which covers most published raster tile sets and anything you host yourself. |
| Behaviour | Detail |
|---|---|
| How many | Up to 5 per map, or per Compare side |
| Stacking | Always beneath your own markers and shapes, and beneath the basemap's place names, so nothing you added disappears behind a backdrop |
| Adjusting | Reorder, set opacity, and hide one temporarily without removing it — none of which reloads the tiles |
| Vector archives | Auto-styled in one accent colour, with fills, outlines and points drawn correctly whatever the layer contains. A reference layer, not a second map editor. |
What visitors are allowed to do with the map. All seven are on by default, and they apply to the published map and to embeds — not just the editor preview. There is a Lock all / Unlock all switch for kiosk-style displays and static illustrations.
| Interaction | Effect | Default |
|---|---|---|
| Drag pan | Click and drag to move the map | On |
| Drag rotate | Right-click and drag to rotate and tilt | On |
| Scroll zoom | Zoom with the wheel or trackpad | On |
| Double-click zoom | Zoom in on double-click | On |
| Touch zoom & rotate | Pinch and twist on touch devices | On |
| Box zoom | Shift-drag to zoom to a rectangle | On |
| Keyboard | Arrow keys to pan, +/− to zoom | On |
Which widgets appear on the published map. These also save with the site and apply to visitors, from the Widgets button on the map.
| Widget | What it does | Default |
|---|---|---|
| Zoom buttons | Plus and minus, top right | On |
| Compass | North indicator; click to reset bearing and pitch | On |
| Scale bar | A distance reference in the corner | On |
| Locate me | Centres on the visitor's location. Needs their permission, so it is off unless the map is about where they are. | Off |
| Fullscreen | Expands the map to fill the screen | Off |
| Minimap | A small overview map in the corner showing where the main view sits | Off |
| Export | Lets visitors download the current view as an image or document | Off |
Worth enabling when people will want to put your map in a report or a slide. It downloads exactly what is on screen, at print resolution.
| Option | Choices |
|---|---|
| Format | PNG, JPG, PDF or SVG |
| Resolution | 72, 96, 200, 300 or 400 DPI |
| Page size | Letter, A2 – A6, B2 – B6 |
| Orientation | Landscape or portrait |
A search and filter panel can be added to most map types, letting visitors search across the fields you choose and narrow the map with faceted filters. It searches your data — the columns you imported — not the world. Mapji has no geocoder, so a query matches feature properties rather than street addresses.
Available on Draw, Cluster, Heatmap, Choropleth, Time Slider, Isochrone and Crowdsourced Map. Store Locator is excluded because its sidebar already has a richer search built on the same engine; Story Map and Compare do not offer it. On a Choropleth the region name and value are searchable as “Region” and “Value”; on an Isochrone the search covers your named origin markers.
When you add a filter, Mapji reads the column and picks the control that fits it:
| Control | Chosen when |
|---|---|
| Range slider | More than 80% of the values are numeric |
| Dropdown | 10 or fewer distinct values |
| Multi-select | 11 to 30 distinct values |
| Not offered | More than 30 distinct values — a filter with that many options is a worse search box |
Comma-separated cells are split into separate values, so one row can match several options in a multi-select. That is what makes a “services offered” or “tags” column behave the way people expect.
| Setting | Options |
|---|---|
| Title and placeholder | Your own wording |
| Position | Any of the four map corners |
| Start collapsed | Useful on a small map where the panel would cover the data |
| Results list | Show matching features as a list. On by default. |
| Fly to matches | Move the map to fit what matched. On by default. |
| Highlight colour | How matched features are emphasised |
| Searchable fields | Specific columns, or all of them |
| Result label | Which column names each result; auto-detected if unset |
Configured under Search & filter in the Settings tab. Because it lives on the site rather than on the imported data, it stays reachable before you have imported anything.
Four tabs, reached from Settings in the map editor.
Every map is published at yoursubdomain.mapji.com from the moment it is created. The subdomain is generated from the name and can be changed here — letters, numbers and hyphens, with a short list of reserved names unavailable.
To use your own domain, enter it and Mapji shows the DNS records to add at your registrar, then verifies them and issues an HTTPS certificate. An apex domain and a subdomain such as maps.yourbrand.com both work. Until verification completes the map keeps serving on its mapji.com address.
This tab is about the page around the map, not the map style — for that see basemap themes.
| Setting | Detail |
|---|---|
| Thumbnail | The preview image used on link shares and in your dashboard. Captured from your map automatically; upload your own to override. PNG or JPEG up to 10 MB, ideally 1200×630. |
| Logo | Shown on the published site. PNG or JPEG up to 10 MB, ideally 400×400. |
| Heading font | The typeface for headings on the site. |
| 404 message | What a visitor sees at a URL on your site that does not exist. Up to 240 characters. |
Builds the iframe snippet — see Embedding.
Every published map has a separate embed URL and a generated <iframe> snippet, built in the Embed tab of Settings. It works anywhere that accepts an HTML embed — a CMS, a blog post, a documentation site, a landing page.
| Option | Choices |
|---|---|
| Width | Full (100%) or a fixed pixel width. Full is almost always right — it lets your page decide how much room the map gets, and fixed widths break on phones. |
| Height | In pixels |
| Corner radius | 0, 4, 8, 16 or 24 px |
| Allow fullscreen | Adds the attribute the fullscreen widget needs to work inside an iframe |
| Auto-resize | Adds an optional listener script — see below |
An iframe cannot work out how tall its contents want to be, so you either guess a height or use the listener script offered alongside the snippet. With it on the page, the embed reports its content height and the iframe resizes to match — which matters most for a Crowdsourced Map, where the form grows as validation messages appear. Add the script once per page: it matches each message to the iframe it came from, so a single copy handles every Mapji embed on the page, including two copies of the same map.
Interaction and widget settings apply to embeds exactly as they do to the published map, so configure them with the embedding context in mind — see the note under Interactions about scroll zoom. A Crowdsourced Map accepts submissions from inside an embed; if you want it to accept them only there, set the allowed-origins list in its Rules tab.
The embed URL is excluded from search engines on purpose, so it never competes with the page you put it on. Your published map on its own subdomain or custom domain stays crawlable, so link to it directly as well if you want the map itself to rank as a destination.