0%

The Complete Guide to
Publishing & Sharing

From clicking Publish to multi-environment deployments, custom domains, and zero-to-live disaster operations. Everything you need to get your app into users' hands.

Beginner — 7 lessons Intermediate — 6 lessons Advanced — 5 lessons

What's inside

Getting Your App Live

You've built something in Experience Builder. Now let's get it out of the editor and into users' hands — correctly, the first time.

Lesson 0

Draft vs Published — the lifecycle

Here is the single most important concept in Experience Builder publishing: your app exists in two separate versions at all times. A draft version (what you see in the editor) and a published version (what users see). Changes you make in the editor are invisible to users until you explicitly click Publish.

Think of it this way

Your EB app is like a restaurant menu. The draft is the version the chef is scribbling changes on in the kitchen. The published version is the laminated copy the customers see. Customers never see the chef's notes until someone prints a new menu and puts it on the tables.

Edit in Builder
Save (draft only)
Preview / test
Publish
Users see changes
✏️

Draft Version

What you see in the EB editor. Saved automatically or when you click Save. Only visible to you and org admins. Two config locations: the editor UI and Resources > config/config.json.

🌍

Published Version

What end users see at the live URL. Only updates when you click Publish. Stored in the Data tab. This is the "real" app.

Critical gotcha

EB has two config files internally. The Data tab stores the published/live config. The Resources > config/config.json stores the draft/editor config. If you edit one through the AGOL Assistant API without updating the other, you will get desynced states — the editor shows empty fields, and saving from the editor wipes your changes. Always update draft first, then publish.

Key takeaways
  • Saving is NOT publishing. Save keeps your work. Publish sends it live.
  • You can save 100 times between publishes. Users see nothing until you click Publish.
  • The draft and published versions can be completely different — different widgets, different pages, different data sources.
  • There is no automatic sync. The two versions diverge until you explicitly publish.
Lesson 1

Publishing your first app

Let's walk through the actual publish process step by step. It takes about 10 seconds, but understanding what happens under the hood prevents a lot of confusion later.

1
Open your app in Experience Builder (experience.arcgis.com)
2
Make sure you've saved your latest changes (Ctrl+S or the Save button)
3
Click the Publish button in the top-right toolbar (the blue rocket icon)
4
A confirmation dialog appears. Review the message and click Publish
5
Wait for the "Published successfully" message. The draft config is now copied to the live config
6
Click the published app link that appears (or copy the URL) to verify
What happens when you click Publish
  • EB copies your draft configuration to the published (Data tab) configuration
  • A new published timestamp is set on the AGOL item
  • The published URL immediately reflects the new version
  • Anyone with the URL and appropriate permissions can see the updated app
  • The draft version remains intact for continued editing

After publishing, always test by opening the published URL in a different browser or an incognito window. The editor's "Live view" is NOT the same as the published app — it uses the draft config and your authenticated session. Testing in incognito catches permission issues that the editor hides.

Try it

Publish your app, then immediately open the published URL in an incognito/private browser window. Does the app load? Can you see the map data? If the map tiles load but data layers show "Unable to load" or are simply empty, you have a sharing problem — we'll cover that in Lesson 3.

Quick check: After you save your app in the EB editor, what do end users see?

Lesson 2

The app URL structure

Every Experience Builder app gets a URL when published. Understanding the URL structure helps with sharing, embedding, and troubleshooting.

URL typeFormatWhen to use
Default published URLexperience.arcgis.com/experience/<appId>Standard sharing for AGOL apps
Enterprise URL<portal>/apps/experiencebuilder/experience/?id=<appId>ArcGIS Enterprise deployments
Custom slugexperience.arcgis.com/experience/<custom-slug>Cleaner URLs for public-facing apps
Org vanity URL<org>.maps.arcgis.com/apps/experiencebuilder/experience/?id=<appId>When your org has a custom domain configured

The appId is a 32-character hexadecimal string — the AGOL item ID for your app. You can find it in the URL bar when editing, or on the item's details page.

Custom slugs

Instead of a long hex ID, you can set a human-readable slug. Go to your app's item details page in AGOL, click Settings, and scroll to the Web Experience section. Enter a custom URL path like my-shelter-map. The URL becomes experience.arcgis.com/experience/my-shelter-map.

  • Slugs must be unique within your organization
  • Lowercase letters, numbers, and hyphens only
  • Changing a slug breaks existing bookmarks — update your links

You can also pass URL parameters to control the app's initial state:

URL parameters
// Open to a specific page
experience.arcgis.com/experience/abc123?page=Details

// Open to a specific page and view (for multi-view pages)
experience.arcgis.com/experience/abc123?page=Dashboard&views=Region-East

