0%

The Complete Guide to
The Map Widget

From dropping your first map onto the canvas to building production map-centric dashboards that drive every widget in your app. The Map widget is the beating heart of Experience Builder.

7 Beginner lessons 6 Intermediate lessons 5 Advanced lessons

What's inside

Your First Map

Everything you need to get a map into your app, configure its tools, and understand how the Map widget connects to every other widget in Experience Builder.

Lesson 0

What IS the Map widget and why it matters

The Map widget is the centerpiece of most Experience Builder apps. It displays your Web Map (or Web Scene), lets users pan, zoom, click, and select features, and -- most importantly -- it drives other widgets. When a user clicks a feature on the map, that selection can update a List, populate a Text widget, filter a Chart, and trigger message actions across the entire app.

Without a Map widget, your EB app is a static page. With one, it becomes an interactive application.

Think of it this way

The Map widget is like the steering wheel in a car. Other widgets -- Lists, Charts, Text, Buttons -- are the dashboard gauges. They all respond to what the driver (your user) does with the steering wheel. Turn the wheel (pan the map, select features), and everything else updates.

πŸ—ΊοΈ

Display

Shows your Web Map with all its layers, symbology, popups, and basemap exactly as configured in Map Viewer.

πŸ–±οΈ

Interact

Pan, zoom, click, select, search, measure. Every interaction can trigger actions in other widgets.

πŸ”—

Connect

The Map widget is the primary data source for most widget-to-widget connections. It is the hub of your app.

Key distinction
  • Map widget -- displays and interacts with spatial data. One per Web Map (you can have multiple Map widgets with different maps).
  • Image widget -- displays a static picture. No interactivity, no layers, no data. Do not use this to "show a map."
  • Embed widget -- can embed an external map or app. No EB message actions or data connections. Use only when you need to embed something from outside your org.
What the Map widget cannot do
  • It cannot edit features directly. You need the Edit widget for that.
  • It cannot create new layers. Layers come from the Web Map.
  • It cannot run geoprocessing. That requires the Analysis or custom widgets.
  • It cannot show time-enabled animations on its own. You need the Timeline widget for that.

Quick check: What role does the Map widget play in most EB apps?

Lesson 1

Adding a Map widget and connecting a Web Map

The single most important rule of the Map widget: build your Web Map in Map Viewer first, then connect it in EB. Do not try to configure layers, symbology, or popups inside Experience Builder. EB reads from your Web Map. If you want to change how data looks, change the Web Map.

The #1 mistake beginners make

Trying to build the map inside EB. They add layers, change symbology, configure popups, all inside the Map widget settings. Then they wonder why nothing sticks after publish, or why the map looks different in the builder vs. the published app. The Web Map is your single source of truth. Configure it in Map Viewer. EB just displays it.

1
In the EB builder, click the Insert panel (+ icon on the left toolbar)
2
Find Map in the widget list and drag it onto your canvas
3
With the Map widget selected, look at the Content panel on the right
4
Under Map data, click Select map
5
Choose your Web Map from My Content, My Organization, or ArcGIS Online
6
The map appears on the canvas. You can now resize and position it.
What gets pulled from the Web Map
  • All layers -- feature layers, tile layers, imagery, whatever you added in Map Viewer
  • Symbology -- colors, sizes, classification breaks, labels
  • Popups -- popup configuration, Arcade expressions in popups, custom media
  • Basemap -- the basemap you chose in Map Viewer
  • Bookmarks -- any bookmarks saved in the Web Map
  • Initial extent -- the saved extent becomes the default view
Try it

Open Map Viewer, make a change to your Web Map (move a label, change a color), save it. Go back to EB, and the Map widget automatically reflects the change. This is the workflow -- Map Viewer is your design tool, EB is your app builder.

Build map in
Map Viewer
->
Save Web Map
->
Connect in EB
Map widget
->
Map appears
in your app
Lesson 2

The Map tools toolbar

Every Map widget has a configurable toolbar that appears in the corner of the map. These are the built-in tools your users get. You choose which to show and which to hide. The key is knowing which tools are actually useful and which just add clutter.

