The Ideal Player Feedback Journey Looks Like This

In this article, I’m going to highlight some of the community’s challenges when giving feedback and some of the developer’s challenges when receiving feedback.

My background is from the player perspective and I’ve never worked at a development studio. I am an ex-influencer who built a massive fan community for one of the most popular mobile games in the world, Game of War: Fire Age, and then started a B2B business creating many more fan communities for other top mobile games.

From what I see, the existing systems developers and publishers use for capturing player feedback are inherently off-putting and result in your Superuser players no longer giving their feedback.

Instead, they discuss their ideas for actionable feedback in unofficial channels. In unofficial channels, they will either get the validation and engagement they are looking for (from other players and Superusers) or they will quit the game for good.

At the end of this article, I’ll give you some methods for capturing valuable actionable feedback from unofficial channels. 

What A Bad Player Feedback Journey Looks Like

In my experience, the flow of a player wanting to give feedback often looks like this:

A player named Mike experiences something in the game he thinks could be improved. Mike goes through a somewhat convoluted process of navigating through the FAQs to contact a real person in customer support to tell them about his problem. Mike receives an automated reply that his ticket was received.

By the next morning, he receives another automated reply that his feedback is appreciated and that it has been sent to the development team.

Mike doesn’t feel like his feedback was heard, and he begins to lose confidence in the developers.

He begins to think that these devs are just like all the others who do whatever they want and don’t listen to players.

If you’re a developer reading this thinking, “Well we receive thousands of tickets a day, and it’s too costly to reply to all of them without automation.” I agree with you.

I would do the same thing if I was in your position, but it’s important to understand how Mike’s feedback journey evolves as a result of the existing feedback process.

A week later Mike has more feedback to give, but instead of sending it to customer support, he goes to the game’s Facebook page (or other social media) and exaggerates his thoughts in a frustrated and angry way to get attention.

He sees hundreds of other players doing the same thing, further angering him because he feels no hope of being heard. As a result, Mike loses more confidence and trust in the devs.

The next morning he sees that the dev’s community manager replied with an automated response to his comment.

It says, “Hi Mike, your feedback is greatly appreciated and has been sent to the development team.” Mike gives up on giving any more feedback to the devs and considers quitting the game. 

Some players may be more patient and try to give feedback to the devs a few more times before getting actually angry, but over the years it seems like players have gotten more and more impatient.  

Before quitting, Mike looks around the internet for some fan communities where he can see how other dedicated players are thinking about the game.

He hopes to find a positive space where he can express his opinions, feel validated, and connect with other friendly players who might help improve his gameplay experience.

Unfortunately, Mike sees other players in the community complaining about the same things and other problems he’s never even thought of.

This is a critical moment in Mike’s journey. He is likely to leave the game forever if:

  1. The community is non-existent or dead.
  2. The community is not friendly towards new players.
  3. The community is also overtly negative towards the game.

As you can see, a player with good feedback can become demoralized very quickly. A developer with limited resources needs to allocate them wisely to avoid these pitfalls. 

It’s important to allocate some of your limited resources to where demoralized players can be revitalized, and that’s in Superuser-led communities.

Below are action steps, split between low effort and high effort, that you can take to retain the thousands of players who will go through the experience above. 

Action Steps (Low Effort):

First, create relationships with your Superuser-led communities and find ways to support and empower them. For example, give high-quality influencers free promotion or even some in-game currency. You should seriously consider paying the best and biggest influencers with real money because if they switch to another game, they’ll take a lot of your players with them. Also, provide them some art files to beautify their website, Reddit, YouTube, or Twitch.

Second, select a few trusted moderators and give them a special channel to contact you for urgent bugs. 

Third, reward positive and helpful mods with in-game currency. They won’t work for free forever. The effort of a few dedicated moderators can save you hundreds of thousands of dollars by preventing tens of thousands of players from quitting.

They answer tons of FAQs in the community, organize the content, and remove toxic players. These things are so important to a healthy and engaging community.

Action Steps (High Effort):

First, find 3-5 helpful, positive, and constructive Superusers from the community and train them to provide you with the type of feedback that will improve your KPIs.