// Pass data filters via URL (Message Action required)
experience.arcgis.com/experience/abc123?page=Map&data_s=STATUS%3DOpen

// Open with specific locale
experience.arcgis.com/experience/abc123?locale=es
Key takeaways
  • The default URL works immediately after publishing — no configuration needed
  • Custom slugs make URLs memorable but break bookmarks if changed
  • URL parameters let you deep-link users directly to specific pages or filtered views
  • Enterprise portal URLs have a different format than AGOL URLs
Lesson 3

Sharing and permissions basics

This is the lesson that will save you the most support tickets. 50% of "my app is broken" complaints are actually "I shared the app but not the data layers." Read this carefully.

The #1 mistake in Experience Builder

You share your app with "Everyone" (public). You send the URL to stakeholders. They open it and see... an empty map. No features. No data. The basemap loads fine, but every operational layer is blank. Why? Because the app is shared publicly, but the feature layers, web maps, and hosted tables it references are still private. The app itself is just a shell — it pulls data from separate AGOL items, and each of those items has its own sharing level.

ArcGIS has three sharing levels, and they apply independently to every item:

LevelWho can accessCommon use
Private (Owner)Only you and org adminsWork in progress, drafts
OrganizationAnyone signed into your AGOL orgInternal staff tools
Everyone (Public)Anyone with the URL, no login requiredPublic-facing apps, field deployments

There is also Group sharing — you can share items with specific groups within your org. This is the best practice for most internal tools: create a group, add the right people, share the app AND all data items to that group.

The sharing checklist

Before sending a URL to anyone, verify that ALL of these are shared at the same level:

  • The Experience Builder app item itself
  • Every web map used by the app
  • Every feature layer referenced by any widget (including layers in the web maps)
  • Every hosted table, image service, or tile layer
  • Any related items: code attachments, custom icons hosted on AGOL
1
Open your app's item details page in AGOL
2
Click Share and set the desired level (Organization or Everyone)
3
Now do the same for the web map used by your app — go to its item page and share it
4
For each feature layer in the web map, go to its item page and share it at the same level
5
Test in an incognito window (for public apps) or have a colleague test (for org-shared apps)
Try it

Intentionally share your app as public but leave one feature layer private. Open the published URL in incognito. Watch how the map loads the basemap perfectly, but the operational layer shows nothing. No error message — just silence. This is what your users experience when sharing is misconfigured. Now go fix it.

Quick check: You shared your app with "Everyone" but users see an empty map. What's the most likely cause?

Lesson 4

Embedding your app

Sometimes you don't send users directly to the EB URL — instead, you embed the app inside another page. SharePoint, ArcGIS StoryMaps, internal portals, even plain HTML pages. The magic word is iframe.

basic-iframe-embed.html
<!-- Basic iframe embed -->
<iframe
  src="https://experience.arcgis.com/experience/YOUR_APP_ID"
  width="100%"
  height="800"
  frameborder="0"
  allow="geolocation; fullscreen"
  style="border: none; border-radius: 8px;"
></iframe>
PlatformHow to embedNotes
SharePoint OnlineAdd an "Embed" web part, paste the iframe code or EB URLMay require admin approval for external content. Modern pages support direct URL embed.
ArcGIS StoryMapsAdd an "Embed" block, paste the published EB URLStoryMaps handles the iframe automatically. Works seamlessly.
ArcGIS HubAdd an iframe card or embed widget with the EB URLHub respects AGOL sharing — if the EB app is public, Hub can show it.
Custom HTMLPaste the iframe code aboveFull control over sizing, styling, and interaction.
Confluence / WikiUse the HTML macro or iframe macroCorporate wikis often block iframes — check with IT first.
responsive-iframe-embed.html
<!-- Responsive embed — fills parent container -->
<div style="position:relative; width:100%; height:0;
     padding-bottom:56.25%; overflow:hidden;">
  <iframe
    src="https://experience.arcgis.com/experience/YOUR_APP_ID"
    style="position:absolute; top:0; left:0;
           width:100%; height:100%; border:none;"
    allow="geolocation; fullscreen"
  ></iframe>
</div>
Embedding gotchas
  • Authentication: If the app requires login, the user will see a login prompt inside the iframe. This can confuse users. For embedded apps, consider making them public or using a proxy.
  • X-Frame-Options: Some corporate networks block iframes from external domains. If the embed shows a blank space, this is likely the cause.
  • Double scrollbars: If the EB app has scrollable content and the parent page also scrolls, users get confused. Set the iframe height tall enough to avoid scrolling inside it.
  • Mobile: Iframes on mobile can behave unpredictably — pinch-zoom may zoom the iframe instead of the parent page. Test on real devices.