1
Select the Map widget on the canvas
2
In the Content panel, expand Tools
3
Toggle each tool on or off. Drag to reorder them in the toolbar.
ToolWhat it doesRecommendation
Zoom In/Out+ and - buttons for zoomingKeep ON. Users expect it. Some users don't know about scroll-to-zoom.
HomeReturns to the initial extentKeep ON. This is the "reset" button. Essential.
CompassShows north, rotates the mapUsually OFF. Most 2D apps don't need map rotation, and the compass confuses people.
My LocationZooms to user's GPS locationON for field apps. OFF for desktop dashboards.
SearchAddress/place search on the mapON if users need to find locations. Consider the standalone Search widget instead for more control.
MeasurementDistance and area measurementON for planning and assessment apps. OFF for simple dashboards.
Basemap GalleryLets users switch basemapsUsually OFF. Most apps have one correct basemap. Letting users switch creates confusion.
FullscreenExpands the map to fill the browserON for embedded apps. Nice to have for any map-heavy app.
SelectRectangle, lasso, circle, point selection toolsON if your app has any widget-to-widget connections. This is how users select features.
Layer ListShows layer visibility togglesConsider using the standalone Layer List widget instead -- more space, more options.
LegendShows symbology keyConsider the standalone Legend widget. The toolbar version is tiny and hard to read.
Opinionated take: less is more
  • For a simple dashboard: Zoom + Home + Select + Fullscreen. That's it. Four tools.
  • For a field app: Add My Location + Search + Measurement.
  • Resist the urge to enable everything. Every tool you add is one more thing users can get confused by.
  • If you need Layer List or Legend, use the standalone widgets placed in a sidebar. The toolbar versions are too cramped.
Gotcha: toolbar position

The toolbar position (top-left, top-right, bottom-left, bottom-right) is set in the Style panel, not the Content panel. Many people search the Content panel for 10 minutes trying to find it. It is under Style > Map tools > Position.

Lesson 3

Layer visibility: Layer List and Legend

Users often need to toggle layers on and off or see what the colors on the map mean. You have two approaches: built-in tools (inside the Map toolbar) or standalone widgets (separate widgets connected to the Map). The standalone widgets are almost always better.

Built-in (toolbar)

Tiny panel inside the map. Limited space. Disappears when you click elsewhere. Fine for 2-3 layers.

Standalone widget

Full-size panel in your layout. Always visible. Supports grouping, opacity sliders, reordering. Use this.

Connecting a standalone Layer List to your Map:

1
Drag a Layer List widget onto the canvas (typically in a sidebar)
2
In the Layer List's Content panel, under Map, select which Map widget it connects to
3
The Layer List automatically shows all layers from that Map widget
4
Same process for the Legend widget -- drag it in, connect to the Map
Layer List settings worth knowing
  • Show layer visibility toggle -- the eye icon. Always ON.
  • Show opacity slider -- lets users dim layers. Useful for imagery overlays.
  • Show labels toggle -- lets users turn labels on/off per layer. Nice for complex maps.
  • Allow reordering -- lets users drag layers up/down. Usually OFF. Most users don't need this and will accidentally reorder things.
Gotcha: group layers

If your Web Map has group layers, the Layer List shows the groups with expand/collapse arrows. This is usually what you want. But if you have deeply nested groups, the Layer List becomes hard to navigate. Keep your Web Map layer structure flat and simple -- 1 level of grouping max.

Lesson 4

Bookmarks and initial extent

When your app loads, the map zooms to a specific place. That is the initial extent. You can also create bookmarks -- saved views that users can jump to. Both are more useful than people realize.

Where extent is set (order of priority)
  • URL parameters -- if the URL contains extent params, those win (Advanced lesson 13)
  • EB Map widget setting -- "Initial extent" in the Content panel overrides the Web Map
  • Web Map saved extent -- the default view you saved in Map Viewer

Setting the initial extent in EB:

1
Select the Map widget. In Content panel, find Initial view.
2
Choose Default (uses Web Map extent) or Custom
3
If Custom: pan and zoom the map in the builder to the view you want, then click Set current view

Creating and using bookmarks:

Bookmarks can be created in Map Viewer (saved with the Web Map) or in the Bookmark widget in EB. Map Viewer bookmarks are the better approach because they persist with the Web Map and work everywhere.

1
In Map Viewer, zoom to the view you want to save
2
Click the Bookmarks button (ribbon icon) in the toolbar, then Add bookmark
3
Name it clearly: "Continental US", "Hurricane Zone", "Southeast Region"
4
Save the Web Map. The bookmarks are now available in EB.
5
In EB, add a Bookmark widget and connect it to your Map widget
Think of it this way

Bookmarks are like TV channel presets. Instead of manually tuning to a frequency (panning and zooming), you press a button and jump straight to the view you want. Create bookmarks for every geographic view your users commonly need.

Try it

Create 3 bookmarks in Map Viewer: one for the full extent, one for a zoomed-in area, and one for a specific feature. Add a Bookmark widget in EB and watch how it creates navigation buttons automatically. This is the simplest way to add geographic navigation to your app.

Lesson 5

Selection tools

Selection is the foundation of interactivity in EB. When a user selects features on the map, that selection flows to every connected widget. A List shows only the selected items. A Text widget updates to reflect the selection. A Chart recalculates. Without selection, your app is just a viewer. With selection, it becomes an analytical tool.

