← All Automations
Flow details

App Store Reviews

Monitor App Store and Google Play reviews for your app

v1.0.0 by cluka schedule 0 */4 * * * Lobster workflow available
businessreviewsmobile

What this flow does

  1. **Fetches reviews** - Pulls latest reviews from Apple App Store RSS feed
  2. **Tracks seen reviews** - Only alerts on new ones
  3. **Filters by rating** - Highlights low-rating reviews that need attention
  4. **Sends summaries** - Periodic digest of new reviews

How it runs

1. load-state
storage
2. fetch-app-store
http
3. analyze
evaluate
4. save-state
storage
5. notify-low
notify
6. notify-summary
notify

Inputs & configuration

app_store_id
Apple App Store app ID
play_store_id
Google Play package name
country
Country code for App Store · default: us
alert_on_low_rating
Alert on reviews <= this rating · default: 3
state_file
File to track seen reviews · default: app-reviews-state.json

README configuration

config:
  app_store_id: "123456789"      # Apple App Store ID
  play_store_id: "com.example"   # Google Play package
  country: "us"
  alert_on_low_rating: 3

Schedule & output

Cron: 0 */4 * * *

Every 4 hours: 0 */4 * * *

Lobster workflow

Lobster workflow: app store reviews Monitors Apple App Store reviews for your app (via iTunes RSS feed) Usage:

1. load-state
2. .id.label,
3. find-new
4. save-state
5. report
View workflow YAML
# Lobster workflow: app-store-reviews
# Monitors Apple App Store reviews for your app (via iTunes RSS feed)
#
# Usage:
#   lobster run --file workflow.yaml --args-json '{"app_store_id":"389801252"}'
#   lobster run --file workflow.yaml --args-json '{"app_store_id":"389801252","country":"gb","alert_on_low_rating":"2"}'
#
# Requires: jq, curl
# Note: Google Play scraping omitted — no reliable public API/feed.
#       Use App Store ID only. Find it in the App Store URL:
#       https://apps.apple.com/app/instagram/id389801252 → 389801252

name: app-store-reviews
description: Monitor Apple App Store reviews and alert on new/low-rating reviews

args:
  app_store_id:
    description: "Apple App Store app ID (numeric, from the App Store URL)"
  country:
    description: "Country code for App Store reviews"
    default: "us"
  alert_on_low_rating:
    description: "Alert on reviews with rating <= this value (1-5)"
    default: "3"
  state_file:
    description: "Path to state file tracking seen review IDs"
    default: "/tmp/clawflows-app-reviews-state.json"

steps:
  - id: load-state
    command: cat "${state_file}" 2>/dev/null || echo '[]'

  - id: fetch-reviews
    command: |
      url="https://itunes.apple.com/${country}/rss/customerreviews/id=${app_store_id}/sortBy=mostRecent/json"
      tmpf=$(mktemp)
      curl -sf "$url" > "$tmpf" 2>/dev/null
      if [ ! -s "$tmpf" ]; then
        echo '[]'
        rm -f "$tmpf"
        exit 0
      fi
      jq -c '[.feed.entry // [] | .[] | {
        id: .id.label,
        rating: (.["im:rating"].label // "0" | tonumber),
        title: (.title.label // ""),
        content: ((.content.label // "")[:200]),
        author: (.author.name.label // "unknown"),
        version: (.["im:version"].label // ""),
        updated: (.updated.label // "")
      }]' "$tmpf" 2>/dev/null || echo '[]'
      rm -f "$tmpf"

  - id: find-new
    stdin: $fetch-reviews.stdout
    command: |
      tmpf=$(mktemp)
      cat > "$tmpf"
      seen=$(cat "${state_file}" 2>/dev/null || echo '[]')
      threshold=${alert_on_low_rating}
      jq -c --argjson seen "$seen" --argjson threshold "$threshold" '
        ($seen | if type=="array" then . else [] end) as $seen_list |
        ($seen_list | map({(.):1}) | add // {}) as $idx |
        [.[] | select($idx[.id] == null)] as $new |
        [.[] | select($idx[.id] == null) | select(.rating <= $threshold)] as $low |
        {
          new: $new,
          low: $low,
          seen: ([$seen_list[], ($new[] | .id)] | unique | .[-500:]),
          new_count: ($new | length),
          low_count: ($low | length)
        }
      ' "$tmpf"
      rm -f "$tmpf"

  - id: save-state
    stdin: $find-new.stdout
    command: |
      tmpf=$(mktemp)
      cat > "$tmpf"
      jq '.seen' "$tmpf" > "${state_file}"
      cat "$tmpf"
      rm -f "$tmpf"

  - id: report
    stdin: $save-state.stdout
    command: |
      threshold="${alert_on_low_rating}"
      jq -r --arg thr "$threshold" '
        if .new_count == 0 then
          "No new reviews."
        else
          "📱 \(.new_count) new App Store review(s)\n" +
          if .low_count > 0 then
            "⚠️ \(.low_count) low-rating review(s) (≤\($thr)⭐):\n\n" +
            (.low | map("  \(.rating)⭐ — \(.title)\n  \"\(.content)\"\n  — \(.author) (v\(.version))") | join("\n\n")) +
            "\n\n---\nAll new reviews:\n\n"
          else "" end +
          (.new | map("  \(.rating)⭐ — \(.title)\n  \"\(.content)\"\n  — \(.author) (v\(.version))") | join("\n\n"))
        end
      '

README details

Monitor App Store and Google Play reviews for your app, with alerts on low ratings.

What It Does

  1. **Fetches reviews** - Pulls latest reviews from Apple App Store RSS feed
  2. **Tracks seen reviews** - Only alerts on new ones
  3. **Filters by rating** - Highlights low-rating reviews that need attention
  4. **Sends summaries** - Periodic digest of new reviews

Requirements

CapabilityExample Skills
`exec`http requests, storage

Configuration

config:
  app_store_id: "123456789"      # Apple App Store ID
  play_store_id: "com.example"   # Google Play package
  country: "us"
  alert_on_low_rating: 3

Schedule

Every 4 hours: 0 */4 * * *

Author

Created by Cluka 🦞