Embed URL format

The URL you use for embedding is the same published URL. No special "embed mode" is needed. However, you can append URL parameters to customize the initial state:

  • ?page=Dashboard — open to a specific page
  • ?locale=es — force a specific language
  • Combine parameters: ?page=Map&locale=fr
Lesson 5

QR codes and short links

In field operations, you often need to get an app URL onto a phone fast. Nobody is going to type experience.arcgis.com/experience/8a2f3b... into a phone keyboard. QR codes and short links solve this.

📱

QR Codes

Point phone camera, app opens. Perfect for printed materials, tent signs at shelters, or field briefing packets. Generate at qr-code-generator.com, goqr.me, or any free tool.

🔗

Short Links

Use bit.ly, tinyurl.com, or your org's URL shortener to create memorable links like bit.ly/shelter-map-2026. Easy to say aloud in a briefing.

Field deployment best practices
  • Print QR codes large — at least 2 inches square. People scan from a distance.
  • Test the QR code yourself before printing 500 copies. Scan it with your phone. Does it go to the right URL?
  • Include a short link below the QR code as backup — some older phones struggle with QR.
  • Use a URL shortener you control so you can update the destination later without reprinting anything.
  • Add the short link to your ICS forms, briefing templates, and situation reports.
Think of it this way

A QR code is just a barcode that encodes a URL. That's it. No magic, no special app needed — modern phone cameras decode them automatically. The short link is for humans who need to share the URL verbally: "Everyone go to bit.ly/shelter-map" is infinitely better than reading a 64-character URL over a radio.

1
Copy your published app URL
2
Create a short link at bit.ly or your org's shortener
3
Generate a QR code from the short link (not the original URL — so you can update later)
4
Test the QR code on your phone — verify it opens the correct app
5
Add both the QR image and short link to your deployment kit
Lesson 6

Mobile considerations before publishing

More than half your users will access your app on a phone. If you haven't tested on mobile, you haven't tested. Here's what to check before you publish.

Common mobile disasters
  • Sidebar panels that cover the entire screen — on desktop they slide in from the side. On mobile, they become full-screen overlays with no obvious close button.
  • Tiny tap targets — buttons and links that are fine with a mouse become impossible to tap with a thumb. 44px minimum for touch targets.
  • Horizontal scrolling — elements that overflow the viewport width create a frustrating side-scroll. Fixed-width widgets are the usual culprit.
  • Pop-ups that extend off-screen — map pop-ups with wide tables or long content overflow on narrow screens.
  • Widgets that depend on hover — there is no hover on mobile. Tooltips, hover-reveal content, and hover-based interactivity simply don't work.
1
In the EB editor, click the responsive preview button (phone icon in toolbar) to see mobile, tablet, and desktop layouts
2
Switch between Small (phone), Medium (tablet), and Large (desktop) breakpoints
3
Check that all content is visible without horizontal scrolling at each breakpoint
4
Verify that buttons, links, and interactive elements are large enough to tap
5
After publishing, open the URL on a real phone — the preview is helpful but not identical to actual device behavior
IssueSolution
Sidebar covers entire screen on mobileUse the sidebar's "Auto close" option, or redesign as a separate page instead of a sidebar
Text too small to readUse relative font sizes (rem, em) instead of small pixel values. Test at 320px viewport width.
Map controls overlap on narrow screensReduce the number of visible map tools. Use the map toolbar's compact mode.
Charts unreadable on phoneSimplify chart labels, reduce data series, or hide charts at small breakpoints and show a summary text widget instead.
Feature table doesn't scrollTables need horizontal scroll on mobile. Minimize columns or use a List widget instead.
Try it

Open your published app on your phone. Try every workflow a user would perform: search, select features, open sidebars, view charts. Take notes on anything that feels awkward. If you can't comfortably use it one-handed on a 5-inch screen, your field workers can't either.

Quick check: What is the most reliable way to test how your app will look on mobile?

Production-Grade Sharing

Your app is published and shared. Now let's make it professional — version control, security, performance, and discoverability.

Lesson 7

Version management

Experience Builder does not have built-in version control like Git. There is no "undo" for a bad publish. Once you click Publish, the previous published version is overwritten permanently. This means you need your own version management strategy.

The "published broken changes" nightmare

Here's the scenario: You're making changes to a live app that 200 people use daily. You accidentally delete a widget, reconfigure a data source, or break an Arcade expression. You don't notice. You publish. Now 200 users have a broken app, and you can't roll back because the previous version is gone. This happens more often than anyone admits.