Selection modeHow it worksBest for
Point selectClick a single featureInspecting one feature at a time. The default behavior.
RectangleDrag a box to select everything insideSelecting a geographic area. Most common multi-select method.
LassoFreehand draw a selection boundaryIrregular areas, like selecting features along a river or coastline.
CircleDraw a radius from a center point"Everything within X miles of this point" analysis.
LineDraw a line, selects intersecting featuresSelecting features along a route or corridor.
1
Select the Map widget. In Content > Tools, turn on Select.
2
In the Select tool settings, choose which selection modes to enable.
3
Test in Live view: draw a selection, then check if connected widgets update.
How selection flows to other widgets
  • Selection on the Map widget updates the data source's selected features
  • Any widget connected to the same data source automatically sees the selection
  • You do NOT need to configure message actions for basic selection-to-List or selection-to-Chart connections
  • The selection is per layer. If your map has 5 layers, only the selectable layer's features are included.
  • To control which layers are selectable: in the Map widget Content panel, expand each layer and toggle Allow selection
Gotcha: click vs. select tool

A regular click on the map opens the popup. It does NOT create a selection that other widgets see. The Select tool (rectangle, lasso, etc.) creates selections. This confuses everyone. If your List isn't updating when users click features, they need to use the Select tool, not just click. Alternatively, configure a message action (Intermediate lesson) to make clicks behave like selections.

Quick check: A user clicks a feature on the map but the connected List doesn't update. What's most likely wrong?

Lesson 6

Search widget integration

Search is how users find specific features or addresses on the map. You can use the built-in search tool on the Map toolbar, or the standalone Search widget. The standalone version gives you far more control over search sources, appearance, and behavior.

Built-in map search

Small search bar in the map toolbar. Searches the ArcGIS World Geocoding Service by default. Quick but limited.

Standalone Search widget

Full search widget in your layout. Configure multiple search sources, search by attribute, control zoom behavior. Use this.

Configuring the standalone Search widget:

1
Drag a Search widget onto the canvas
2
In Content, under Search sources, add sources
3
Geocoding source -- searches addresses and places using a locator service
4
Layer source -- searches features in a specific layer by attribute. This is what you want for "find this shelter" or "find this county."
5
For layer sources: choose the search field(s) (e.g., NAME, ADDRESS, ID) and the display field
6
Connect the Search widget to the Map widget via the Map setting so search results zoom the map
Search source configuration tips
  • Search fields -- add multiple fields so users can search by name OR address OR ID. The search checks all fields you configure.
  • Exact match vs. contains -- "contains" is more forgiving. A search for "spring" will find "Springfield."
  • Max suggestions -- default is 6. Increase to 10-12 for layers with similar names.
  • Zoom scale -- controls how far the map zooms when a result is selected. Set to a scale that makes sense for your data (county-level zoom for counties, building-level for shelters).
Gotcha: search not finding features

The #1 reason search "doesn't work" is that the search field is not indexed on the feature layer. For hosted feature layers in AGOL, go to the layer's Settings tab and enable Optimize Layer. For search to work well on large datasets, the search fields need to be indexed. Also make sure you selected the right fields in the Search widget configuration -- it's easy to accidentally pick the wrong field.

Beginner section complete!

You now know: how to add a Map widget, connect a Web Map, configure tools, work with Layer List and Legend, use bookmarks, understand selection, and set up search. You have a functional, interactive map app. The Intermediate section will teach you how to make it powerful.

Making Maps Interactive

Multiple maps, filter-map connections, popup mastery, click-to-detail patterns, 3D scenes, and the gotchas that will save you hours of debugging.

Lesson 7

Multiple maps in one app

Sometimes one map is not enough. You might want to show two time periods side by side, or display different themes (demographics vs. infrastructure) simultaneously. EB supports multiple Map widgets in the same app, each with its own Web Map.

πŸ“Š

Side-by-side comparison

Two maps showing different data for the same area. Before/after, or two different themes.

πŸ”—

Synced extent

Pan one map, the other follows. Zoom one, both zoom. Perfectly synchronized views.

πŸ—ΊοΈ

Overview + detail

One small map showing the full extent, one large map showing the zoomed-in area.

Setting up synced maps:

1
Add two Map widgets to your layout, each connected to a different Web Map
2
Select the first Map widget. In the Action panel (lightning bolt icon), click Add action.
3
Trigger: Extent changes. Target: Map 2. Action: Zoom to.
4
Repeat for Map 2 -> Map 1 so panning either map syncs the other.
Gotcha: synced maps can loop

If Map A syncs to Map B, and Map B syncs to Map A, you might expect an infinite loop. EB is smart enough to prevent this in most cases, but you may see slight jitter when panning quickly. If you experience this, try making only one map the "driver" (Map A -> Map B, but not B -> A). Users pan Map A, and Map B follows.

When to use multiple maps vs. one map with layer toggling
  • Multiple maps -- when you need to see two datasets simultaneously side by side. When maps have different basemaps or projections. When you want an overview + detail pattern.
  • One map with layer toggle -- when users need to switch between views but don't need to see them simultaneously. Simpler layout, easier to maintain.
Lesson 8

Connecting maps to filters and lists