Teach them the questions to ask and answer about each component of your game that your designers know will increase your revenue and retention. Have these Superusers authentically facilitate, capture, and filter player sentiment from the communities they are involved in.

Create structured sentiment reports for these Superusers to fill out bi-weekly. Have an editor go through it before sending it to your designers.

Second, pay and train these Superusers to write strategy guides so you can share their knowledge with your hundreds of thousands of players. Education is key to engagement, LTV, and reducing support costs. 

Interestingly, gamers across all genres (from puzzle to strategy) and all countries care the most about informational content in the form of tips, tricks, and strategies.

Source: Facebook Gaming Report (shows all genres)

Third, when possible, validate a player’s feedback without an automated message, while really responding to what the player is saying. Here are some good, non-automated, and authentic replies to app store reviews that have the potential to retain the player who left the review:

Fourth, you can release a survey to the player base each month so they have a way to express themself and feel that the developer is listening. The survey does not need to be long. More importantly, it’s vital that you follow up with an announcement of the changes you will or will not make as a result of the survey responses.

The Ideal Player Feedback Journey

This is what the player feedback journey would look like if you did implement these action steps. 

A player named Mike experiences something in the game he thinks could be improved. Mike goes through a somewhat convoluted process of navigating through the FAQs to contact a real person in customer support to tell them about his problem. Mike receives an automated reply that his ticket was received. By the next morning, he receives a reply from a real person. 

The real person:

  • Confirms they are a real person.
  • Validates Mike’s feedback.
  • Gives options to solve the problem.
  • Explains to Mike what they are doing about his suggestion.
  • Tells Mike when to expect a change.

Mike feels happy, validated, taken care of, and heard. His trust in the devs also goes up. Assuming the game is still a good fit for him, he continues playing with confidence that the devs will address his feedback in a timely manner. 

Of course, the devs do actually have to follow Mike’s feedback in order to retain Mike’s trust.

Mike is encouraged to dive deeper into the game because he feels like these devs are special. They actually listen to him. 

Mike begins exploring the various communities associated with the game, official and unofficial ones alike. He bookmarks one official channel to follow for announcements. He bookmarks one or more unofficial (Superuser-led) communities where he finds valuable tips, tricks, and strategies. 

The mods in the Superuser-led communities are positive and welcoming. When Mike has questions for the community, they send him links to strategy guides or videos made by the mods themselves.

After living in this healthy atmosphere for a few months, he becomes a Superuser. Mike now understands the game’s mechanics incredibly well, is socially active in his guild, and engages positively in the game’s community. 

He is so knowledgeable about the game that his responses to developer surveys become very reliable.  

He discusses his ideas regularly in the community and occasionally sends them in through customer support. The mods of the community who are trained to facilitate, capture, and filter valuable information from the players often use feedback from Mike because the community tends to agree with him.

Fast forward two years and Mike is a top-tier player who has spent thousands of dollars in the game with no intention of quitting any time soon. 


Even with limited resources, the player feedback journey can change drastically for the better. If you can accomplish both the low effort and high effort action steps, your player sentiment will be shockingly positive. Some games that have effectively deployed these strategies are Spellbreak and The Last Epoch, along with all of GamerSpeak’s clients.

For more lessons about community development. Check out my presentation on the six lessons I learned in six years of player first community development.

To learn more about the GamerSpeak method and how it increases revenue and retention up to 30% in six months or less using these steps click here:

You May Also Like…

Subscribe to "How to Earn Money in Games"

You will receive an email every two weeks when we publish new content!

You have Successfully Subscribed!