📋

Clone Before Editing

Before making significant changes, clone the app from its AGOL item page. The clone is your backup. If the original breaks, re-clone from the backup.

📅

Date-Named Backups

Name clones with dates: "Shelter Map - Backup 2026-02-20". Keep the last 2-3 backups. Delete old ones to avoid clutter.

🛡️

Dev/Prod Split

Maintain two copies: a "Dev" app for changes and a "Prod" app that's always stable. Only update Prod when Dev is fully tested. (See Lesson 13 for the full pattern.)

Recovery strategies
  • You have a recent clone: Open the clone, verify it works, update the sharing to match the broken app, and distribute the clone's URL. Rename items to minimize confusion.
  • You don't have a clone: You'll need to manually fix the broken app in the editor and re-publish. Check the Data tab (published config) — sometimes it still has fragments of the previous working state that can help you understand what changed.
  • Nuclear option: If the config is hopelessly corrupted, create a brand new app, reconnect to the same web map and data sources, and rebuild. This is why backups matter.
Draft vs published versioning

Remember: saving the draft does NOT affect the published version. You can safely experiment in the draft all day long. The published app remains stable. Only when you click Publish does the draft overwrite the live version. Use this to your advantage — make all changes in the draft, test thoroughly in Live View, and only publish when you're confident.

Lesson 8

Data layer permissions deep dive

In Lesson 3 we covered the basics of sharing. Now let's go deeper. In a real deployment, permissions cascade through multiple layers, and understanding this chain is the difference between an app that "just works" and one that breaks mysteriously for certain users.

EB App
Web Map
Feature Layers
Individual Fields

Each level in this chain has its own sharing settings. A user only sees data if they have permission at every level. If any link in the chain is restricted, the data disappears — usually silently, without an error message.

Layer in the chainWhat controls accessWhere to configure
EB App itemItem sharing level (Private/Org/Public)AGOL item details > Share
Web Map itemItem sharing levelAGOL item details > Share
Feature Layer itemItem sharing levelAGOL item details > Share
Feature Layer sublayersInherit from parent itemCan't independently share sublayers
Individual fieldsView definition / field visibility in layer settingsFeature layer settings > Fields tab
Feature-level filteringView definitions (SQL WHERE clause)Web map layer properties or feature layer views
Secured services and tokens

Some feature layers require authentication even when the item is shared publicly. This happens with:

  • ArcGIS Server services behind a secured portal
  • Feature layers with editing enabled — AGOL may require a token for write operations even on public layers
  • Premium content from Esri (demographic data, routing services) — consumes credits and requires an authenticated user
  • Feature Layer Views with restricted fields or definition queries

When a token is required, unauthenticated users see a login prompt or empty data. The solution is either: make the service fully public (if appropriate), use a proxy service, or accept that users must sign in.

Try it — Audit your app's dependencies
  • Open your app's item page in AGOL
  • Scroll to the Associated Content section at the bottom — this lists all items the app references
  • Click each item and verify its sharing level matches the app's sharing level
  • If you find a mismatch, fix it immediately

Quick check: Your EB app is shared publicly. The web map is shared publicly. But one feature layer in the web map is shared only with your org. What happens for anonymous users?

Lesson 9

Page visibility and Login widget

What if you want some pages of your app to be public and other pages to require login? EB supports this through page visibility settings and the Login widget.

🔓

Public Pages

Anyone can view. No login required. Use for landing pages, public dashboards, and informational content. The app item must be shared publicly.

🔒

Secured Pages

Only visible to authenticated users. Use for editing interfaces, admin panels, or pages that show sensitive data. Users must sign in to access.

1
In the EB editor, click the Page panel on the left sidebar
2
Click a page name, then click the gear icon (page settings)
3
Under Page Access, choose "Visible to everyone" or "Visible to signed-in users"
4
Add a Login widget to your public landing page so users can sign in to access secured pages
5
Configure the Login widget's redirect — after login, where should users go? Set it to the secured page.
How the Login widget works
  • The Login widget shows a "Sign In" button for anonymous users
  • Clicking it redirects to the AGOL/Enterprise login page
  • After authentication, the user is redirected back to the app (or a specific page you configure)
  • For authenticated users, the widget shows the user's name and a "Sign Out" option
  • Guest access: Some orgs allow guest accounts (SAML/OAuth) — these users can access org-shared content without being full org members
Page visibility is not security

Page visibility controls what pages appear in the app's navigation for different users. It does NOT prevent a determined user from accessing the underlying data. If someone knows the feature layer URL, they can query it directly (assuming it's shared). For true data security, configure permissions at the data layer level, not the page level. Page visibility is a UX feature, not a security boundary.

