Dev.to WebDev 🛠 Dev 👁 0 📖 14 min read

MapLibre vs. Google Maps: Which Map SDK to Use?

Originally published on the Capawesome blog. MapLibre is a free, open-source map renderer that draws tiles from a provider you choose, while Google Maps is a data platform billed per SKU once a free monthly cap runs out

MapLibre vs. Google Maps: Which Map SDK to Use?

Originally published on the Capawesome blog.

MapLibre is a free, open-source map renderer that draws tiles from a provider you choose, while Google Maps is a data platform billed per SKU once a free monthly cap runs out. That makes MapLibre vs. Google Maps a decision about data more than rendering. Pick Google when your app needs its places, Street View or traffic, and MapLibre when the map shows your own points, routes and areas. This post compares 2026 pricing, the map ID billing trap, tile costs, terms, rendering, offline support and search, with a Capacitor focus on @capacitor/google-maps and the free Capacitor MapLibre plugin. The Capacitor MapLibre plugin is built and maintained by Capawesome and is not affiliated with or endorsed by the MapLibre organization.

Thousands of teams ship faster with Capawesome Cloud Native Builds and Live Updates

Key takeaways:

  • Google Maps Platform has no base fee; since March 1, 2025, each SKU has a free monthly cap of 10,000 (Essentials), 5,000 (Pro) or 1,000 (Enterprise) events.
  • Native map loads on Android and iOS are free and unlimited only without a map ID; with one, they bill as Dynamic Maps at $7.00 per 1,000 after 10,000.
  • The MapLibre renderer and the Capacitor MapLibre plugin are free; 1.5 million tile requests a month cost $0 on OpenFreeMap and $500 on CARTO's commercial plan.
  • Google's terms forbid tile caching and Places content on non-Google maps; EEA terms since July 8, 2025 lift the non-Google-map rule but bar Places API content from any map.
  • MapLibre Native supports offline regions through OfflineManager on Android and MLNOfflineStorage on iOS, but the Capacitor MapLibre plugin does not expose them yet.
  • MapLibre itself has no Street View, traffic layer, indoor data or places database, so the data your app needs decides the choice more than the price does.

Renderer vs. platform

MapLibre is a rendering engine without map data of its own. The MapLibre organization maintains MapLibre GL JS for browsers and MapLibre Native for Android, iOS and desktop, both forked from Mapbox's libraries before Mapbox moved them to a non-open-source license in December 2020. A charter governs the project through a five-person board on which no single company may hold more than one seat, and sponsors include Amazon Web Services, Microsoft and MapTiler. A style document following the MapLibre Style Spec decides where the tiles, fonts and sprites come from.

Google Maps Platform sells three layers under one account: the rendering SDKs (Maps SDK for Android and iOS, Maps JavaScript API), Google's map data, and web services such as Places, Routes and Geocoding. Each of them requires a billing-enabled Cloud project and an API key, on mobile as well as on the Web.

The Capacitor plugins mirror that split. @capacitor/google-maps wraps the Google rendering SDKs and has no API for Street View, Places or Directions, which remain separate Google Maps Platform services. The Capacitor MapLibre plugin wraps MapLibre Native on Android and iOS and MapLibre GL JS on the Web, where maplibre-gl has been an optional peer dependency since plugin version 0.2.0. With MapLibre, the data source is a separate decision, and most of this comparison is about it.

Google Maps pricing

Google Maps Platform has no monthly base fee in 2026. Every billable event, such as a map load or an autocomplete request, belongs to a SKU with a free monthly cap, and you pay a listed price per 1,000 events above that cap. Optional subscriptions from $100 a month swap this for a fixed price, and native mobile map loads without a map ID cost nothing at any volume.

Since March 1, 2025, the free cap depends on the SKU category and replaces the former $200 monthly credit:

  • Essentials: 10,000 events per month
  • Pro: 5,000 events per month
  • Enterprise: 1,000 events per month

These are the SKUs a typical map screen triggers, with first-tier prices in USD from Google's pricing page as of September 2026:

SKU Free per month Price per 1,000 Triggered by
Maps SDK Unlimited $0 Native map load without a map ID
Dynamic Maps 10,000 $7.00 Web map load, native map load with a map ID
Dynamic Street View 5,000 $14.00 Street View panorama
Autocomplete Requests 10,000 $2.83 Search box request
Place Details Essentials / Pro / Enterprise 10,000 / 5,000 / 1,000 $5.00 / $17.00 / $20.00 Place details lookup
Geocoding 10,000 $5.00 Address to coordinates
Compute Routes Essentials 10,000 $5.00 Route request (Routes API)