This is where EB starts to feel like a real application. The pattern is: Map displays data, Filter narrows it, List shows details. All three widgets share the same data source, and they stay in sync automatically.

Filter widget
narrows data
->
Map shows
filtered features
->
List updates
to match
->
Chart/Text
recalculates

The data connection model:

In EB, widgets do not connect directly to each other (in most cases). They connect to a shared data source. When the Map widget is connected to a Web Map, EB creates data sources for each layer. Other widgets connect to these same data sources. When a Filter widget filters the data source, every widget connected to that source updates.

1
Add a Filter widget. In its settings, connect it to the same data source as the Map.
2
Configure filter clauses: e.g., STATUS = 'Open', or POPULATION > 50000
3
Add a List widget. Connect it to the same data source.
4
Test: use the Filter to narrow results. The Map should show fewer features, and the List should show fewer items.
The Map as a spatial filter
  • When users select features on the Map, connected widgets update to show only the selected features
  • When users use the Filter widget, the Map only displays features that match the filter
  • These two filters stack: Filter says "show Open shelters" + Map selection says "in this rectangle" = List shows "Open shelters in this rectangle"
  • This stacking behavior is automatic -- you do not need to configure it
Gotcha: data source IDs

The most common mistake when connecting widgets is picking the wrong data source. Each layer in the Web Map creates a separate data source with an auto-generated ID like dataSource_1-abc123-layer-0. If the Map, Filter, and List are not connected to the exact same data source, they won't communicate. Check the data source ID in each widget's settings -- they must match.

Quick check: You have a Filter, Map, and List widget. The Filter works on the Map (features disappear), but the List still shows all records. What's wrong?

Lesson 9

Popups: configure them in Map Viewer, not EB

This is the lesson that will save you the most time. Popups belong in the Web Map, not in EB. Yes, EB has popup settings. Yes, you can override them. No, you should not. Here is why.

Do not configure popups in EB

EB's popup override is limited, inconsistent between the builder preview and published app, and gets wiped if you reconnect the Web Map. Every popup configuration you do in EB is fragile. Do it in Map Viewer once, save the Web Map, and EB will display it perfectly.

What to configure in Map Viewer's popup settings:

SettingWhereNotes
TitlePopup config > TitleUse field values: {NAME} or Arcade: {expression/expr0}
Field listPopup config > Fields listChoose which fields to show, rename them, set formatting (dates, numbers)
Arcade expressionsPopup config > ArcadeCalculated values in popups: classifications, math, conditional text
ChartsPopup config > MediaPie charts and bar charts from field values. Great for multi-category data.
ImagesPopup config > MediaImage from URL field. Supports Arcade for dynamic URLs.
Custom HTMLPopup config > Custom attribute displayFull HTML/CSS for complex layouts. The most powerful option.
Related recordsPopup config > Related recordsShow child records from related tables. Automatic if relationships exist.
popup-arcade-example.arcade -- in Map Viewer popup config
// Arcade expression in a popup: shelter capacity status
var current = $feature.CURRENT_POP
var capacity = $feature.CAPACITY
var pct = Round((current / capacity) * 100, 0)

var status = "Available"
if (pct > 90) { status = "Near Capacity" }
if (pct >= 100) { status = "FULL" }

return pct + "% full (" + status + ")"
The one EB popup setting that matters
  • In the Map widget Content panel, you can turn popups ON or OFF per layer. This is the one popup setting you should use in EB.
  • Example: you want popups on the Shelters layer but not on the County Boundaries layer. Toggle visibility per layer in EB.
  • Everything else -- fields, formatting, Arcade, media -- stays in Map Viewer.
Lesson 10

Click-to-detail: side panel patterns

Popups are fine for quick info, but for a real application, you want a detail panel -- a sidebar or bottom panel that shows full information about the clicked feature. This is the most professional-looking pattern in EB apps and it replaces the floating popup entirely.

User clicks
map feature
->
Message action
fires
->
Side panel
opens
->
Detail widgets
populate

Building a click-to-detail panel:

1
Create a Sidebar or Fixed Panel widget in your layout
2
Inside the panel, add widgets that show feature details: Text widgets with field values, Image widget, Chart widget
3
Connect all detail widgets to the same data source as the Map, using selected features
4
Select the Map widget. In the Action panel, add an action:
5
Trigger: Record selection changes. Target: your sidebar/panel widget. Action: Open (or scroll to).
6
Optionally turn OFF popups on the Map for this layer, so users see the panel instead of a floating popup.
Think of it this way

A popup is like a Post-it note -- quick info, limited space, disappears easily. A detail panel is like opening the full file folder -- room for charts, images, related records, action buttons. For public-facing apps, use popups. For operational dashboards, use detail panels.

Detail panel widget ideas
  • Text widget with Arcade -- show a formatted summary of the selected feature
  • Image widget -- display a photo from a URL field
  • Chart widget -- show related data (population trend, daily counts) for the selected feature
  • Button widget -- link to external systems (Google Maps directions, data entry forms)
  • Table widget -- show related records (e.g., click a shelter, see all residents)