Lesson 10

Custom domains and branding

The default experience.arcgis.com/experience/abc123 URL is functional but not memorable. For professional deployments, you may want a custom domain or at least a cleaner URL.

OptionComplexityResult
Custom slug (Lesson 2)Easyexperience.arcgis.com/experience/my-shelter-map
Org vanity URLMediummyorg.maps.arcgis.com/apps/experiencebuilder/...
ArcGIS Hub custom domainMediumgis.myorganization.org/pages/shelter-map
Reverse proxy / DNS redirectAdvancedsheltermap.myorganization.org (redirects to EB URL)
Download & self-host (Developer Edition)AdvancedAny URL you want — full control, but you manage hosting
Org vanity URL setup
  • Go to AGOL > Organization > Settings > Security
  • Under "Allowed origins" and "Custom base URL", configure your org's custom subdomain
  • This applies to all apps in your org, not just EB
  • Requires DNS configuration (CNAME record) — work with your IT department
ArcGIS Hub approach

If your org uses ArcGIS Hub, you can embed EB apps within Hub pages and take advantage of Hub's custom domain feature. This gives you URLs like gis.redcross.org/pages/shelter-dashboard without any custom hosting. Hub handles the SSL certificate and domain routing. The EB app runs inside a Hub page layout, which also gives you headers, footers, and consistent branding across all your GIS apps.

Branding checklist
  • App title: Set on the item details page — appears in browser tab
  • Thumbnail: Upload a custom thumbnail on the item details page — appears in AGOL galleries and search results
  • Favicon: EB uses the ArcGIS default favicon. Custom favicons require Developer Edition (self-hosted) or a Hub deployment
  • Splash screen: Use the Splash widget for a branded loading experience with your org's logo
  • App icon: On mobile, if a user adds the app to their home screen, the AGOL thumbnail is used as the app icon
Lesson 11

Performance optimization before publish

A slow app is a broken app. Users on spotty cellular connections during field operations won't wait 15 seconds for your map to load. Optimize before you publish, not after you get complaints.

🖼️

Image Optimization

Compress all custom images. Use WebP format. Keep header/background images under 200KB. No uncompressed PNGs.

🔍

Layer Query Optimization

Minimize the number of features loaded. Use definition queries to filter data. Enable pagination on large layers.

Widget Count

Every widget is a network request. Consolidate where possible. One rich Text widget beats three simple ones.

OptimizationImpactHow to do it
Enable feature layer cachingHighFeature layer settings > Cache Control. Set max age for relatively static data.
Use vector tile basemapsHighSwitch from raster to vector basemaps in your web map. Lighter, faster, and crisper on all screens.
Reduce initial visible layersHighSet layers to not visible by default in the web map. Let users toggle them on. Fewer layers = faster initial load.
Compress custom imagesMediumUse tinypng.com or squoosh.app before uploading. Target <100KB per image.
Simplify geometryMediumFor polygon layers, use generalized geometry. Detailed parcel boundaries aren't needed at state-level zoom.
Use Feature Layer ViewsMediumCreate views that only include the fields and features you need. Smaller payloads, faster queries.
Minimize Arcade expressionsLow-MediumComplex Arcade runs on every feature. Use server-side calculated fields instead of client-side Arcade for large datasets.
Lazy-load pagesMediumPut heavy widgets on secondary pages. Only the initial page loads on startup. Users load other pages on demand.
The 5-second rule

If your app takes more than 5 seconds to become usable on a 4G connection, you will lose users. Field workers will close the tab and call someone for the information instead. Use your browser's Developer Tools (F12 > Network tab) to measure actual load times. Sort by size — the largest files are your biggest opportunities for optimization.

Try it

Open Chrome DevTools (F12), go to the Network tab, check "Disable cache", and reload your published app. Note the total transfer size and load time. Now throttle the connection to "Slow 3G" in the Network panel dropdown and reload. This simulates what your field workers experience in rural areas. If it's painful to watch, it's painful to use.

Lesson 12

SEO and discoverability

If your app is public, you probably want people to find it. If it's internal, you want it to show up in your org's AGOL search. Either way, metadata matters.

What controls discoverability
  • Item title: Shows in AGOL search results and as the browser tab title. Be descriptive: "Hurricane Response Shelter Map - Region 4" beats "My App"
  • Item description: Shows in AGOL galleries and search results. Include keywords users would search for
  • Tags: AGOL uses tags for search relevance. Add relevant terms: "shelter", "hurricane", "response", "2026", "Region 4"
  • Thumbnail: A custom thumbnail makes your app instantly recognizable in a list of search results
  • Summary: The short description shown in AGOL card views. Keep it under 250 characters.

