Billing & Permissions
Required API Permissions
Enable only the APIs your implementation uses:
| API | Required? | When it's used |
|---|---|---|
| Maps JavaScript API | Yes | Interactive map rendering |
| Maps Static API | Optional | A <ScriptGoogleMapsStaticMap> image, including one placed in the #placeholder slot |
| Places API (Legacy) | Optional | Address resolution through resolveQueryToLatLng() |
The placeholder slot is empty by default, so a normal <ScriptGoogleMaps> does not call the Maps Static API.
Current Pricing
Google charges each API by SKU and applies a separate monthly free usage cap to each SKU. As of July 2026, the relevant global list prices are:
| Action | SKU | Free monthly events | First paid tier per 1,000 | When it happens |
|---|---|---|---|---|
| Load the interactive map | Dynamic Maps | 10,000 | $7 | Each time the Maps JavaScript API creates a map |
| Load a static preview | Static Maps | 10,000 | $2 | Each <ScriptGoogleMapsStaticMap> image request |
| Resolve an address in the browser | Find Place (legacy) | 5,000 | $17 | Each resolveQueryToLatLng() lookup |
These are USD list prices for the first paid volume tier. Higher-volume tiers, regional pricing, and product changes can alter the total; check the current Google Maps Platform price list before budgeting.
Google also offers fixed-price subscription plans with a combined monthly call allowance across their included SKUs. Calls above the allowance revert to pay-as-you-go pricing, so the estimates below use the standard list prices.
Google replaced the old recurring $200 monthly credit with per-SKU free usage caps on March 1, 2025. Google's pricing overview explains the current model.
How Nuxt Scripts Affects Usage
Lazy loading: The Dynamic Maps event occurs only after the configured trigger fires. With the default interaction triggers, a visitor who never interacts with the map does not load the JavaScript API.
No default static request: <ScriptGoogleMaps> leaves its placeholder empty. Add <ScriptGoogleMapsStaticMap> only when a map preview is worth the extra Static Maps event.
Address resolution: resolveQueryToLatLng() uses the browser's Places library. Coordinates avoid this lookup.
Direct static maps: <ScriptGoogleMapsStaticMap> loads images directly from Google with a public browser key. Give it a separate key restricted to your website and the Maps Static API, or allow the shared registry key to access the Maps JavaScript API, Places API (Legacy), and Maps Static API.
Cost Controls
- Use coordinates when you have them. Pass
centeras{ lat, lng }instead of resolving an address through Places. - Keep the default lazy trigger. Use
trigger="immediate"only when the map should start loading after hydration instead of waiting for an element interaction. - Use your own placeholder. A local image in the
#placeholderslot adds no Maps Static API event.<ScriptGoogleMaps> <template #placeholder> <img src="/my-map-placeholder.webp" alt="Map of the store location"> </template> </ScriptGoogleMaps> - Set budgets and quota limits. Google recommends budget alerts for visibility and quota limits when you need a hard usage ceiling. See Manage your Google Maps Platform costs.
- Consider the Embed API for a simpler map. The Maps Embed API has unlimited no-cost usage, but still requires an API key. Embed it with an iframe; it is not a script loaded through
useScript().
Example Monthly Estimates
For 100,000 monthly page views under the July 2026 global list prices:
| Scenario | Estimated monthly cost |
|---|---|
| Lazy map with no interactions | $0 |
| 20% of visitors load the interactive map | $70 |
| Every visitor loads the interactive map | $630 |
| Static preview on every view, no interaction | $180 |
| Static preview on every view and 20% interact | $250 |
These examples apply each SKU's free usage cap and exclude Places requests, taxes, negotiated discounts, and other projects on the same billing account.