Zooming and panning do not create extra billable events. Above 100,000 events a month, prices drop in volume tiers that count usage across all projects on a billing account; Dynamic Maps falls to $5.60 per 1,000 up to 500,000 loads. Calculated from these list prices, a month of web map loads costs:

  • 50,000 loads: $280
  • 100,000 loads: $630
  • 250,000 loads: $1,470

The optional subscriptions launched on November 5, 2025 and put all included SKUs under one combined monthly call limit:

  • Starter: $100 per month for 50,000 calls, Dynamic Maps and Geocoding only
  • Essentials: $275 per month for 100,000 calls
  • Pro: $1,200 per month for 250,000 calls, adding Pro SKUs such as Place Details Pro

Starter covers the 50,000-load month above for $100 instead of $280. Google does not block calls beyond a plan's limit and bills the overage at pay-as-you-go prices, while free SKUs such as Maps SDK don't count toward it. New customers get a $300 trial credit that expires after 90 days. The Maps Demo Key skips billing details, but Google limits it to prototyping and documents it for the Maps JavaScript API and web services only.

The map ID trap

A map ID moves native map loads from the free Maps SDK SKU to Dynamic Maps. Google's SKU definition counts an Android or iOS map load as Maps SDK only when the map is "not loaded with a map ID". @capacitor/google-maps has accepted androidMapId and iOSMapId since version 5.4.0, and cloud-based map styling needs them. With a map ID set, native map loads on that platform draw from the Dynamic Maps cap of 10,000 and cost $7.00 per 1,000 after that.

For an app with 100,000 native map loads a month, that is the difference between $0 and $630, calculated from the list prices.

Styling without a map ID goes through the plugin's styles option, which takes JSON map styles. Issue #96, open since August 2025, reports that styles cannot be set when a map ID is present, so the two approaches don't combine. Unlimited mobile map loads therefore hold only for maps without a map ID, which rules out cloud-based styling.

The Web has no such exception. The Maps JavaScript API bills every load as Dynamic Maps with or without a map ID, and the plugin's web implementation assigns a map ID automatically when you don't pass one.

MapLibre tile costs

The Capacitor MapLibre plugin is free under the MIT license and needs no API key, so the running cost of a MapLibre map is whatever the tile provider charges. createMap(...) takes a style URL, and the style points the map at the provider's tiles, fonts and sprites. This example uses OpenFreeMap, which needs no key and no registration:

import { MapLibre } from '@capawesome/capacitor-maplibre';

await MapLibre.createMap({
  mapId: 'stores',
  elementId: 'map',
  styleUrl: 'https://tiles.openfreemap.org/styles/liberty',
  center: { latitude: 52.52, longitude: 13.405 },
  zoom: 11,
});

The returned promise resolves after the Liberty style has loaded from OpenFreeMap, with no account or key involved. Moving to another provider later means a different styleUrl, as long as the new style follows the MapLibre Style Spec. These are the main options as of September 2026:

Provider Free tier Paid Key
OpenFreeMap No request limits None, donation-funded No
Versatiles Free, self-hostable None, donation-funded No
CARTO basemaps 1M requests/month commercial, 5M non-commercial $500/month up to 10M Yes, free
MapTiler Cloud 100k requests/month, non-commercial Flex $30/month for 500k, then $0.15 per 1,000 Yes
Stadia Maps 200k credits/month, non-commercial Starter $20/month for 1M credits, then $0.03 per 1,000 Yes
Protomaps on Cloudflare R2 R2 free tier Workers $5/month incl. 10M requests No, own URL
Amazon Location Service 500k tiles/month for 3 months, new customers $0.04 per 1,000 tiles Yes
Mapbox vector tiles 200k requests/month $0.25 per 1,000 Yes, access token

CARTO has required a free API key since 2026 and may watermark tiles requested without one. MapTiler's free plan requires the MapTiler logo and suspends maps for the rest of the month at the limit, and MapTiler bills MapLibre usage by request because sessions only apply to its own SDK. Mapbox's guide to using its tiles with MapLibre covers GL JS only. Protomaps packs the whole basemap into one archive that you host yourself, though its docs warn that R2 is known to have higher latency.

To compare costs, assume 100,000 map views a month at 15 vector tiles per view. The 15-tile figure is how Jawg and Azure Maps define a map view, not a measurement of a Capacitor app. The resulting 1.5 million tile requests cost, calculated from the list prices above:

  • OpenFreeMap or Versatiles: $0
  • Stadia Maps Starter: $35
  • Amazon Location Service, after the free period: $60
  • MapTiler Flex: $180
  • Mapbox vector tiles: $325
  • CARTO commercial plan: $500

The same 100,000 views as Google web map loads come to the $630 from the pricing section, and to nothing as native Google map loads without a map ID. OpenFreeMap offers no SLA and no support, so an app that depends on its map should keep a paid provider or a self-hosted archive as the fallback.