Lesson 11

Web Scenes and 3D

The Map widget can display Web Scenes (3D) in addition to Web Maps (2D). When you connect a Web Scene, the widget becomes a 3D viewer with tilt, rotation, and elevation. This is powerful for specific use cases, but 3D comes with tradeoffs.

Good use cases for 3D

Building inspections (see rooftops). Terrain analysis (flood modeling). Elevation profiles. Urban planning (shadow analysis). Site inspections where height matters.

Bad use cases for 3D

General dashboards. Thematic maps (choropleth). Tabular data display. Anything where users just need to see "where things are" on a flat map. Most apps.

1
Create a Web Scene in Scene Viewer (separate from Map Viewer)
2
In EB, add a Map widget. Under Map data, switch to Scenes tab
3
Select your Web Scene. The widget now shows 3D.
3D performance reality check
  • 3D scenes use WebGL and significantly more GPU/memory than 2D maps
  • Mobile devices and older laptops will struggle with complex scenes
  • Large feature layers in 3D can be very slow -- use SceneLayers (optimized for 3D) instead of FeatureLayers when possible
  • Not all widgets work with 3D. The Filter widget, List widget, and Chart widget work fine. Some custom widgets may not.
  • 3D selection tools are limited compared to 2D
Rule of thumb

If you're debating between 2D and 3D, use 2D. Only go 3D when height or elevation is genuinely part of the analysis. A 3D map that's just "flat data floating above a terrain surface" adds complexity without value.

Quick check: When should you choose a Web Scene (3D) over a Web Map (2D)?

Lesson 12

Common Map widget gotchas

This lesson is the one you'll come back to. These are the issues that waste hours and aren't documented well. Every one of these has bitten experienced EB developers.

ProblemCauseFix
Map shows old data after editing the Web Map Browser cache or CDN cache serving the old version Hard refresh (Ctrl+Shift+R). If still stale, re-select the Web Map in the Map widget settings (disconnect then reconnect). In stubborn cases, open the published URL in an incognito window.
Initial extent doesn't save after publish EB sometimes ignores the custom extent setting Set the initial extent in the Web Map (save the map at the view you want), not in EB. The Web Map extent is more reliable than the EB override.
Layers disappear in published app Layers are shared to a different group than the app, or the layer's sharing level is more restrictive than the app's Check that every layer in the Web Map is shared at the same level (Public/Org/Group) as the app. The Map widget silently hides layers the viewer can't access.
Search doesn't find features Search field isn't indexed, or wrong field selected Go to the feature layer Settings in AGOL. Enable "Optimize Layer Drawing and Querying." Verify the correct field is selected in the Search widget config.
Selection doesn't trigger other widgets Click opens popup, not a selection. Or widgets on different data sources. Use the Select tool (rectangle/lasso), not single-click. Verify all widgets share the same data source ID. Or configure a Record Selection Changes message action.
Map is blank / grey in builder Web Map was deleted, moved, or you lost access Check the Web Map still exists in your AGOL content. Re-share if needed. If deleted, you need to reconnect a new Web Map.
Labels show in Map Viewer but not in EB EB respects visibility ranges. Labels may be set to show at a zoom level different from the initial extent. Check the label visibility range in Map Viewer. Set it to match the zoom level your EB app will use. Or zoom in/out in the published app to verify.
Map tools work in builder but not in published app The tool was enabled in the builder but the published app uses different settings Save the EB app, then re-publish. Check that you're not looking at a cached older version of the published app. Clear browser cache.
The universal debugging checklist
  • 1. Hard refresh the browser (Ctrl+Shift+R / Cmd+Shift+R)
  • 2. Check sharing permissions on ALL layers in the Web Map
  • 3. Verify all widgets use the same data source ID
  • 4. Test in incognito/private window
  • 5. Re-save the Web Map in Map Viewer, then re-save and re-publish the EB app
  • 6. Check the browser console (F12) for error messages
Intermediate section complete!

You now know how to use multiple maps, connect maps to filters and lists, configure popups properly (in Map Viewer), build click-to-detail panels, handle 3D, and debug the most common issues. Your EB apps are now genuinely interactive. The Advanced section will make them production-grade.

Production Map Patterns

URL parameters, performance optimization, multi-source data, disaster response map patterns, and the map-centric app architecture that powers real operational tools.

Lesson 13

URL parameters for map state

URL parameters let you deep link to a specific map state: a particular extent, selected features, or filtered view. This is how you share "look at this specific area" links or embed map views in emails and reports.

EB supports several URL parameters out of the box. You append them to your app URL with ? for the first and & for additional parameters.

