---
name: review-social-proof
description: Strategy for App Store and Google Play review solicitation, in-app rating prompts (SKStoreReviewRequest / Google Play In-App Review), testimonial collection, review response templates, and social proof placement for landing pages
context: |
  Stack context: React Native + Expo apps (UcaptionMobile, GifPerfectMobile, SlomoPerfectMobile, AspectPerfectMobile). Desktop apps via Electron (GifPerfect, SlomoPerfect, AspectPerfect). Web SaaS: ucaption.online. Review acquisition is critical for App Store discoverability — apps below 4.0 stars rank poorly.
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
argument-hint: "[product name] [platform: ios|android|desktop|web] [stage: prompt-design|response|landing-page]"
---

# Review & Social Proof Skill

You are an expert on app store review solicitation, social proof collection, and conversion-oriented testimonial placement.

## In-App Rating Prompts — iOS (SKStoreReviewRequest)

### Rules Apple enforces
- Maximum **3 prompts per 365 days** — Apple throttles automatically; calling more often does nothing
- Never prompt on first launch or before the user has experienced value
- Never prompt inside a purchase flow or after a negative event
- Cannot customise the system dialog — only trigger or not trigger

### Optimal trigger moments for each app

**Ucaption Mobile**: prompt after user copies 3rd caption successfully
```typescript
// lib/reviews.ts
import * as StoreReview from 'expo-store-review';
import AsyncStorage from '@react-native-async-storage/async-storage';

export async function maybeRequestReview() {
  const count = parseInt(await AsyncStorage.getItem('caption_copy_count') || '0');
  const prompted = await AsyncStorage.getItem('review_prompted_v1');
  
  if (count >= 3 && !prompted && await StoreReview.hasAction()) {
    await StoreReview.requestReview();
    await AsyncStorage.setItem('review_prompted_v1', '1');
  }
}
```

**GifPerfect Mobile**: prompt after first successful GIF export
**SlomoPerfect Mobile**: prompt after first successful slow-motion export  
**AspectPerfect Mobile**: prompt after user exports 2nd converted file

### Timing rule
- Wait until the user has had a "success moment" — not just opened the app
- At least 30 seconds into the session before triggering
- Never during onboarding

---

## In-App Rating — Android (Google Play In-App Review)

```typescript
import * as StoreReview from 'expo-store-review';

// Same API — expo-store-review abstracts both platforms
// Android: calls Play In-App Review API
// iOS: calls SKStoreReviewRequest
// Always check hasAction() first — returns false in simulators / Expo Go
```

- Google Play has no stated limit but recommends max once per month per user
- The dialog may not always show (Play decides based on user review history) — this is expected behaviour

---

## Asking for Reviews — Web SaaS (ucaption.online)

No native prompt available. Use a modal at the right moment:

```javascript
// Show after user has used the tool 5+ times in this session or across sessions
// Track in localStorage: { captionCount: 0, reviewAsked: false }

function maybeShowReviewPrompt() {
  const state = JSON.parse(localStorage.getItem('review_state') || '{}');
  if (state.captionCount >= 5 && !state.reviewAsked) {
    showModal({
      title: "Enjoying Ucaption?",
      body: "A quick review on the Chrome Web Store helps other creators find us.",
      cta: "Leave a review →",
      ctaUrl: "https://chromewebstore.google.com/detail/[extension-id]/reviews",
      dismiss: "Maybe later"
    });
    localStorage.setItem('review_state', JSON.stringify({...state, reviewAsked: true}));
  }
}
```

---

## Desktop Apps (Electron — GifPerfect, SlomoPerfect, AspectPerfect)

No app store review mechanism. Alternative:
1. After 3rd successful export: show in-app toast: *"GifPerfect working well? Tell others →"* + link to gifperfect.com
2. Link opens a pre-filled tweet or redirect to a Netlify page with a Google Form
3. Collect testimonials on that form → display on landing page

---

## Responding to App Store Reviews

### Responding to positive reviews (4–5 stars)
- Always respond — it signals active development and builds trust with potential downloaders
- Keep it personal, reference something specific if they mentioned it
- Template: *"Thanks [name]! Really happy [specific thing they mentioned] is working well for you. More [relevant feature] coming soon."*
- Do not use templated copy verbatim — Apple reviewers notice and may penalise engagement

### Responding to negative reviews (1–3 stars)
1. Acknowledge the specific issue — never be defensive
2. Offer a resolution path (email or direct fix)
3. Template: *"Sorry to hear this, [name]. [Specific issue] is something we're working on — [current status/workaround]. Reach us at hello@gifperfect.com and we'll sort it out."*
4. After fixing the issue, reply again with: *"Update: [fix deployed]. Please let us know if this resolves it — happy to see your updated review."*

### Appealing fake/spam reviews
- App Store Connect → Activity → Ratings and Reviews → flag for "spam", "off-topic", or "irrelevant"
- Google Play Console → Ratings and reviews → flag → "Spam or fake"
- Response time: Apple usually responds in 3–5 business days

---

## Testimonial Collection

### For desktop + web products
1. Email campaign at day 14 (existing users): *"You've used GifPerfect for 2 weeks — what's been most useful?"* → captures genuine testimonials
2. Add `?source=email-testimonial` to a feedback form URL — track conversion
3. Ask for permission to use the testimonial on the website in the same email

### For mobile apps
- Use in-app modal (after positive review) with second prompt: *"Mind if we share your feedback on our website?"*
- Capture name, role/context ("content creator", "video editor"), and one-line quote
- Store in Supabase `testimonials` table; surface via Netlify function on landing page

---

## Landing Page Social Proof Placement

### Hierarchy (most to least credible)
1. **App Store / Play Store aggregate rating** with star graphic + review count — place in hero or immediately below CTA
2. **Named testimonials with photo** — 3 testimonials minimum before showing this section
3. **"As seen in" / media mentions** — only include real mentions
4. **User count** ("500+ creators use GifPerfect") — only show when accurate; "100+ creators" is better than no count

### Implementation pattern (Netlify + Supabase)
```javascript
// Netlify function: functions/testimonials.js
const { createClient } = require('@supabase/supabase-js');

exports.handler = async () => {
  const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_ANON_KEY);
  const { data } = await supabase
    .from('testimonials')
    .select('name, role, quote, product')
    .eq('approved', true)
    .order('created_at', { ascending: false })
    .limit(6);
  
  return { statusCode: 200, body: JSON.stringify(data) };
};
```

### Rating badge (App Store)
```html
<!-- Place in hero section, below main headline -->
<div class="rating-badge">
  <span class="stars">★★★★★</span>
  <span class="score">4.8</span>
  <span class="label">on the App Store</span>
</div>
```
Only add this once you have ≥10 ratings. Showing "3 ratings" undercuts trust.

---

## Review Velocity Strategy (launch phase)
- **First 30 days**: ask every user personally — email, in-app, direct DM to early access users
- **Target**: 10+ ratings before going public (App Store shows "No ratings yet" below 10 — avoid this)
- **TestFlight testers**: cannot leave App Store reviews (TestFlight builds are separate) — must go to production build
- **Family/friends**: legitimate — encourage them to download from the App Store and leave honest reviews
- Do NOT offer incentives for reviews — App Store ToS violation; can result in removal
