GitHub Actions|Deploy Free App Review Monitoring Bot in 3 Steps
App developers struggling to track user reviews can deploy a stable, secure app review monitoring bot using GitHub Actions in just three easy steps, enabling real-time feedback tracking and faster response to user needs.
点击这里查看本文章简体中文版本。
點擊這裡查看本文章正體中文版本。
This post was translated with AI assistance — let me know if anything sounds off!
[Quick Start! ] Github Action x ZReviewTender Free Fast Deployment of Your App Store Review Monitoring Bot
Three Simple Steps to Create a Free, Stable, and Secure App Review Bot to Instantly Monitor Users’ Latest Reviews.
ZReviewTender
ZReviewTender — is an open-source app review bot I created in August 2022. It automatically fetches user reviews from the iOS App Store and Android Google Play Store and forwards them to a specified Slack channel.
You can also specify review retrieval rules, integrate with Google Translate, Asana, Google Sheets, and support custom operations.
Github Action
Github Action is a CI/CD automation integration tool provided by Github. We can use our own machines as servers (Github Runner) or directly use machines provided by Github to run CI/CD and automation scripts.
Costs and Limitations
Using Your Own Machine (Github Runner):
No special fees, only limits on maximum runs, concurrency, and some short-term API request limits.
GitHub Free offers basic 500 MB Storage (for CI/CD Artifacts) and 2,000 minutes of monthly runtime.
Note here due to machine cost issues:
If you use a Windows machine on Github, the consumed minutes equal the actual minutes multiplied by 2.
If you use Github’s macOS machines, the consumed minutes equal the actual minutes multiplied by 10.
For detailed pricing calculations, please refer to the official pricing calculator.
ZReviewTender _Minutes per month usage: about 120 minutes*
Only needs to run on basic priced Linux, each execution takes ≤ 1 minute, set to run every 6 hours by default, using 4 minutes per day, about 120 minutes per month, well within the free tier.
ZReviewTender _Storage usage: 0*
No use of Artifact for data storage, so there is no Storage overhead.
Slack
The company’s internal communication software creates a Slack App and uses this Slack App identity to forward app store review notifications to a designated channel.
ZReviewTender x Github Action x Slack
We use Github Action to run the ZReviewTender script and send results to Slack. The Github Repo (Action) serves only as a carrier, so even if your main project is not hosted on Github, you can still easily deploy ZReviewTender by following the steps below. 🎉🎉🎉
I have successfully deployed it in various apps for 5 different companies, running smoothly and free of charge for over 2 years.
Advantages:
Free: ZReviewTender is an open-source free service I created, deployed on Github Action with plenty of free usage quota.
You don’t need to pay monthly fees for app review bot services anymore.Security: Credentials and keys used for fetching reviews are securely stored in your Github Private Repo, accessible only by you.
You no longer need to risk exposing important credentials or keys by uploading them to third-party services; ZReviewTender is an open-source project, and all operations are open to public scrutiny.Reliable: ZReviewTender uses the latest official API to fetch review data. Compared to other services that use RSS feeds, it is more accurate, stable, and reliable.
Buy me coffee ❤️❤️❤️
https://www.buymeacoffee.com/zhgchgli
If this project has helped you, please consider buying me a coffee. Thank you.
Quick Start!🚀
The entire setup takes about 30 minutes but only needs to be done once. Unless the certificate key changes, it can run stably and free forever. 🚀🚀🚀🚀🚀
Step 1. Create a Slack App
If your organization already has a Slack App with messaging permissions like chat:write
, you can reuse it directly without creating a new one.
Click the top right corner “Create New App”.
Choose: From scratch
Enter App Name:
ZReviewTender
or a custom Slack App nameSelect the target Slack Workspace for installation: Please ensure you have permission to add Slack Apps in the Workspace you choose.
Create App
Add OAuth & Permissions Scopes:
After creating the Slack app, go to the “OAuth & Permissions” tab to set the scopes.
Select “OAuth & Permissions”
Scroll down to find the Scopes Section
Enter the three essential Scopes for adding the ZReviewTender Slack App in order:
chat:write
chat:write.public
links:write
Install App
Go back to the Install App tab to install the Slack App to the Workspace.
Select “Install App”
Click “Install to YOUR_WORKSPACE”
Click “Allow”
After installation, return to the Install App page to find the Slack App Bot User OAuth Token
. Click “Copy” to copy it, make sure to save it for later use.
Create a Channel for Pre-Received Review Notifications:
Sidebar -> Channels -> Create -> Create channel
Name: Enter the desired channel name
Visibility:
Public: Open to everyone, no further action required.
Private: Private channel, ⭐️⭐️⭐️ need to add the newly created Slack App:
How to Add Slack App to a Channel:
Click the #channel name above
Click “Settings”
Click “Add an App”
Search for the Slack App name you just created
Click “Add”
Joining a successful channel will display a prompt phrase. ZReviewTender joined.
⭐️⭐️⭐️Here is a Slack bug: newly created Slack Apps may not be searchable immediately and take some time to appear; you can use Public Channels first, which do not require adding the Slack App to use.
Get Channel ID:
The final and most important step is to get the Channel ID, which will be used later for configuration.
Click the #channel-name above
You will find the Channel ID information at the bottom
Note down the
Channel ID
for later configuration
Slack steps completed.
— — —
Other Notes:
You can edit the Slack App name and icon in “Basic Information” -> “Display Information”:
Remember to click “Save Changes” at the bottom right to save your edits.
If OAuth & Permissions Scopes are added, you need to click “reinstall your app” to take effect:
Step 2. Generate Apple App Store Connect API & Google Play Android Developer API Credentials
Apple App Store Connect API Credentials
iOS is easier; we only need to get the following four pieces of information from App Store Connect:
Issuer ID:
App Store Connect -> Keys -> App Store Connect API
Note down the
Issuer ID
for later setup
Private Key ID & Private Key:
Click the “+” button to add:
Name:
ZReviewTender
Access:
App Manager
Key ID
, to be set later for useClick “Download API Key” to save the downloaded
AuthKey_XXXXXXXXXX.p8
file for later setup.
App ID : (The target App ID to fetch reviews)
App ID can be found in App Store Connect -> App Store -> General -> App Information -> App ID
.
- Note down the
App ID
for later configuration
Google Play Android Developer API Credentials
Android is more complex. You need to first enable the API in the Google Cloud Project associated with the app, create a Service Account, and add the Service Account to the Google Play Console with app permissions.
Select the Google Cloud Project for your app project or create a new Project.
Enable “Android Developer API”:
Search for “Android Developer API” and click to enter
Select “Enable”
[Optional Step] You can also enable the “Cloud Translation API”:
After activation, you can use the same Service Account credentials to integrate the automatic translation feature for reviews.
Note: The Cloud Translation API is not free; language detection and translation will incur charges!
Note: The Cloud Translation API is not free; language detection and translation will incur charges!
Note: The Cloud Translation API is not free; language detection and translation will incur charges!
Create a Service Account:
Search for “IAM”
Select “IAM & Admin”
Select “Service Account”
Select “Create Service Account”
Service account name: Enter manually, you can input “
ZReviewTender
” or “Google Play Review Bot
”Service Account ID: Automatically filled in; no need to change unless there are special requirements. This will also be your Service Account Email.
Click “Done”
Note down the email address of this Service Account:
The list page will also display the Service Account Email address.
Note down the
Service Account Email
for later setup
Create Service Account Key Credentials:
Refresh the list page, then click to enter the newly created Service Account.
Click “Add Key”
Click “Create New Key”
Select the key type as “JSON”
Click “Create”
Save the downloaded
XXXX-XXXX.json
file for later configuration
Add the service account to Google Play Console and grant permissions to the target app for fetching reviews:
Enter the Google Play Console backend:
Click “Users and permissions”
Click “Invite new users” on the right side
Enter the
Service Account Email
you just noted in the Email address field.App permissions -> Add app
Add the target app to fetch reviews from
Click “Invite user” to complete the invitation without verification.
Obtain Google Play Console Developer ID & App ID & Package Name Information:
Click the target app to retrieve reviews and enter the Dashboard
Note down the
Package Name
for later configuration
Copy the Dashboard URL and find from the URL:
Among them, /developers/
XXX
is yourDeveloper ID
. Note down this Developer ID for later configurationAmong them, /app/
XXX
is yourApp ID
, note down this App ID number for later configuration
Identity credential setup complete.
Step 3. Github Action Deployment and Configuration File Completion
The exciting news is that I have packaged the tedious Github Repo and Github Action setup process into a Repo Template & Marketplace Github Action. You can complete the work by following these simple steps.
Go to: ZReviewTender-deploy-with-github-action :
https://github.com/ZhgChgLi/ZReviewTender-deploy-with-github-action
Repository name: Enter the desired Repo name
Private: Since the repo will store access keys, be sure to set it as a Private Repo ⭐️⭐️⭐️
Private: Since the repo will store access keys, make sure to set it as a Private Repo ⭐️⭐️⭐️
Private: Since the repo will store access keys, be sure to set it as a Private Repo ⭐️⭐️⭐️
Click “Create repository”
The author and contributors of ZReviewTender, ZhgChgLi, are not responsible for any losses caused by your use of ZReviewTender.
Waiting for Repository Creation:
Confirm again that the repository created is Private:
Private: Since the repo will store access keys, be sure to set it as a Private Repo ⭐️⭐️⭐️
Private: Since the repo will store access keys, be sure to set it as a Private Repo ⭐️⭐️⭐️
Private: Since the repo will store access keys, be sure to set it as a Private Repo ⭐️⭐️⭐️
Enable Github Actions Permissions:
After creating the repo, due to Github security settings, you need to go to Repo Settings to allow Github Actions to run.
Repo -> Settings
Select “Actions” -> “General”
Actions permissions: choose “Allow all actions and reusable workflows”
Click “Save”
Workflow permissions: select “Read repository contents and packages permissions”
First Run, Initialize ZReviewTender:
Repo -> Actions
Select “Init ZReviewTender”
Choose “Run workflow”
Click “Run workflow”
Refresh the page
Waiting for init ZReviewTender
Action to complete:
If you see ❌ Error: please double-check the Github Actions permission settings mentioned earlier.
After successful initialization, two new directories will appear on the Repo homepage:
Required certificate files for upload:
Enter the
/config
directoryClick “Add file” in the top right corner -> “Upload files”
Upload the saved GCP Service Account
XXXX-XXXX.json
(for Android) along with the App Store Connect savedAuthKey_XXXXXXXXXX.p8
(for iOS).Wait for the upload to complete
Select “Commit directly to the main branch”
Click “Commit changes”
Set up Apple (iOS):
- Enter the
config/
directory and click on theapple.yml
file.
- Click the top right corner “🖊️ Edit”
Edit apple.yml
, paste the following content, and fill in the information noted from the previous steps:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
platform: 'apple'
appStoreConnectP8PrivateKeyFilePath: './config/AuthKey_XXXXXXXXXX.p8' # APPLE STORE CONNECT API PRIVATE .p8 KEY File Path
appStoreConnectP8PrivateKeyID: 'Private Key ID' # APPLE STORE CONNECT API PRIVATE KEY ID
appStoreConnectIssueID: 'Issuer ID' # APPLE STORE CONNECT ISSUE ID
appID: 'App ID' # APP ID
processors:
- SlackProcessor: # Slack Processor, resend App Review to Slack.
class: "SlackProcessor"
enable: true # enable
slackTimeZoneOffset: "+08:00" # Review Created Date TimeZone
slackAttachmentGroupByNumber: "1" # 1~100, how many review message in 1 slack message.
slackBotToken: "Slack App Bot User OAuth Token" # Slack Bot Token, send slack message through Slack Bot.
slackBotTargetChannel: "Target Channel ID" # Slack Bot Token, send slack message through Slack Bot. (recommended, first priority)
slackInCommingWebHookURL: "" # Slack Incoming WebHook URL, send slack message through Incoming WebHook, not recommended, deprecated.
appStoreConnectP8PrivateKeyFilePath
:
Enter./config/AuthKey_XXXXXXXXXX.p8
(Step 2. The savedAuthKey_XXXXXXXXXX.p8
file name from App Store Connect)appStoreConnectP8PrivateKeyID
: Step 2. ThePrivate Key ID
noted from App Store ConnectappStoreConnectIssueID
: Step 2. TheIssuer ID
recorded from App Store ConnectappID
: Step 2. The target App’sApp ID
recorded from App Store ConnectslackBotToken
: Enter theSlack App Bot User OAuth Token
noted in Step 1.slackBotTargetChannel
: Enter theChannel ID
recorded in Step 1 to send the message to
After editing, click “Commit changes…” at the top right corner.
Choose “Commit directly to the main branch”
Click “Commit changes”
Setting Android:
- Enter the
config/
directory and click theandroid.yml
file
- Click the top right corner “🖊️ Edit”
Edit android.yml
, paste the following content, and fill in the information noted in the previous steps:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
platform: 'android'
packageName: 'Package Name' # Android App Package Name
keyFilePath: './config/XXXX-XXXX.json' # Google Android Publisher API Service Account Credential .json File Path
playConsoleDeveloperAccountID: 'Developer ID' # Google Console Developer Account ID
playConsoleAppID: 'App ID' # Google Console App ID
processors:
- SlackProcessor: # Slack Processor, resend App Review to Slack.
class: "SlackProcessor"
enable: true # enable
slackTimeZoneOffset: "+08:00" # Review Created Date TimeZone
slackAttachmentGroupByNumber: "1" # 1~100, how many review messages in one Slack message.
slackBotToken: "Slack App Bot User OAuth Token" # Slack Bot Token, send Slack messages through Slack Bot.
slackBotTargetChannel: "Target Channel ID" # Slack Bot Token, send Slack messages through Slack Bot. (recommended, first priority)
slackInCommingWebHookURL: "" # Slack Incoming WebHook URL, send Slack messages through Incoming WebHook, not recommended, deprecated.
packageName
: Step 2. ThePackage Name
recorded from the Google Play Console backendkeyFilePath
:
Enter./config/XXXX-XXXX.json
(Step 2. TheXXXX-XXXX.json
Service Account key file name saved from GCP IAM)playConsoleDeveloperAccountID
: Step 2. TheDeveloper ID
recorded from the Google Play Console backendplayConsoleAppID
: Step 2. TheApp ID
recorded from the Google Play Console backendslackBotToken
: Enter theSlack App Bot User OAuth Token
noted in Step 1.slackBotTargetChannel
: Enter theChannel ID
recorded in Step 1 to send the message to
After editing, click “Commit changes…” at the top right corner.
Choose “Commit directly to the main branch”
Click “Commit changes”
Setup Complete! 🚀🚀🚀🚀
Verify if the setup was successful:
We can run it manually once to confirm the settings are correct.
Repo -> Actions
Choose “ZReviewTender”
Select “Run workflow”
Click “Run workflow”
Reload page
Wait for ReviewTender
Action to complete:
Verification Successful 🎉🎉🎉🎉
If you see ❌ Error or the Slack Channel does not receive the start message: please recheck if the previous configuration file contents are correct.
Completed 🎉🎉🎉
You can now rely on this free and reliable app review bot to keep track of users’ latest reviews at all times!
Buy me coffee ❤️❤️❤️
https://www.buymeacoffee.com/zhgchgli
If this project has helped you, please consider buying me a coffee. Thank you.
Other Settings
Add Filtering Functionality
Only forward reviews that meet the criteria.
1
2
3
4
5
6
- FilterProcessor:
class: "FilterProcessor"
enable: true # enable
keywordsInclude: [] # keywords you want to filter out
ratingsInclude: [] # ratings you want to filter out
territoriesInclude: [] # territories you want to filter out (territory for Apple e.g. TWN)
- You only need to add the
FilterProcessor
setting in theprocessors
section of/config/apple.yml
or/config/android.yml
.
Add Automatic Translation Feature
Automatically translate reviews not in your language using Google Cloud Translation API (charges apply).
Please first ensure that the GCP Project of the Service Account created in Step 2 has the “Cloud Translation API” enabled
apple.yml
andandroid.yml
have some different settings
apple.yml:
1
2
3
4
5
6
- GoogleTranslateProcessor: # Google Translate Processor, will translate review text to your language, you can remove whole block if you don't need it.
class: "GoogleTranslateProcessor"
enable: true # enable
googleTranslateAPIKeyFilePath: './config/XXXX-XXXX.json' # Google Translate API Service Account Credential .json File Path
googleTranslateTargetLang: 'zh-TW' # Translate to what Language
googleTranslateTerritoriesExclude: ["TWN","CHN"] # Review origin Territory that you don't want to translate. (territory for Apple e.g. TWN)
./config/XXXX-XXXX.json
(Step 2. TheXXXX-XXXX.json
Service Account key file name saved from GCP IAM)
android.yml:
1
2
3
4
5
6
- GoogleTranslateProcessor: # Google Translate Processor, will translate review text to your language, you can remove whole block if you don't need it.
class: "GoogleTranslateProcessor"
enable: true # enable
googleTranslateAPIKeyFilePath: './config/XXXX-XXXX.json' # Google Translate API Service Account Credential .json File Path
googleTranslateTargetLang: 'zh-TW' # Translate to which language
googleTranslateTerritoriesExclude: ["zh-Hant","zh-Hans"] # Review origin territory (language) that you don't want to translate. (language for android e.g. zh-Hant, en)
./config/XXXX-XXXX.json
(Step 2. The Service Account key file nameXXXX-XXXX.json
saved from GCP IAM)
Complete Example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
platform: 'android'
packageName: '' # Android App Package Name
keyFilePath: '' # Google Android Publisher API Service Account Credential .json File Path
playConsoleDeveloperAccountID: '' # Google Console Developer Account ID
playConsoleAppID: '' # Google Console App ID
processors:
- FilterProcessor:
class: "FilterProcessor"
enable: true # enable
keywordsInclude: [] # keywords you want to filter out
ratingsInclude: [] # ratings you want to filter out
territoriesInclude: [] # territories you want to filter out (territory for Apple e.g. TWN)
- GoogleTranslateProcessor: # Google Translate Processor, will translate review text to your language, you can remove whole block if you don't need it.
class: "GoogleTranslateProcessor"
enable: true # enable
googleTranslateAPIKeyFilePath: '' # Google Translate API Service Account Credential .json File Path
googleTranslateTargetLang: 'zh-TW' # Translate to what language
googleTranslateTerritoriesExclude: ["zh-Hant","zh-Hans"] # Review origin territory (language) that you don't want to translate. (language for android e.g. zh-Hant, en)
- SlackProcessor: # Slack Processor, resend App Review to Slack.
class: "SlackProcessor"
enable: true # enable
slackTimeZoneOffset: "+08:00" # Review Created Date TimeZone
slackAttachmentGroupByNumber: "1" # 1~100, how many review messages in 1 Slack message.
slackBotToken: "" # Slack Bot Token, send Slack message through Slack Bot.
slackBotTargetChannel: "" # Slack Bot Token, send Slack message through Slack Bot. (recommended, first priority)
slackInCommingWebHookURL: "" # Slack Incoming WebHook URL, send Slack message through Incoming WebHook, not recommended, deprecated.
After adjustment, save the .yml
file following the steps below:
After editing, click the “Commit changes…” button at the top right corner.
Select “Commit directly to the main branch”
Click “Commit changes”
Execution Parameter Settings
You can edit the ZReviewTender.yml
file to set execution parameters.
Repo -> Actions
Click “ZReviewTender”
Click on
ZReviewTender.yml
Click the top right corner “🖊️Edit”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
name: ZReviewTender
on:
workflow_dispatch:
schedule:
- cron: "15 */6 * * *" #check new review every 6 hours.
jobs:
ZReviewTender:
runs-on: ubuntu-latest
steps:
- name: ZReviewTender Automatic Bot
uses: ZhgChgLi/ZReviewTender@main
with:
command: '-r'
Adjust Check Frequency (How often to crawl and repost new reviews?)
Adjust the settings in cron: "15 */6 * * *"
.
Parameters are expressed using Crontab. You can use the following website to generate the desired settings:
Adjust Execution Script
Adjust the setting value in command: "-r"
.
-r
: Run both Android and Apple (iOS) review checks simultaneously-a
: Run Apple (iOS) review check on paper-g
: Run only Android lint checks
Adjustment completed:
After editing, click the “Commit changes…” button at the top right corner.
Choose “Commit directly to the main branch”
Click “Commit changes”
Temporarily Stop Checking
Repo -> Actions
Choose “ZReviewTender”
Click the “…” on the right side
Select “Disable workflow”
Bug Reports and Feature Suggestions
If you have any feature suggestions, questions, or bugs, please create an Issue in the above Github Repo. Thank you.
Advanced Usage and Development Stories
If you have any questions or feedback, feel free to contact me.
This post was originally published on Medium (View original post), and automatically converted and synced by ZMediumToMarkdown.