diff --git src/bp-blogs/bp-blogs-activity.php src/bp-blogs/bp-blogs-activity.php
index c52287c..c2122bc 100644
--- src/bp-blogs/bp-blogs-activity.php
+++ src/bp-blogs/bp-blogs-activity.php
@@ -123,20 +123,32 @@ function bp_blogs_format_activity_action_new_blog_post( $action, $activity ) {
 		$post_url = $activity->post_url;
 	}
 
-	if ( empty( $activity->post_title ) ) {
-		$post_title = bp_activity_get_meta( $activity->id, 'post_title' );
-	} else {
+	if ( ! empty( $activity->post_title ) ) {
 		$post_title = $activity->post_title;
+
+	// If activity already exists try to get the post title from activity meta
+	} else if ( ! empty( $activity->id ) ) {
+		$post_title = bp_activity_get_meta( $activity->id, 'post_title' );
 	}
 
 	// Should only be empty at the time of post creation
 	if ( empty( $post_title ) ) {
+		// Defaults to no title
+		$post_title = esc_html__( '(no title)', 'buddypress' );
+
 		switch_to_blog( $activity->item_id );
 
 		$post = get_post( $activity->secondary_item_id );
 		if ( is_a( $post, 'WP_Post' ) ) {
-			$post_title = $post->post_title;
-			bp_activity_update_meta( $activity->id, 'post_title', $post_title );
+			// Does the post have a title ?
+			if ( ! empty( $post->post_title ) ) {
+				$post_title = $post->post_title;
+			}
+
+			// Make sure the activity id exists
+			if ( ! empty( $activity->id ) ) {
+				bp_activity_update_meta( $activity->id, 'post_title', $post_title );
+			}
 		}
 
 		restore_current_blog();
diff --git tests/phpunit/testcases/blogs/activity.php tests/phpunit/testcases/blogs/activity.php
index e67adab..a5d548d 100644
--- tests/phpunit/testcases/blogs/activity.php
+++ tests/phpunit/testcases/blogs/activity.php
@@ -283,6 +283,40 @@ class BP_Tests_Blogs_Activity extends BP_UnitTestCase {
 
 		$this->assertEquals( $this->comment_post_id, $p );
 	}
+
+	/**
+	 * @group activity_action
+	 * @group bp_blogs_format_activity_action_new_blog_post
+	 */
+	public function test_bp_blogs_format_activity_action_new_blog_post_no_title() {
+		if ( is_multisite() ) {
+			return;
+		}
+
+		$u = $this->factory->user->create();
+		$p = wp_insert_post( array(
+			'post_author' => $u,
+			'post_title'  => '', // no title: the object of the test
+			'post_status' => 'publish',
+			'post_content' => 'foo bar',
+		) );
+
+		$user_link = bp_core_get_userlink( $u );
+		$blog_url = get_home_url();
+		$post_url = add_query_arg( 'p', $p, trailingslashit( $blog_url ) );
+		$post_title = '(no title)';
+		$post_link = '<a href="' . $post_url . '">' . $post_title . '</a>';
+
+		$a_obj = bp_activity_get( array(
+			'item_id'           => 1,
+			'secondary_item_id' => $p,
+		) );
+
+		$expected = sprintf( '%s wrote a new post, %s', $user_link, $post_link );
+
+		$this->assertSame( $expected, $a_obj['activities'][0]->action );
+	}
+
 	/**
 	 * Dopey passthrough method so we can check that the correct values
 	 * are being passed to the filter