ParameterWhat it doesExample
centerCenters the map at longitude,latitude?center=-77.03,38.89
levelSets the zoom level (0-23)?center=-77.03,38.89&level=12
extentSets a bounding box (xmin,ymin,xmax,ymax)?extent=-78,38,-76,39
viewpointAlias for center and level combined?viewpoint=-77.03,38.89,12
URL examples
// Center on Washington DC at zoom level 12
https://experience.arcgis.com/experience/abc123?center=-77.03,38.89&level=12

// Show a specific extent (bounding box)
https://experience.arcgis.com/experience/abc123?extent=-78.5,38.0,-76.5,39.5

// Open a specific page in a multi-page app
https://experience.arcgis.com/experience/abc123?page=page-2

// Combine parameters
https://experience.arcgis.com/experience/abc123?center=-77.03,38.89&level=14&page=detail
Building shareable map URLs in practice
  • Get the current extent from the browser console: open dev tools (F12), switch to Console, and type document.querySelector('.esri-view').view.extent
  • For disaster response: generate URLs that zoom to the disaster area. Embed these in situation reports, emails, or Slack messages.
  • For embedding: use URL parameters to set the initial view of an embedded map without changing the Web Map's saved extent.
Gotcha: URL parameters and extent priority

URL parameters override both the EB custom extent and the Web Map saved extent. If someone bookmarks a URL with extent parameters, they will always see that extent, even if you update the Web Map. This is usually what you want, but be aware of it when debugging "the map always opens to the wrong place" reports.

Advanced: Data filter URL parameters
  • EB supports data filter URL parameters if you configure them in the Filter widget settings
  • Under the Filter widget settings, enable "Able to set filter in URL"
  • This lets you pass filter values in the URL: ?filter-status=Open&filter-region=Southeast
  • Combined with extent parameters, you can create fully pre-configured map views via URL alone
Lesson 14

Performance optimization

A slow map kills your app. Users will wait maybe 3 seconds for a map to load. After that, they leave. Performance optimization is not optional for production apps -- it is a requirement. Here is what actually moves the needle.

Layer type matters most

The single biggest performance factor is your layer type. Tile layers and Vector Tile layers are orders of magnitude faster than Feature layers for display.

Feature layers are expensive

Feature layers download every feature to the browser as GeoJSON. 100K features = 100K geometries + attributes sent over the wire. Use them only when you need interactivity.

Layer typeSpeedInteractivityUse when
Vector Tile LayerFastestNone (display only)Basemaps, boundaries, reference layers. Anything users only look at.
Tile Layer (raster)Very fastNone (display only)Imagery, pre-rendered thematic maps. Static reference.
Map Image LayerFastIdentify (popup)Large datasets that need popups but not selection or editing. Server does the rendering.
Feature LayerSlowerFull (select, edit, filter)Interactive layers: selection, filtering, editing, Arcade, List connections. The workhorse.
OGC WMS/WFSVariableLimitedExternal data sources. Performance depends on the external server.

Concrete optimization strategies:

1
Set visibility ranges. In Map Viewer, set each layer to only appear at appropriate zoom levels. County boundaries at state zoom, parcels at street zoom. This prevents loading thousands of features that are too small to see.
2
Enable generalization. In AGOL feature layer settings, enable "Optimize Layer Drawing." This simplifies geometries at zoomed-out levels.
3
Reduce field count. In the Web Map, configure each layer to only include the fields your app needs. Fewer fields = smaller payloads = faster loads. This is under Layer Properties > Configure Attributes in Map Viewer.
4
Use definition expressions. If your layer has 500K features but your app only needs 10K (e.g., one state), set a definition expression on the layer: STATE = 'NC'. This filters server-side before data reaches the browser.
5
Replace large Feature Layers with Map Image Layers for layers that only need popup interactivity, not selection. Map Image Layers render on the server and send images to the browser.
Feature count guidelines
  • Under 5,000 features -- Feature Layer is fine. No optimization needed.
  • 5,000 - 50,000 features -- Feature Layer with visibility ranges and field reduction. Consider clustering.
  • 50,000 - 500,000 features -- Use Map Image Layer for display, Feature Layer view for interactive subset. Definitely use visibility ranges.
  • Over 500,000 features -- Vector Tile Layer for display. Feature Layer view with definition expression for interactive subset. Server-side aggregation.
Clustering: the underused optimization

For point layers with many features, clustering in Map Viewer dramatically improves performance and readability. Instead of rendering 10,000 individual points, the map shows cluster bubbles with counts. Users zoom in to see individual features. Enable it in Map Viewer under Layer Properties > Clustering. It works in EB out of the box -- no extra configuration needed.

Quick check: You have a Feature Layer with 200,000 polygons. The map is very slow. What's the most impactful fix?

Lesson 15

Multi-source maps

Production maps often combine data from multiple sources: your org's hosted layers, Living Atlas layers, external WMS/WFS services, CSV files, and GeoJSON. Understanding how to combine them -- and the authentication implications -- is essential for real-world apps.

