Version 1.4.0
November 12, 2026
Geo Maps now comes in two editions. Lite is free and includes everything from 1.3. Pro adds the new features marked below. Try Pro free on local and staging sites by switching the edition under Settings → Plugins.
Added
craft.geomaps.locator(), a locator component that outputs an address search, “Use my location”, a distance filter, a numbered results list and a map with matching pins for any element query.- Pro: marker clustering for
embed()maps (cluster: true), which groups nearby pins into numbered bubbles on OpenStreetMap and Google maps. - Pro: missing coordinates are found for locations saved with only an address, such as from Feed Me imports, in a background job or with
php craft geomaps/geocode. - Pro: search within an area, with
withinon the field’s query param and in GraphQL. Find entries inside the visible part of a map, for “search as the map moves”, or inside drawn shapes such as regions and delivery zones, optionally sorted by distance. - Pro: JSON search endpoints for headless sites and apps, set up in
config/geomaps.phpundersearchEndpoints. They return the nearest entries with distances, locations and chosen fields, with paging, map-area search and CORS. - Pro:
php craft geomaps/locations/importandexportload locations, zones and trails from CSV, GeoJSON, KML or GPX into a section, and export them as CSV, GeoJSON or KML. Re-running an import updates entries rather than creating copies. - Pro:
entry.myField.schema()outputs schema.org local business structured data with the address, coordinates and opening hours, andschemaData()returns it as an array. - Pro: delivery zones for Craft Commerce. Shipping rules, shipping methods and discounts get “Delivery address is in zone” and “Delivery distance (km)” conditions, to price or limit delivery by areas drawn on a map or by distance from the store.
embed()maps can zoom to fit their markers (fitMarkers: true), and page scripts can open a marker’s info window withelement.geomaps.open(index).- A simpler settings page: choose one Map service (OpenStreetMap, Mapbox or Google Maps) for maps, address search, location lookups and static images, and see which services the site is using.
- Mapbox as a map service: add an access token and pick a style (Streets, Light, Dark, Satellite or your own from Mapbox Studio), with a live preview. Maps, address suggestions in the field and forms, location searches, missing coordinates and static images then use Mapbox.
embed({ provider: 'google' })orprovider: 'tiles'chooses the map for a single map, and themapProviderandcpMapProviderconfig settings show the map tiles instead of Google maps on the front end or in the control panel.img({ provider: 'mapbox' })orprovider: 'google'chooses the service for a single static map image.
Changed
- Google address lookups are only used when both Google keys are set, because Google’s terms only allow its results on Google maps. Sites with a Google server key but no browser key now look up addresses with OpenStreetMap instead.
- Existing sites keep their maps: Geo Maps uses Google Maps when a Google browser key is set, Mapbox when the tiles URL is a Mapbox style, and OpenStreetMap or your tiles URL otherwise.
- Address search in the field now starts after 3 characters and a short pause, like
addressInput(), so typing an address sends fewer requests to Google, Mapbox or OpenStreetMap.
Fixed
- Google Places address suggestions in the field sometimes didn’t appear, because the field started before Google’s script had finished loading. If Google Places isn’t available, the field now suggests addresses from OpenStreetMap instead of showing none.
- Dragging the pin on a Google map in the field left the old address when the browser key didn’t have the Geocoding API enabled. The address is now looked up with OpenStreetMap instead.
- With Google maps in the field, the map tiles from the plugin settings (such as Mapbox) were also loaded underneath, using up tile requests. They're now only loaded if Google fails.
- Address search with OpenStreetMap, in the field and
addressInput(), filled in the city rather than the suburb (“Adelaide” instead of “Ashford”), and dropped the house number when OpenStreetMap only knows the street. The suburb is now used, and the house number you typed is kept. - Picking an address the field’s map was already showing logged errors in the browser console.
embed()maps with markers but nocenterstarted at 0, 0 in the ocean, so a map with a single marker didn’t show it. They now start on the first marker.- Opening an entry could mark it as edited and save a draft without any change, when the field’s map zoomed on its own while loading, such as with Hide Map turned on.
- The shape panel didn’t show the default blue as the chosen colour for shapes without a colour.
Version 1.3.0
November 8, 2026
Added
craft.geomaps.addressInput(): an address box with suggestions for front-end forms. Picking an address fills in its coordinates and address parts, ready to save into a Geo Maps field from an entry form or to search by. Works with the keyboard and screen readers, needs no API key, and can be limited to chosen countries.
Version 1.2.2
November 7, 2026
Fixed
- Reinstalling Geo Maps over a lookup table left by an earlier install could break distance and zone search, and saving shapes, with an “Unknown column 'shape'” error. Installing now updates the existing table and re-indexes saved locations.
Version 1.2.0
October 22, 2026
Added
- A redesigned shape panel in the field: click a shape to rename it, see its area or length as you draw, pick its colour from swatches, and edit its properties, or zoom to, copy or delete just that shape.
length()andarea()on field values, for trails, routes, zones and parks (entry.route.length('km'),entry.zone.area('ha')).- Shapes in the field are drawn in their own
color,strokeandfill, matching front-end maps. - Lines on
embed()maps are 4px wide by default, and any shape’s line width can be set with aweightproperty. - The config file template includes the Map Tiles URL and Map Credit settings.
Changed
- OpenStreetMap geocoding (Nominatim) requests are spaced at least a second apart, as its usage policy requires, and pause for 10 minutes if Nominatim asks the site to slow down.
- Google geocoding results are cached as coordinates only, as Google’s terms require.
Fixed
- Shape-only fields showed “No location set” while shapes were drawn; the footer now shows the centre of the shapes, which is saved as the location.
- Deselected shapes in the field turned purple instead of keeping their colour.
- Static map images wider or taller than 640 pixels failed; they’re now scaled down to Google’s limit.
- Static map marker labels with accents or punctuation, and named marker colours such as
red, produced invalid images. - Feed Me treated any two-letter country, such as
UK, as a country code and lost the country name. - A “Map styles must be an array” warning in the browser console with Google maps.
Version 1.1.1
October 20, 2026
Added
embed()widthandheightaccept CSS lengths such as'100%'or'60vh', as well as pixels.- Shapes on Google
embed()maps use theircolor,strokeandfillproperties and show theirnamewhen clicked, as on OpenStreetMap maps.
Changed
- The field saves the map’s zoom level with each location, and Initial Location in field settings saves its zoom.
- Feed Me fills in the country name from a two-letter code, and the field type is listed as “Geo Maps”.
Fixed
- Pressing Enter in the field’s address search saved the entry.
- Saved GeoJSON that wasn’t valid stopped the field from loading, so it couldn’t be fixed.
- After deleting every shape, edits in the GeoJSON editor no longer updated the map.
- Shape-only fields kept their old location after the last shape was deleted.
- The field ignored its default zoom once an entry had a value.
- The shape property editor opened with the wrong value type.
- Distance search missed entries across the 180° meridian and near the poles.
img()andimgSrcSet()options carried over to later calls on the same value.embed()on a value with only an address centred the map at 0, 0.- Invalid Feed Me coordinates were saved as 0 instead of being reported.
- Imported Min Zoom / Max Zoom settings were saved as decimals.
- Rebuilding the location search index was slow on sites with many field layouts.
- Download saved the text “null” when there were no shapes; files are now named
.geojson.
Version 1.1.0
October 20, 2026
Added
- Custom pin images and info windows for
embed()maps: newicon,htmlandopenmarker options, plus a top-leveliconfor every marker. Works with OpenStreetMap and Google maps.
Changed
- The plugin icon is 98% smaller (33 KB instead of 2.2 MB), so the control panel loads it faster.
Security
- Map settings written into the page are now escaped so content such as entry titles can’t break out of the inline script.
Version 1.0.0
October 20, 2026
Added
- Redesigned control panel field: search bar, uncovered map, labelled location details beside the map (or below it in narrow spaces such as Matrix blocks and slideouts), and a footer with the current coordinates, Clear and GeoJSON tools.
- Click the map to drop the pin.
- Map Height field setting.
containslocation search: find entries whose areas contain an address or point (e.g. which bin-collection zone or delivery area a customer is in), pluscontains()on field values andcontains/containsCoordinatein GraphQL. Holes are respected.- Show Location Pin field setting for shape-only fields (zones, areas). The location becomes the centre of the shapes.
embed()draws the field’s shapes and fits the map to them; newgeoJson,markerandfitShapesoptions.- Enable Drawing & GeoJSON field setting, for fields that only need a single location.
- Limit Search to Countries field setting: restrict address search to up to five countries (replaces the single country setting; existing values carry over).
- If Google rejects the Maps API key, the field and front-end maps switch to OpenStreetMap and explain why, instead of showing Google’s error.
- The GeoJSON panel has a title, explanation, close button and an example when empty.
- Works without API keys: OpenStreetMap tiles, address search (Photon) and geocoding (Nominatim) are used when no Google key is set.
- Map Tiles URL and Map Credit settings for using any raster tile provider.
- Import existing fields from other map and GeoJSON plugins under Utilities → Geo Maps Import — one field at a time or all at once — or with
php craft geomaps/import [--field=handle]. address,parts,img()andimgSrcSet()on field values, so imported templates keep working.- Proximity search results now include
distanceon the field value (Twig and GraphQL). - Location search accepts a
coordinate, a{ lat, lng }object, an address string, or another Geo Maps value. :empty:/:notempty:query params (a pin or a drawn area counts as a value).php craft geomaps/lookup/rebuildto rebuild the location search index.- Geocoding results are cached to save API quota.
Changed
- The GeoJSON editor loads only when its panel is opened, roughly halving the control panel script loaded on entry pages (283 KB → 149 KB gzipped).
- Field settings no longer store leftover value properties in project config.
- Drawing tools moved to the top-left; circle tools removed because GeoJSON can’t store circles.
- Google geocoding errors (e.g. a restricted key) now fall back to OpenStreetMap instead of returning no results.
- Requires Craft CMS 5.10 or later.
- Leaflet and drawing-tool styles are now bundled instead of loaded from unpkg.
- Country options come from Craft’s address repository.
- Postcodes are stored as strings, so leading zeros and alphanumeric postcodes are kept.
- The
craft.mapsTwig variable was removed (it clashed with another plugin); usecraft.geomaps.
Fixed
- Location search never returned results because coordinates weren’t written to the search index. Existing content is reindexed on update.
- Coordinate and GeoJSON validation errors weren’t shown.
- Soft-deleted then restored entries dropped out of location search.
- Location search added a global event listener for every element query.
- Static maps crashed on sites without the CKEditor plugin.
- Static map URLs double-encoded address centers and markers.
embed()broke when the mapidcontained a hyphen.- Saved initial map location in field settings was ignored.
- Google Places/Geocoder errors when the Maps API loads asynchronously or fails to load.
- Location search on PostgreSQL.
- New entries saved the field’s default map centre as their location.
- The field’s preferred country was saved into each entry’s country.
- The country value held the county/state name when picked from Google search.
- Whole-number coordinates were treated as empty.
- The control panel asset bundle published PHP files to the web root.
- Field styles leaked into the rest of the control panel (e.g. submit buttons).
- The map didn’t fill its container after being revealed in tabs, slideouts or field settings.
- Clear left the country code and search text behind.
- Duplicate OpenStreetMap search suggestions.
- GeoJSON saved as a bare geometry (without
properties) broke the map. - Marker labels in front-end Leaflet maps weren’t escaped.
- Min Zoom and Max Zoom field settings had no effect.
- The field-settings map showed Google’s error panel when the key was rejected.