For public-facing apps, search engines (Google) can index your EB app. The following affect how your app appears in search results:

ElementWhere it comes fromHow to set it
Page title (browser tab)EB app name (configured in EB editor > App Settings)Keep it short, descriptive, keyword-rich
Meta descriptionAGOL item description (first 160 chars)Write a compelling first sentence in your item description
Open Graph imageAGOL item thumbnailUpload a 1200x630px image as your thumbnail for social media previews
URL slugCustom slug (Lesson 2)Use keyword-rich, hyphenated slugs
Open Graph tags for social sharing

When someone shares your app URL on Teams, Slack, Twitter, or LinkedIn, the platform shows a preview card. This card pulls from AGOL metadata. To make it look good:

  • Set a clear, compelling item title (this becomes the card headline)
  • Write a good first sentence in the item description (this becomes the card body)
  • Upload a landscape thumbnail at least 1200x630px (this becomes the card image)
  • Test by pasting your URL into Slack or the Twitter Card Validator
Think of it this way

Your AGOL item metadata is your app's resume. The title is your name, the description is your cover letter, the thumbnail is your headshot, and the tags are your skills. When someone searches AGOL or Google, these are all they see before deciding whether to click. Make the first impression count.

Quick check: When someone shares your public EB app URL on Slack or Teams, where does the preview card image come from?

Enterprise & Operations

Multi-environment pipelines, analytics, disaster rapid-deployment, accessibility compliance, and the definitive pre-publish checklist.

Lesson 13

Multi-environment deployment

For production apps used by hundreds or thousands of people, you need more than a single app with a "clone before editing" strategy. You need distinct environments: Dev, Staging, and Production.

Dev
Staging
Production
🛠️

Dev (Development)

Where you make and break things. Points to test data sources. Only accessible to the development team. Nobody cares if this breaks.

🧪

Staging (QA/UAT)

A near-exact replica of production. Points to production data (read-only) or a staging copy. Shared with testers and stakeholders for review before go-live.

🚀

Production

The live app. Never edit directly in production. All changes flow through Dev and Staging first. This is the URL your users have bookmarked.

1
Create three copies of your app: "Shelter Map - DEV", "Shelter Map - STAGING", "Shelter Map - PROD"
2
Create corresponding web maps: "Shelter WebMap - DEV" (with test data), "Shelter WebMap - STAGING", "Shelter WebMap - PROD" (both with production data)
3
Make all changes in the DEV app. Test thoroughly.
4
When ready, clone DEV to create a new STAGING (or manually replicate changes). Swap data sources from test to production data.
5
Have testers validate STAGING. Get sign-off.
6
Clone STAGING to replace PROD, or replicate changes manually. Publish PROD.
Data source swapping is the hardest part

When cloning an app between environments, the data source IDs are embedded throughout the configuration. If DEV points to a test feature layer and PROD points to a production feature layer, you need to update every data source reference. In the EB editor, go to the Data panel and swap each source. Every widget connected to the old source will reconnect to the new one — but double-check. Widgets with Arcade expressions that reference data source IDs by their string ID will need manual updates.

Data source swapping steps
  • Open the target app (STAGING or PROD) in the EB editor
  • Click the Data panel (database icon, left sidebar)
  • For each data source, click the Change button (swap icon)
  • Select the correct environment's web map or feature layer
  • Verify all widgets still display data correctly
  • Check Arcade expressions — if they reference data source IDs as strings, update those strings
Lesson 14

Monitoring and analytics

Your app is live. How do you know if anyone is actually using it? And how do you find out when something breaks before your users tell you?

📊

AGOL Usage Reports

Built-in. No setup required. Shows views per day/week/month for any item. Go to the item details page > Usage tab. Limited but free.

🔎

Google Analytics

Add a GA4 tracking ID to your EB app for detailed user behavior: page views, session duration, device types, geographic location, and custom events.

1
Create a Google Analytics 4 property at analytics.google.com
2
Copy your Measurement ID (format: G-XXXXXXXXXX)
3
In the EB editor, go to App Settings (gear icon, top toolbar)
4
Find the Google Analytics field and paste your Measurement ID
5
Publish the app. Data starts flowing to GA4 within 24-48 hours.
What to track
  • Daily active users: Is your app being used? Spikes during disasters, flat line during quiet periods.
  • Device breakdown: What percentage of users are on mobile? This tells you how much to invest in mobile optimization.
  • Page views by page: Which pages do users actually visit? If nobody uses the "About" page, remove it.
  • Session duration: If the average session is 5 seconds, users are bouncing — something's wrong.
  • Geographic distribution: Are your users where you expect? If a local shelter map has users from 20 states, your URL is being shared more widely than intended.