Data sourceHow to addAuthenticationNotes
AGOL Hosted Layers Add to Web Map from your content Org login or public sharing Fastest, most reliable. Your primary data source.
ArcGIS Living Atlas Add to Web Map from Living Atlas Most are public, some need AGOL subscription Demographics, boundaries, imagery, environmental data. Extremely useful reference layers.
ArcGIS Enterprise Layers Add to Web Map via URL or search Enterprise login (may require portal trust) On-premises data. Can be slower than AGOL hosted. Watch for firewall issues.
WMS / WFS (OGC) Add to Web Map via URL Usually public or API key External services (NOAA weather, USGS). Performance varies. No editing.
CSV / GeoJSON Upload to AGOL first, add as hosted layer Inherits AGOL sharing settings Great for one-time data. Remember to update the hosted layer when data changes.
Image Services Add to Web Map via URL Depends on server Satellite imagery, aerial photos, raster analysis. Can be very large.
Authentication trap: secured services

If your Web Map includes a secured layer (requires login), every user of your EB app will be prompted to log in -- even if the app itself is public. This is the #1 source of "my app works for me but not for others" reports. Before publishing, open the app in an incognito window without logging in. If you see a login prompt, you have a sharing issue. Fix it by making the layer public, or share it to a group that includes your app's intended audience.

Best practices for multi-source maps
  • Test layer load order. Layers load asynchronously. If a WMS layer is slow, it won't block your hosted layers, but it will show a loading spinner on the map.
  • Set reasonable visibility ranges on external layers. You can't control their server performance, but you can control when they load.
  • Use Feature Layer Views instead of the full Feature Layer when you only need a subset of fields or features. Views are lighter and load faster.
  • Cache awareness. AGOL hosted layers have CDN caching. External WMS/WFS do not. The performance difference is noticeable.
Common Living Atlas layers for disaster response
// Useful Living Atlas layers to add to your Web Map:

USA Counties          // County boundaries with FIPS codes
USA States           // State boundaries
USA Census Tracts    // Tract-level demographics
USA Social Vulnerability Index  // CDC SVI data
World Imagery        // Satellite basemap
USA Flood Hazard Areas  // FEMA flood zones
USA Weather Watches and Warnings  // Live NWS alerts
USA Wildfires        // Active fire perimeters
USA Red Cross Regions  // ARC organizational boundaries
Lesson 16

Real-world patterns: disaster response maps

This lesson brings everything together with production patterns from actual disaster response EB apps. These are the map configurations and widget connections that power real operational tools.

Pattern 1: Shelter Status Map

A map showing shelter locations with color-coded status indicators. Green = Open, Yellow = Near Capacity, Red = Closed. Click a shelter to see capacity details in a side panel.

1
Web Map setup: Shelter feature layer with STATUS, CAPACITY, CURRENT_POP fields. Symbology: Unique Values on STATUS field with green/yellow/red colors.
2
Popup: Arcade expression showing capacity percentage and status text (configure in Map Viewer).
3
EB layout: Map widget (left, 60% width) + Sidebar (right, 40% width) with detail widgets inside.
4
Filter widget: Above the map. Filter by STATUS (Open/Closed/All) and REGION.
5
List widget: In the sidebar. Connected to same data source. Shows shelter name and current status.
6
Message action: Map Record Selection Changes -> open sidebar panel with detail view.
shelter-popup.arcade -- configure in Map Viewer popup
// Shelter capacity popup expression
var current = $feature.CURRENT_POP
var capacity = $feature.CAPACITY

if (IsEmpty(capacity) || capacity == 0) {
  return "Capacity not set"
}

var pct = Round((current / capacity) * 100, 0)
var remaining = capacity - current
var indicator = IIf(pct > 90, "CRITICAL",
  IIf(pct > 75, "Filling up", "Available"))

return pct + "% occupied (" + current + "/" + capacity + ") - " + indicator
  + "\n" + remaining + " spots remaining"

Pattern 2: Damage Assessment Map

Damage assessment data with classification-based symbology and a dashboard-style summary. Rectangle selection for area-based analysis.

1
Web Map setup: Damage assessment layer with DAMAGE_LEVEL (Destroyed, Major, Minor, Affected, None). Symbology: Unique Values with graduated severity colors.
2
Clustering: Enable clustering at zoomed-out levels. Show cluster counts by damage category.
3
EB layout: Map widget (full width). Summary panel (bottom, collapsible) with Arcade-driven Text widgets showing counts per damage level.
4
Selection: Enable Rectangle Select. When user draws a selection, the summary panel updates to show counts for that area only.

Pattern 3: Evacuation Zone Map

Polygon zones with interactive zone lookup. Users search an address or click the map to find which zone they're in.