Terms and lock-in

Google's Maps Platform Terms, last modified August 26, 2026, contain four rules that shape any map feature:

  • 3.2.2(b) Attribution: show all attribution Google provides, without modifying, obscuring or deleting it.
  • 3.2.3(a) No scraping: no pre-fetching, storing or bulk downloading of Google Maps content, map tiles included.
  • 3.2.3(b) No caching: only where the Maps Service Specific Terms allow it, and they grant nothing for map tiles.
  • 3.2.3(e) No use with non-Google maps: Google Maps Core Services may not be used with or near a non-Google map, which covers Places content on one and Street View on the same screen.

Rule 3.2.3(e) is where the lock-in sits. Once an app shows Places results next to a Google map, switching the renderer means replacing the search as well.

Since July 8, 2025, projects linked to EEA billing accounts can fall under separate EEA terms. According to Google's EEA FAQ, those terms remove the non-Google-map rule, but content from the Places API may no longer be displayed with any map, a Google map included. The Places UI Kit takes its place and works with third-party maps.

The MapLibre side has obligations too. OpenStreetMap data, the base of most free tiles, is licensed under the ODbL, which requires visible credit to OpenStreetMap and its contributors and puts altered data you distribute under the same license. Make sure your map screen shows that credit and whatever your tile provider asks for. OSM's own tile server is not meant as a production basemap, since its tile policy promises best-effort availability without an SLA and blocks generic user agents. Lock-in on this side stays low, because the Style Spec is an open format and leaving a provider means pointing at another style rather than rewriting the map.

Rendering

Both Capacitor plugins draw a native map view on Android and iOS. The differences sit in the rendering backends and in how that view shares the screen with the web view.

MapLibre Native replaced OpenGL ES with Metal on iOS in version 6.0.0, released January 16, 2024. On Android, Vulkan support arrived in 11.7.0 and became the default backend of the android-sdk package in 13.0.0. The Capacitor MapLibre plugin uses the org.maplibre.gl:android-sdk-vulkan-opengl artifact, version 13.5.0 by default, which switches between OpenGL and Vulkan at runtime. MapLibre renders any style JSON that follows the Style Spec, setStyle(...) swaps it while the app runs, and the Maputnik editor edits styles visually. The Google Maps SDKs offer the map types normal, hybrid, satellite and terrain, plus the two styling paths from the map ID section.

Inside a Capacitor app, the layering differs per plugin. @capacitor/google-maps renders beneath the web view on Android only; on iOS it renders the map directly into the web view, so no transparency is needed there. The Capacitor MapLibre plugin renders behind the web view on Android and iOS, so the map element and its ancestors need transparent backgrounds on both platforms. A Google Maps Alternative for Capacitor Apps walks through that transparency setup.

Globe view and 3D terrain exist in MapLibre GL JS, which added globe mode in version 5.0.0. Neither is in a released MapLibre Native version yet, and native globe support is still an open issue. On the Web, GL JS has required WebGL2 since version 6.0.0, which dropped WebGL1.

Offline maps

Google's terms leave no room for offline maps in your app. The no-caching and no-pre-fetching rules in section 3.2.3 forbid storing tiles, @capacitor/google-maps has no offline API, and a closed issue titled "Map goes blank when internet connection is lost" shows what users see without a connection.

MapLibre Native supports offline maps at the SDK level. On Android, OfflineManager lists and creates offline regions and downloads the resources they need. On iOS, MLNOfflineStorage manages offline packs and ambient caching. The Capacitor MapLibre plugin does not expose either API yet, as its FAQ notes: "Offline tile management is not part of this version of the plugin." Styles, fonts, sprites and tiles load from the network.

Any offline storage also has to respect the tile provider's terms. CARTO's basemap terms forbid on-device caching beyond 30 days, and OSM's tile policy forbids apps from offering prefetch features. OpenFreeMap publishes weekly planet downloads, including MBTiles, for teams that want to host the tiles themselves.

Data and search

Google's advantage is its data. Its December 2024 pricing announcement describes a map with information on over 250 million businesses and places. The Google Maps SDKs add Street View, a live traffic layer (enableTrafficLayer in the Capacitor plugin), indoor floor plans (enableIndoorMaps) and satellite imagery as a built-in map type. MapLibre has no equivalent for Street View, traffic or indoor data. Satellite imagery depends on the provider, for example MapTiler Satellite, Stadia Maps from its Standard plan, or the free Versatiles orthophotos.

The open alternatives come with open licenses. OpenStreetMap data falls under the ODbL described in the terms section. Overture Maps publishes its base, buildings, divisions and transportation themes under the ODbL as well, while its places theme mixes sources under CDLA Permissive 2.0, Apache 2.0 (Foursquare) and CC0 (AllThePlaces).

