diff --git src/wp-admin/includes/class-wp-community-events.php src/wp-admin/includes/class-wp-community-events.php
index d3c6f08699..49c2af8c8e 100644
--- src/wp-admin/includes/class-wp-community-events.php
+++ src/wp-admin/includes/class-wp-community-events.php
@@ -143,7 +143,13 @@ class WP_Community_Events {
 	 */
 	protected function get_request_url( $search = '', $timezone = '' ) {
 		$api_url = 'https://api.wordpress.org/events/1.0/';
-		$args    = array( 'number' => 5 ); // Get more than three in case some get trimmed out.
+		$args    = array(
+			// Get more than three in case some get trimmed out.
+			'number' => 5,
+
+			// Anonymize the IP to protect user privacy.
+			'ip' => $this->maybe_anonymize_ip_address( $this->get_unsafe_client_ip() ),
+		);
 
 		/*
 		 * Send the minimal set of necessary arguments, in order to increase the
@@ -161,16 +167,6 @@ class WP_Community_Events {
 
 			if ( $search ) {
 				$args['location'] = $search;
-			} else {
-				/*
-				 * Protect the user's privacy by anonymizing their IP before sending
-				 * it to w.org, and only send it when necessary.
-				 *
-				 * The w.org API endpoint only uses the IP address when a location
-				 * query is not provided, so we can safely avoid sending it when
-				 * there is a query.
-				 */
-				$args['ip'] = $this->maybe_anonymize_ip_address( $this->get_unsafe_client_ip() );
 			}
 		}
 
@@ -275,7 +271,17 @@ class WP_Community_Events {
 	protected function get_events_transient_key( $location ) {
 		$key = false;
 
-		if ( isset( $location['latitude'], $location['longitude'] ) ) {
+		if ( isset( $location['ip'] ) ) {
+			/*
+			 * Use the IP that was sent in the API request, not the IP that the
+			 * the API responded with. If the sent IP was private, the API will
+			 * use the corresponding public IP for geolocation, and return that.
+			 * If that public IP were used when setting the transient, then the
+			 * transient would never be successfully retrieved, because
+			 * get_unsafe_client_ip() will always return the private IP instead.
+			 */
+			$key = 'community-events-' . md5( $this->maybe_anonymize_ip_address( $this->get_unsafe_client_ip() ) );
+		} else if ( isset( $location['latitude'], $location['longitude'] ) ) {
 			$key = 'community-events-' . md5( $location['latitude'] . $location['longitude'] );
 		}
 
diff --git src/wp-admin/includes/dashboard.php src/wp-admin/includes/dashboard.php
index 0f0058127f..f23fbde49d 100644
--- src/wp-admin/includes/dashboard.php
+++ src/wp-admin/includes/dashboard.php
@@ -1247,6 +1247,10 @@ function wp_print_community_events_templates() {
 		); ?>
 	</script>
 
+	<script id="tmpl-community-events-attend-event-near-generic" type="text/template">
+		<?php _e( 'Attend an upcoming event near you.' ); ?>
+	</script>
+
 	<script id="tmpl-community-events-could-not-locate" type="text/template">
 		<?php printf(
 			$script_data['l10n']['could_not_locate_city'],
@@ -1286,6 +1290,15 @@ function wp_print_community_events_templates() {
 		</li>
 	</script>
 
+	<script id="tmpl-community-events-no-upcoming-events-generic" type="text/template">
+		<li class="event-none">
+			<?php printf(
+				/* translators: meetup organization documentation URL. */
+				__( 'There aren&#8217;t any events scheduled near you at the moment. Would you like to <a href="%s">organize one</a>?' ),
+				__( 'https://make.wordpress.org/community/handbook/meetup-organizer/welcome/' )
+			); ?>
+		</li>
+	</script>
 	<?php
 }
 
diff --git src/wp-admin/js/dashboard.js src/wp-admin/js/dashboard.js
index 6a9b5033d4..8d2994696c 100644
--- src/wp-admin/js/dashboard.js
+++ src/wp-admin/js/dashboard.js
@@ -369,7 +369,27 @@ jQuery( function( $ ) {
 			 * Determine which templates should be rendered and which elements
 			 * should be displayed.
 			 */
-			if ( templateParams.location ) {
+			if ( templateParams.location.ip ) {
+				/*
+				 * If the API determined the location by geolocating an IP, it will
+				 * provide events, but not a specific location.
+				 */
+				template = wp.template( 'community-events-attend-event-near-generic' );
+				$locationMessage.html( template( templateParams ) );
+
+				if ( templateParams.events.length ) {
+					template = wp.template( 'community-events-event-list' );
+					$results.html( template( templateParams ) );
+				} else {
+					template = wp.template( 'community-events-no-upcoming-events-generic' );
+					$results.html( template( templateParams ) );
+				}
+
+				elementVisibility['#community-events-location-message'] = true;
+				elementVisibility['.community-events-toggle-location']  = true;
+				elementVisibility['.community-events-results']          = true;
+
+			} else if ( templateParams.location.description ) {
 				template = wp.template( 'community-events-attend-event-near' );
 				$locationMessage.html( template( templateParams ) );
 
