[Quick Start! ] Github Action x ZReviewTender Free and Fast Deployment of Your App Store Review Monitoring Bot
Create a free, stable, and secure App review bot in three simple steps to keep track of the latest user reviews in real-time.
ZReviewTender — is an open-source App store review bot I created in 2022/08. It automatically fetches user reviews from the iOS App Store and Android Google Play Store and forwards them to a specified Slack Channel.
Additionally, it allows you to specify review fetching rules, integrate with Google Translate, Asana, Google Sheets, and supports custom operations.
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 the machines provided by Github to execute CI/CD and automation scripts.
- Using your own machines (Github Runner): No special costs, only maximum execution numbers, concurrency limits, and some API short-term maximum request limits.
- Using Github-provided machines:
GitHub Free provides basic 500 MB Storage (for CI/CD Artifact) and 2,000 Minutes of execution time per month.
Note that due to machine cost issues:
- If using Github's Windows machines, the consumed minutes equal actual minutes x 2
- If using Github's macOS machines, the consumed minutes equal actual minutes x 10
For detailed pricing calculations, please refer to the official pricing calculator.
ZReviewTender Minutes per month consumption: approximately 120 minutes
Only needs to run on basic billing Linux, each execution takes about ≤ 1 minute, by default it runs every 6 hours, spending 4 minutes a day, approximately 120 minutes a month, the free quota is more than enough.
ZReviewTender Storage consumption: 0
No use of Artifact storage, so there is no storage cost.
The internal communication software used by the company, a Slack App will be created and through this Slack App identity, the App Store review notifications will be forwarded to the designated channel.
We use Github Action to execute the ZReviewTender script and forward the results to Slack. The Github Repo (Action) is just used as a carrier, so even if your main project does not use Github for hosting, you can still easily complete the ZReviewTender deployment by following the steps below. 🎉🎉🎉
I have successfully deployed it in different Apps of 5 different companies and it has been running stably and for free for at least 2 years.
- Free: ZReviewTender is an open-source free service I created, deployed on Github Action using the free quota is more than enough. You don't need to spend money every month to buy App Review Bot or similar monthly review bot services.
- Secure: The credentials and keys used to fetch reviews are securely stored in your Github Private Repo, no one else has access to them. You no longer need to risk leaking important credentials and keys by uploading them to third-party services; ZReviewTender is an open-source project, and all operations can withstand public scrutiny.
- Reliable: ZReviewTender uses the latest official API to fetch review information, which is more accurate, stable, and reliable compared to other services that used to fetch reviews via RSS.
If this project has helped you, feel free to sponsor me a cup of coffee, thank you.
The entire setup process takes about 30 minutes, but only needs to be set up once. Unless the credentials and keys are changed, it can run stably and for free forever. 🚀🚀🚀🚀🚀
If your organization already has a Slack App with chat:write
or similar message sending permissions, you can reuse it without creating a new one.
Click "Create New App" in the upper right corner.
- Select: From scratch
- Enter App Name:
ZReviewTender
or customize the Slack App name - Select the target Slack Workspace: Make sure you have the permission to add a Slack App in the chosen Workspace.
- Create App
After creating the Slack app, go to the "OAuth & Permissions" tab to set up Scopes.
- Select "OAuth & Permissions"
- Scroll down to find the Scopes Section
- Sequentially add the three necessary Scopes for the ZReviewTender Slack App:
chat:write
chat:write.public
links:write
Go back to the Install App tab to install the Slack App into 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, note it down for later use.
- Sidebar -> Channels -> Create -> Create channel
- Name: Enter the desired channel name
Visibility:
- Public: Open to everyone, no further action needed.
- Private: Private channel, ⭐️⭐️⭐️ you need to add the newly created Slack App:
- Click on the top #channel name
- Click "Settings"
- Click "Add an App"
- Search for the name of the Slack App you just created
- Click "Add"
A prompt will appear in the channel indicating success. ZReviewTender joined.
⭐️⭐️⭐️There is a known Slack Bug here. The newly created Slack App might not appear in the search immediately; you may need to wait a while. You can use a Public Channel first, as Public Channels do not require adding the Slack App to use.
The final and most important step is to get the Channel ID for later configuration.
- Click on the top #channel name
- At the bottom of About, there is a Channel ID information
- Note down the
Channel ID
for later configuration
Slack steps completed.
— — —
You can edit the Slack App name and icon in "Basic Information" -> "Display Information":
Remember to click "Save Changes" at the bottom right corner to save your changes.
If there are new additions to OAuth & Permissions Scopes, you need to click "reinstall your app" to reinstall it for the changes to take effect:
iOS is relatively easier, we only need to get the following four pieces of information from App Store Connect:
- App Store Connect -> Keys -> App Store Connect API
- Note down the
Issuer ID
for later configuration
Click the "+" button to add:
- Name:
ZReviewTender
- Access:
App Manager
Key ID
for later configuration- Click "Download API Key" to save and download the "
AuthKey_XXXXXXXXXX.p8
" file for later configuration.
App ID can be found in App Store Connect -> App Store -> General -> App Information -> App ID
.
- Note down the
App ID
for later configuration
Android is more complex, requiring you to first enable the API & create a Service Account in the Google Cloud Project associated with the App project, and then add the Service Account to Google Play Console and grant App permissions.
Select the Google Cloud Project associated with the App project or create a new Project.
- Search for "Android Developer API" and click to enter
- Select "Enable"
[Optional] You can also enable "Cloud Translation API":
- After enabling, you can use the same Service Account credentials to integrate the review auto-translation feature
- Please note: Cloud Translation API is not free, and there will be charges for language detection and translation!
- Please note: Cloud Translation API is not free, and there will be charges for language detection and translation!
- Please note: Cloud Translation API is not free, and there will be charges for language detection and translation!
- Search for "IAM"
- Select "IAM & Admin"
- Select "Service Account"
- Select "Create Service Account"
- Service Account Name: Enter a name, such as "
ZReviewTender
" or "Google Play Review Bot
" - Service Account ID: Auto-filled, no need to change unless necessary. This will also be your Service Account Email.
- Click "Done"
Note down the Service Account Email address:
- The list page will also display the Service Account Email address.
- Note down the
Service Account Email
for later use
Create Service Account Key:
- Refresh the list page and click on the newly created Service Account.
- Click "Add Key"
- Click "Create new key"
- Select "JSON" as the key type.
- Click "Create"
- Save the downloaded
XXXX-XXXX.json
file for later use
- Click "Users and permissions"
- Click "Invite new users" on the right
- Enter the
Service Account Email
noted earlier in the Email address field. - App permissions -> Add app
- Add the target app for fetching reviews.
- Click "Invite user" to complete the invitation, no verification needed.
Obtain Google Play Console Developer ID & App ID & Package Name:
- Click on the target app to enter the Dashboard.
- Note down the
Package Name
for later use
Copy the Dashboard URL and find:
-
In the URL, /developers/
XXX
is yourDeveloper ID
. Note down this number for later use. -
In the URL, /app/
XXX
is yourApp ID
. Note down this number for later use.
Credential setup complete.
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 steps.
https://github.com/ZhgChgLi/ZReviewTender-deploy-with-github-action
- Repository name: Enter the Repo name you want
- 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 ⭐️⭐️⭐️
- Click "Create repository"
The author, contributors, and ZhgChgLi of ZReviewTender are not responsible for any loss caused by your use of ZReviewTender.
Wait for the Repository to be created:
Confirm again that it is 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 ⭐️⭐️⭐️
- Private: Since the Repo will store access keys, be sure to set it as a Private Repo ⭐️⭐️⭐️
After the Repo is created, due to Github security settings, you need to go to Repo Settings to allow Github Actions to execute.
- Repo -> Settings
- Select "Actions" -> "General"
- Actions permissions select "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"
- Select "Run workflow"
- Click "Run workflow"
- Refresh the page
If an ❌ Error appears: Please recheck the Github Actions permissions settings mentioned earlier.
After successful initialization, two new directories will appear on the Repo homepage:
- Enter the
/config
directory - Top right corner "Add file" -> "Upload files"
- Upload the GCP Service Account
XXXX-XXXX.json
(for Android) and the App Store ConnectAuthKey_XXXXXXXXXX.p8
(for iOS) saved in Step 2 together. - Wait for the upload to complete
- Select "Commit directly to the main branch"
- Click "Commit changes"
- Enter the
config/
directory, click on theapple.yml
file
- Click on the top right "🖊️ Edit"
Edit apple.yml
, paste the following content and fill in the information noted down in the previous steps:
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 In-Coming WebHook URL, Send slack message through In-Coming WebHook, not recommended, deprecated.
appStoreConnectP8PrivateKeyFilePath
: Enter./config/AuthKey_XXXXXXXXXX.p8
(Step 2. App Store Connect savedAuthKey_XXXXXXXXXX.p8
file name)appStoreConnectP8PrivateKeyID
: Step 2. App Store Connect notedPrivate Key ID
appStoreConnectIssueID
: Step 2. App Store Connect notedIssuer ID
appID
: Step 2. App Store Connect noted target App'sApp ID
slackBotToken
: Enter Step 1. notedSlack App Bot User OAuth Token
slackBotTargetChannel
: Enter Step 1. noted targetChannel ID
- After editing, click on the top right "Commit changes…"
- Select "Commit directly to the main branch"
- Click "Commit changes"
- Enter the
config/
directory and click on theandroid.yml
file
- Click on the "🖊️ Edit" button in the upper right corner
Edit android.yml
, paste the following content, and fill in the information noted down from the previous steps:
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 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 In-Coming WebHook URL, Send slack message through In-Coming WebHook, not recommended, deprecated.
packageName
: Step 2. Google Play Console backend notedPackage Name
keyFilePath
: Enter./config/XXXX-XXXX.json
(Step 2. GCP IAM savedXXXX-XXXX.json
Service Account key file name)playConsoleDeveloperAccountID
: Step 2. Google Play Console backend notedDeveloper ID
playConsoleAppID
: Step 2. Google Play Console backend notedApp ID
slackBotToken
: Enter Step 1. notedSlack App Bot User OAuth Token
slackBotTargetChannel
: Enter Step 1. notedChannel ID
to send to
- After editing, click on the "Commit changes…" button in the upper right corner
- Choose "Commit directly to the main branch"
- Click "Commit changes"
Setup complete! 🚀🚀🚀🚀
We can manually run it once to confirm the setup is correct.
- Repo -> Actions
- Select "ZReviewTender"
- Select "Run workflow"
- Click "Run workflow"
- Refresh the page
Waiting for ReviewTender
Action to complete:
If ❌ Error occurs, or Slack Channel does not receive the activation message: please recheck the previous configuration file content for correctness.
Now you can rely on this free and reliable App review bot to keep track of the latest user reviews at all times!
If this project has helped you, feel free to sponsor me a cup of coffee, thank you.
Only forward reviews that meet the criteria.
- 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)
- Just add the
FilterProcessor
settings in theprocessors
section of/config/apple.yml
or/config/android.yml
.
Automatically translate reviews that are not in your language using the Google Cloud Translation API (costs may apply).
- Please ensure that the GCP Project associated with the Service Account created in Step 2 has the "Cloud Translation API" enabled
- The settings for
apple.yml
andandroid.yml
are slightly different
apple.yml:
- 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. GCP IAM savedXXXX-XXXX.json
Service Account key file name)
android.yml:
- 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: ["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. GCP IAM savedXXXX-XXXX.json
Service Account key file name)
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 In-Coming WebHook URL, Send slack message through In-Coming WebHook, not recommended, deprecated.
Save the adjusted file as .yml
following these steps:
- After editing, click "Commit changes…" in the upper right corner.
- Select "Commit directly to the main branch."
- Click "Commit changes."
You can edit the ZReviewTender.yml
file to set execution parameters.
- Repo -> Actions
- Click "ZReviewTender"
- Click "
ZReviewTender.yml
" - Click the top right "🖊️ Edit"
name: ZReviewTender
on:
workflow_dispatch:
schedule:
- cron: "15 */6 * * *" #check new review every 6 hour.
jobs:
ZReviewTender:
runs-on: ubuntu-latest
steps:
- name: ZReviewTender Automatic Bot
uses: ZhgChgLi/ZReviewTender@main
with:
command: '-r'
Adjust the settings in cron: "15 */6 * * *"
.
Parameters use Crontab notation, you can use the following website to generate the desired settings:
Adjust the settings in command: "-r"
.
-r
: Check reviews for both Android and Apple (iOS)-a
: Only check reviews for Apple (iOS)-g
: Only check reviews for Android
After adjustments:
- After editing, click the top right "Commit changes…"
- Select "Commit directly to the main branch"
- Click "Commit changes"
- Repo -> Actions
- Select "ZReviewTender"
- Click the right "…"
- Select "Disable workflow"
If you have any feature suggestions or issues, please go to the above Github Repo to create an Issue report, thank you.