Search needs a separate service, because MapLibre ships no Places API. These services fill the gap:

  • Nominatim: the public OpenStreetMap geocoder allows an absolute maximum of 1 request per second and forbids client-side autocomplete, so it suits occasional lookups, not a search box.
  • MapTiler and Stadia Maps: both sell geocoding next to their tiles, and MapTiler includes 1,000 free search sessions a month.
  • Native geocoding: the Capacitor Geocoder plugin, part of the paid Capawesome Insiders subscription, uses the platform geocoder on Android and iOS without an API key and offers Google Maps or OpenStreetMap as providers on the Web.

Outside the EEA, section 3.2.3(e) rules out showing Google geocoding or Places results on a MapLibre map. The same applies to results from the Geocoder plugin's Google Maps provider on the Web.

Which to pick

The MapLibre vs. Google Maps choice follows the data your screens need, with cost as the tiebreaker.

Your app needs Pick Reason
Street View, live traffic or indoor maps Google Maps No MapLibre equivalent
Places search or Directions already in use Google Maps 3.2.3(e) ties Places to a Google map outside the EEA
A native-only map with Google data, no cloud styling Google Maps Map loads stay free without a map ID
Your own points, routes and areas MapLibre Any Style Spec tile provider works
No billing account, e.g. open-source or client apps MapLibre The plugin needs no key
A high-traffic web map MapLibre 1.5M tiles cost $0 to $500, Google web loads $630
Cloud-styled native maps at volume MapLibre A map ID bills native loads as Dynamic Maps
Place details next to a map in the EEA Places UI Kit, on either map EEA terms bar Places API content from any map

On mobile, a Google map without a map ID costs nothing to load, so price alone rarely justifies a switch there. On the Web and with cloud styling, Google bills every load above the free cap, and at 100,000 views a month every provider in the tile comparison costs less.

FAQ

How much does Google Maps cost per month in 2026?

There is no base fee. Every SKU has a free monthly cap, and you pay a listed price per 1,000 events above it, such as $7.00 for web map loads after the first 10,000. Native map loads without a map ID stay free at any volume. Optional subscriptions start at $100 a month for 50,000 calls. Apart from the prototyping-only Demo Key, every setup needs a billing-enabled Cloud project.

Is MapLibre free to use commercially?

Yes. MapLibre GL JS is licensed under BSD-3-Clause and MapLibre Native under BSD-2-Clause, and the Capacitor MapLibre plugin is MIT-licensed. Tile providers set their own rules. OpenFreeMap allows commercial use, while the free tiers of MapTiler and Stadia Maps exclude it.

Do I need an API key to use MapLibre?

Not for MapLibre or the Capacitor MapLibre plugin. The tile provider may need one. OpenFreeMap and Versatiles work without a key, CARTO issues a free one, and MapTiler, Stadia Maps and Amazon Location Service require their own. The plugin's default demo style is meant for testing, not production.

Can I show Google Places results on a MapLibre map?

Not outside the EEA, where section 3.2.3(e) of Google's terms forbids displaying Places content on a non-Google map. Projects under the EEA terms lose that rule, but Places API content may then not be displayed with any map. For those projects, Google offers the Places UI Kit, which works with any map, MapLibre included.

Does MapLibre work offline in a Capacitor app?

Not yet. MapLibre Native can download offline regions, but the Capacitor MapLibre plugin does not expose that API, so styles and tiles load from the network. Google Maps is no alternative here, because its terms forbid caching and pre-fetching tiles.

Can I migrate from @capacitor/google-maps to MapLibre?

Yes for the map itself, but plan for what surrounds it. Outside the EEA, Places search and Google geocoding have to move to another provider together with the map. Clustering has no counterpart in the Capacitor MapLibre plugin, and satellite or terrain views need a tile provider that serves them. A Google Maps Alternative for Capacitor Apps shows the MapLibre side of markers, polylines and the camera.

Related posts

Stay in the loop

New plugins and releases, including updates to the Capacitor MapLibre plugin, go out in the Capawesome newsletter first.

Subscribe to the Capawesome Newsletter

Conclusion

Start from the list of Google data your screens show. If it includes Street View, live traffic, indoor maps or Places results beside the map, use Google Maps, keep native maps free by leaving out the map ID, and estimate the remaining SKUs before launch. If the list is empty, use MapLibre with a tile provider from the table and budget for tile requests instead of map loads. For apps that record the routes they draw, Announcing the Capacitor Background Geolocation Plugin covers the tracking side.

If you have any questions, join us on the Capawesome Discord server. To stay updated on the latest news, subscribe to the Capawesome newsletter.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.