AGOL usage reporting
  • Available for every AGOL item — no configuration needed
  • Shows view counts by day, week, or month
  • Reports usage per item — you can track the EB app, the web map, and individual feature layers separately
  • Credit usage tracking: go to Organization > Status > Credits to see which items consume credits
  • Export usage data as CSV for custom reporting
Privacy considerations

If your app is used by disaster survivors, field workers dealing with PII, or vulnerable populations, think carefully about what analytics data you collect. GA4 collects IP-based location data by default. Disable "Google Signals" in GA4 settings if you don't need demographic data. Comply with your org's data governance policies. When in doubt, AGOL's built-in usage reports are safer because the data stays within Esri's platform.

Lesson 15

Disaster operations deployment patterns

When a disaster strikes, you don't have time to build an app from scratch. The first 24 hours are chaos. You need to go from zero to a live, shared, populated app in 30 minutes or less. This requires pre-built templates and a rehearsed deployment process.

Think of it this way

A disaster app template is like a go-bag. You don't pack it during the earthquake — you pack it last Tuesday and grab it on the way out the door. Your EB templates should be ready to go, tested, and documented before the phone rings at 2 AM.

Disaster strikes
Clone template
Swap data source
Update title/branding
Publish & share
The rapid deployment playbook
  • Maintain 3-5 app templates for common operations: shelter tracking, damage assessment, resource deployment, feeding operations, volunteer management
  • Each template uses a "template" feature layer with the correct schema (fields, domains, symbology) but empty data
  • Document the deployment process as a step-by-step checklist that a junior GIS person can follow under pressure at 3 AM
  • Pre-create short links and QR codes that you can redirect to the new app URL (use bit.ly or a custom shortener where you control the destination)
  • Test the deployment process quarterly — run a drill. Time yourself. If it takes longer than 30 minutes, simplify.
1
Clone the template app from your template library. Rename it with the disaster name and date: "DR-9876 Hurricane Alpha - Shelter Map"
2
Create a new feature layer from the template layer (or clone the template layer). This gives you an empty layer with the correct schema.
3
Swap the data source in the cloned app to point to the new feature layer (EB editor > Data panel > Change source)
4
Update the app title, subtitle, and any disaster-specific text (date, location, DR number)
5
Share the app and all data items at the appropriate level (usually org-wide or group-shared for initial operations)
6
Publish and test in an incognito window. Verify the map loads, data editing works, and all widgets are functional.
7
Update your short link / QR code to point to the new app URL. Distribute to field teams.
Hot-swapping data on a live app

Sometimes the disaster evolves and you need to change data sources on an app that's already live and in use. Be careful:

  • Swapping a data source in the editor affects the draft only — the live app continues using the old source until you publish
  • Users currently using the app won't see the swap until they refresh their browser after you publish
  • If the new data source has a different schema (different field names), widgets that reference those fields will break
  • Test in the editor's Live View before publishing. If everything looks right, publish and notify users to refresh.

Quick check: You need to deploy a shelter tracking app during an active hurricane response. What's the fastest correct approach?

Lesson 16

Accessibility compliance before publishing

If your app is used by the public or by government agencies, it likely needs to meet WCAG 2.1 AA and Section 508 accessibility standards. Even if it's not legally required, making your app accessible means more people can use it — including users with visual, motor, or cognitive disabilities. And during disasters, accessibility isn't optional: people with disabilities are disproportionately affected.

The hard truth about EB and accessibility

Experience Builder's built-in widgets have improved significantly, but they are not automatically WCAG compliant out of the box. Esri has made progress on keyboard navigation and ARIA labels, but custom themes, Arcade-generated HTML, and complex widget configurations can easily break accessibility. You are responsible for testing and fixing issues before publishing.