1
Web Map: Evacuation zone polygons with ZONE_NAME, ZONE_LEVEL, EVACUATE (Yes/No). Transparency so basemap is visible.
2
Search widget: Configured with geocoding source so users can type their address.
3
Message action: Search result -> Zoom to + select feature under the result point. This shows the user which evacuation zone their address is in.
4
Text widget: Arcade-driven, shows "You are in Zone [X]. Evacuation status: [Yes/No]."
More disaster response patterns
  • Resource tracking: Icons for supply types (water, food, cots). Filter by supply type. Color by quantity level.
  • Volunteer deployment: Point map of volunteer locations. Heatmap layer for density. Filter by skill type and availability.
  • Feeding operations: Meal distribution sites with daily count tracking. Chart widget showing trends over time for selected sites.
  • Multi-event overview: All active disasters on one map. Filter by event. Click to drill into event-specific data.
Lesson 17

The Map widget as app controller

The most powerful EB architecture puts the Map widget at the center of everything. Every other widget responds to what's visible on the map. When the user pans, zooms, or selects, the entire app updates. This is the map-centric app architecture, and it is the professional standard for operational GIS dashboards.

Think of it this way

In a map-centric app, the map is the DJ at a party. The DJ controls the music, and everyone on the dance floor (List, Chart, Text, Filter) responds to what the DJ plays. Change the song (pan the map), and the entire room shifts. This is different from the "widget-centric" approach where a Filter or List drives the map. In the map-centric approach, the map drives everything else.

The three map triggers that drive other widgets:

πŸ“

Extent changes

User pans or zooms. All connected widgets recalculate based on what's visible. "Show me stats for what I can see."

πŸ–±οΈ

Record selection

User selects features with the Select tool. All connected widgets update to show only selected features.

πŸ”½

Data filtering

A Filter widget filters the shared data source. The map and all other widgets show only matching features.

Building a map-centric dashboard:

1
Layout: Map takes 60-70% of the screen. Sidebar or bottom panel holds summary widgets. This communicates "the map is primary."
2
Shared data source: All widgets connect to the same data source from the Map widget. This is the fundamental requirement.
3
Spatial filter: Enable the map's extent filter. In the Map widget Content panel, under each layer, enable "Filter by map extent" on connected widgets. Now when users pan, the List/Chart/Text only show features in the current view.
4
Arcade text widgets: Use Arcade expressions with $dataSources["..."].layer and queryParams to show aggregate stats that respect the spatial filter. "X features in view. Total population: Y."
5
Message actions: Map Extent Changes -> trigger recalculation of dependent widgets. Map Record Selection Changes -> update detail panels.
map-driven-summary.arcade -- updates as user pans the map
// This Arcade expression respects spatial filtering
// When the user pans/zooms, the stats update automatically

function getFilteredFeatureSet(ds) {
  var result = ds.layer
  var qp = ds.queryParams
  if (!IsEmpty(qp.where)) { result = Filter(result, qp.where) }
  if (!IsEmpty(qp.geometry)) { result = Intersects(result, qp.geometry) }
  return result
}

var ds = $dataSources["YOUR_DS_ID"]
var filtered = getFilteredFeatureSet(ds)
var selected = ds.selectedFeatures
var target = IIf(Count(selected) > 0, selected, filtered)

var count = Count(target)
var label = IIf(Count(selected) > 0, "Selected", "In view")

return '<p style="font-size:28px;font-weight:bold;margin:0;">'
  + Text(count, '#,###')
  + '</p><p style="font-size:12px;color:#888;margin:2px 0 0;">'
  + label + ' features</p>'
Map-centric architecture principles
  • The map decides what's relevant. The visible extent defines the data context for all other widgets.
  • One data source to rule them all. Map, List, Chart, Text -- all connected to the same data source. No duplicates.
  • Selection refines, filter narrows. Filters set the category (e.g., "Open shelters only"). Selection sets the geography (e.g., "these 5 shelters I drew a box around").
  • URL parameters set initial state. Combine extent and filter URL params to create a pre-configured view for specific audiences.
  • Popups for quick info, panels for deep info. Users click for a popup preview, open a detail panel for full analysis.
Real-world example: disaster operations dashboard

Map shows all shelters for a hurricane event. The Filter widget is set to "Open shelters." The user pans to the affected county. The List updates to show only open shelters in view. The Arcade Text widgets show: "12 shelters in view | 847 residents | 68% capacity." The user draws a rectangle around a cluster. Now the stats update to "3 selected | 215 residents | 82% capacity." They click one shelter. The detail panel opens with name, address, capacity chart, contact info, and a link to Google Maps for driving directions. All of this is the Map widget driving the entire experience.

Quick check: In a map-centric architecture, what is the primary driver of data context for all other widgets?

You made it to the end!

You've gone from "what is the Map widget" to URL parameters, performance optimization, multi-source data management, disaster response map patterns, and the map-centric app architecture that powers real operational tools. These 18 lessons cover everything you need to build production-grade map applications in Experience Builder. The Map widget is the foundation -- master it, and every other widget falls into place.