[gravityform id="27" title="false" description="false" ajax="true"]
<script type="text/javascript">var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,initializeOnLoaded:function(o){gform.domLoaded&&gform.scriptsLoaded?o():!gform.domLoaded&&gform.scriptsLoaded?window.addEventListener("DOMContentLoaded",o):document.addEventListener("gform_main_scripts_loaded",o)},hooks:{action:{},filter:{}},addAction:function(o,n,r,t){gform.addHook("action",o,n,r,t)},addFilter:function(o,n,r,t){gform.addHook("filter",o,n,r,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,n){gform.removeHook("action",o,n)},removeFilter:function(o,n,r){gform.removeHook("filter",o,n,r)},addHook:function(o,n,r,t,i){null==gform.hooks[o][n]&&(gform.hooks[o][n]=[]);var e=gform.hooks[o][n];null==i&&(i=n+"_"+e.length),gform.hooks[o][n].push({tag:i,callable:r,priority:t=null==t?10:t})},doHook:function(n,o,r){var t;if(,1),null!=gform.hooks[n][o]&&((o=gform.hooks[n][o]).sort(function(o,n){return o.priority-n.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==n?t.apply(null,r):r[0]=t.apply(null,r)})),"filter"==n)return r[0]},removeHook:function(o,n,t,i){var r;null!=gform.hooks[o][n]&&(r=(r=gform.hooks[o][n]).filter(function(o,n,r){return!!(null!=i&&i!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][n]=r)}});</script> <div class='gf_browser_unknown gform_wrapper gravity-theme' id='gform_wrapper_27' ><div id='gf_27' class='gform_anchor' tabindex='-1'></div> <div class='gform_heading'> <p class='gform_required_legend'>&quot;<span class="gfield_required gfield_required_asterisk">*</span>&quot; indicates required fields</p> </div><form method='post' enctype='multipart/form-data' target='gform_ajax_frame_27' id='gform_27' action='/ideal-player-feedback-journey-looks-like-this/#gf_27' ><div class='gf_invisible ginput_recaptchav3' data-sitekey='6LcpEpofAAAAAO1B7izG9x7zIC_DJSq3HDkX5A_W' data-tabindex='0'><input id="input_2114b0cadfaa8575fc62b8606ef3b9a0" class="gfield_recaptcha_response" type="hidden" name="input_2114b0cadfaa8575fc62b8606ef3b9a0" value=""/></div> <div class='gform_body gform-body'><div id='gform_fields_27' class='gform_fields left_label form_sublabel_below description_below'><fieldset id="field_27_4" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_27_4"><legend class='gfield_label gfield_label_before_complex' >Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></legend><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name has_last_name no_suffix gf_name_has_2 ginput_container_name' id='input_27_4'> <span id='input_27_4_3_container' class='name_first' > <input type='text' name='input_4.3' id='input_27_4_3' value='' aria-required='true' aria-describedby="gfield_description_27_4"/> <label for='input_27_4_3' >First</label> </span> <span id='input_27_4_6_container' class='name_last' > <input type='text' name='input_4.6' id='input_27_4_6' value='' aria-required='true' /> <label for='input_27_4_6' >Last</label> </span> </div><div class='gfield_description' id='gfield_description_27_4'>We will never share your information.</div></fieldset><div id="field_27_1" class="gfield gfield--width-full sl-cta-email gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_27_1"><label class='gfield_label' for='input_27_1' >Email<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_1' id='input_27_1' type='text' value='' class='large' placeholder='Email' aria-required="true" aria-invalid="false" /> </div></div><fieldset id="field_27_5" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_27_5"><legend class='gfield_label gfield_label_before_complex' >Consent<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></legend><div class='ginput_container ginput_container_consent'><input name='input_5.1' id='input_27_5_1' type='checkbox' value='1' aria-required="true" aria-invalid="false" /> <label class="gfield_consent_label" for='input_27_5_1' >I agree to receive emails from GamerSpeak</label><span class="gfield_required gfield_required_asterisk">*</span><input type='hidden' name='input_5.2' value='I agree to receive emails from GamerSpeak' class='gform_hidden' /><input type='hidden' name='input_5.3' value='1' class='gform_hidden' /></div></fieldset><div id="field_27_12" class="gfield gfield--width-quarter field_sublabel_below field_description_below gfield_visibility_hidden" data-js-reload="field_27_12"><div class='admin-hidden-markup'><i class='gform-icon gform-icon--hidden'></i><span>Hidden</span></div><label class='gfield_label' for='input_27_12' >utm_source</label><div class='ginput_container ginput_container_text'><input name='input_12' id='input_27_12' type='text' value='' class='large' aria-invalid="false" /> </div></div><div id="field_27_14" class="gfield gfield--width-quarter field_sublabel_below field_description_below gfield_visibility_hidden" data-js-reload="field_27_14"><div class='admin-hidden-markup'><i class='gform-icon gform-icon--hidden'></i><span>Hidden</span></div><label class='gfield_label' for='input_27_14' >utm_medium</label><div class='ginput_container ginput_container_text'><input name='input_14' id='input_27_14' type='text' value='' class='large' aria-invalid="false" /> </div></div><div id="field_27_13" class="gfield gfield--width-quarter field_sublabel_below field_description_below gfield_visibility_hidden" data-js-reload="field_27_13"><div class='admin-hidden-markup'><i class='gform-icon gform-icon--hidden'></i><span>Hidden</span></div><label class='gfield_label' for='input_27_13' >utm_campaign</label><div class='ginput_container ginput_container_text'><input name='input_13' id='input_27_13' type='text' value='' class='large' aria-invalid="false" /> </div></div><div id="field_27_15" class="gfield gfield--width-quarter field_sublabel_below field_description_below gfield_visibility_hidden" data-js-reload="field_27_15"><div class='admin-hidden-markup'><i class='gform-icon gform-icon--hidden'></i><span>Hidden</span></div><label class='gfield_label' for='input_27_15' >utm_content</label><div class='ginput_container ginput_container_text'><input name='input_15' id='input_27_15' type='text' value='' class='large' aria-invalid="false" /> </div></div><div id="field_27_16" class="gfield gfield--width-full field_sublabel_below field_description_below gfield_visibility_hidden" data-js-reload="field_27_16"><div class='admin-hidden-markup'><i class='gform-icon gform-icon--hidden'></i><span>Hidden</span></div><label class='gfield_label' for='input_27_16' >utm_term</label><div class='ginput_container ginput_container_text'><input name='input_16' id='input_27_16' type='text' value='' class='large' aria-invalid="false" /> </div></div><div id="field_27_17" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_27_17"><label class='gfield_label' for='input_27_17' >Phone</label><div class='ginput_container'><input name='input_17' id='input_27_17' type='text' value='' /></div><div class='gfield_description' id='gfield_description_27_17'>This field is for validation purposes and should be left unchanged.</div></div></div></div> <div class='gform_footer left_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ""> <html><body><button type="submit" id="gform_submit_button_27" class="dcgd_submit_button et_pb_contact_submit et_pb_button gform_button button" onclick='if(window["gf_submitting_27"]){return false;} window["gf_submitting_27"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_27"]){return false;} window["gf_submitting_27"]=true; jQuery("#gform_27").trigger("submit",[true]); }' style="margin:auto"></body></html> <span>Get the PDF</span></button> <input type='hidden' name='gform_ajax' value='form_id=27&amp;title=&amp;description=&amp;tabindex=0' /> <input type='hidden' class='gform_hidden' name='is_submit_27' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='27' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_27' value='WyJ7XCI1LjFcIjpcIjJlYjc4ZDZjNjk0ZjA2ZTc4YmNmNjRkM2ExYzYzYjhhXCIsXCI1LjJcIjpcIjZkMGI5OGIwMjMyYjY2NzI4ZTZkYjgwMmU1N2E2ZjEwXCIsXCI1LjNcIjpcIjJlYjc4ZDZjNjk0ZjA2ZTc4YmNmNjRkM2ExYzYzYjhhXCJ9IiwiYTQ2ODVlNzY4YThmYmZjYzA2MTI4YjE3Y2E2MzA0NmEiXQ==' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_27' id='gform_target_page_number_27' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_27' id='gform_source_page_number_27' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_27' id='gform_ajax_frame_27' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe> <script type="text/javascript"> gform.initializeOnLoaded( function() {gformInitSpinner( 27, '' );jQuery('#gform_ajax_frame_27').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_27');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_27').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_27').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_27').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_27').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_27').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_27').val();gformInitSpinner( 27, '' );jQuery(document).trigger('gform_page_loaded', [27, current_page]);window['gf_submitting_27'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_27').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_27').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [27]);window['gf_submitting_27'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_27').text());}, 50);}else{jQuery('#gform_27').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [27, current_page]);} );} ); </script>