WCAG CriterionWhat it means for EBHow to check
1.1.1 Non-text ContentAll images need alt text. Map widgets need text alternatives for key information.Check Image widgets for alt text. Verify map data is also available in a table or text summary.
1.3.1 Info and RelationshipsHeadings must use proper heading hierarchy. Lists must be structured correctly.Use a screen reader or browser accessibility inspector to check heading order (h1, h2, h3...).
1.4.3 Contrast MinimumText must have at least 4.5:1 contrast ratio against its background.Use Chrome DevTools color contrast checker or webaim.org/resources/contrastchecker.
2.1.1 Keyboard AccessibleAll functionality must be available via keyboard (Tab, Enter, Escape).Put your mouse away. Navigate your entire app using only the keyboard. Every button, link, and interactive element must be reachable.
2.4.3 Focus OrderTab order must be logical — left to right, top to bottom, matching the visual layout.Tab through the app and verify the focus indicator moves in a logical sequence.
2.4.7 Focus VisibleThe currently focused element must have a visible outline/indicator.Tab through widgets — can you always see which element is focused?
4.1.2 Name, Role, ValueAll interactive widgets must have accessible names (ARIA labels).Use axe DevTools browser extension to scan for ARIA issues.
1
Install the axe DevTools browser extension (free, from Deque)
2
Open your published app and run an axe scan — it will list all detectable accessibility violations
3
Fix the critical and serious issues (contrast, missing alt text, missing labels)
4
Keyboard test: Navigate the entire app using only Tab, Shift+Tab, Enter, and Escape. Every interactive element must be reachable and operable.
5
Screen reader test: Turn on VoiceOver (Mac) or NVDA (Windows) and navigate the app. Listen to what the screen reader announces. Does it make sense?
6
Document your findings and fixes. Keep an accessibility report with your app documentation.
Quick wins for EB accessibility
  • Alt text on all Image widgets: Click the Image widget > Content > Add descriptive alt text
  • High-contrast themes: Use dark text on light backgrounds or vice versa. Avoid gray-on-gray.
  • Large click targets: Buttons at least 44x44 pixels. Good for accessibility AND mobile usability.
  • Don't rely on color alone: If you use red/green to indicate status, also use text labels or icons. Color-blind users can't distinguish red from green.
  • Meaningful link text: "View shelter details" beats "Click here"
  • Skip to content: EB includes a skip navigation link — make sure your theme doesn't hide it
Accessibility resources
Lesson 17

The complete pre-publish checklist

This is the checklist you run through before every publish. Print it. Bookmark it. Tape it to your monitor. It covers everything from previous lessons, condensed into a single actionable list. No excuses for missing something.

Data and permissions
  • All feature layers shared at the same level as the app
  • All web maps shared at the same level as the app
  • All hosted tables, tile layers, and image services shared correctly
  • Tested in incognito window (for public apps) or by a colleague (for org apps)
  • No secured services that would unexpectedly prompt for login
  • Feature layer views have the correct field visibility and definition queries
Content and configuration
  • App title is descriptive and professional (not "My App" or "Test")
  • Item description and tags are filled in
  • Custom thumbnail uploaded (not the default gray placeholder)
  • All placeholder text replaced with real content
  • No "Lorem ipsum" or "TODO" text remaining anywhere
  • All links work (especially external links in Text widgets)
  • Correct branding — logos, colors, and terminology match your org's standards
Functionality
  • Every button does what it's supposed to do
  • Every link navigates to the correct destination
  • Map widgets load data and respond to interactions (click, select, filter)
  • Search widgets return expected results
  • Filter widgets correctly filter the connected widgets
  • Arcade expressions produce correct output (test with edge cases: zero selections, null values, very long strings)
  • Widget message actions work (selection triggers, filter triggers, zoom-to triggers)
Mobile and responsive
  • Tested at all three breakpoints in the EB responsive preview (small, medium, large)
  • No horizontal scrolling at any breakpoint
  • All text is readable without zooming on a phone screen
  • Tap targets are at least 44x44 pixels
  • Sidebars and panels are usable on mobile (not covering critical content permanently)
  • Tested on a real phone (not just the browser preview)
Performance
  • Initial load time under 5 seconds on 4G connection
  • No oversized images (each under 200KB, total under 1MB)
  • Feature layers use definition queries or views to limit initial data load
  • Vector tile basemap (not raster) for faster rendering
  • Non-essential layers set to not visible by default
  • Tested with browser DevTools Network tab (check total transfer size)
Accessibility
  • All images have descriptive alt text
  • Color contrast meets WCAG 4.5:1 minimum
  • All functionality accessible via keyboard only
  • Focus order is logical
  • Status information uses text and icons, not just color
  • axe DevTools scan shows zero critical or serious issues
Deployment
  • Backup clone created before publishing (especially for production apps)
  • Custom slug set (if applicable)
  • QR code and short link generated and tested
  • Google Analytics configured (if tracking is needed)
  • Stakeholders notified of the publish with the correct URL
  • Documentation updated with the app URL, data sources, and configuration notes
You made it to the end!

You now understand the full lifecycle of an Experience Builder app — from draft to published, from a single user to thousands, from a quick internal tool to a production-grade disaster operations platform. The lessons in this guide are cumulative: beginners can start sharing apps today, and advanced users can build deployment pipelines that scale. The pre-publish checklist above is your safety net. Use it every time.