How to Capture Social Proof Screenshots for Marketing and Sales
Social proof works best when it's visual. A screenshot of a real tweet, a G2 review, or a LinkedIn post carries more weight than a copied quote. The image shows the platform, the username, the timestamp — it can't be fabricated in the same way text can.
The problem: manually screenshotting every testimonial, review, and mention is slow. And as your product grows, the volume of social proof grows faster than you can keep up with manually.
A screenshot API solves this by capturing visual evidence on-demand, automatically, as part of your marketing workflow.
What to Screenshot
Review Site Profiles
Capture your G2, Capterra, Trustpilot, or ProductHunt profile page:
import requests
def capture_review_page(review_url: str, output_path: str, api_key: str):
resp = requests.get(
"https://hermesforge.dev/api/screenshot",
params={
"url": review_url,
"width": 1440,
"format": "png",
"full_page": "false", # viewport-only captures the star rating + review count
"wait_for": "networkidle",
"key": api_key
},
timeout=30
)
resp.raise_for_status()
with open(output_path, "wb") as f:
f.write(resp.content)
# Example
capture_review_page(
"https://www.g2.com/products/your-product/reviews",
"assets/g2-reviews.png",
"YOUR_API_KEY"
)
Run this weekly. Your landing page shows a fresh screenshot of your current G2 rating — automatically updating as new reviews come in.
Individual Review Pages
For a specific review you want to highlight, screenshot the individual review URL:
reviews = [
{
"url": "https://www.g2.com/reviews/12345678",
"label": "enterprise-review"
},
{
"url": "https://www.capterra.com/reviews/87654321",
"label": "smb-review"
}
]
for review in reviews:
capture_review_page(
review["url"],
f"assets/social-proof/{review['label']}.png",
api_key
)
Twitter/X Mentions
Public tweet URLs return screenshottable pages:
tweet_urls = [
"https://twitter.com/username/status/12345678901234567",
"https://twitter.com/username/status/98765432109876543"
]
for i, url in enumerate(tweet_urls):
capture_review_page(url, f"assets/tweets/tweet-{i+1}.png", api_key)
Twitter pages are JavaScript-heavy — wait_for=networkidle is important for tweet screenshots to render fully.
LinkedIn Posts
Public LinkedIn posts with testimonials can be captured the same way:
capture_review_page(
"https://www.linkedin.com/posts/username_activity-12345678901234567-abcd",
"assets/linkedin-testimonial.png",
api_key
)
Batch Capture Pipeline
For capturing a library of social proof assets in one run:
import json
import os
import time
import requests
def batch_capture_social_proof(sources_file: str, output_dir: str, api_key: str):
with open(sources_file) as f:
sources = json.load(f)
os.makedirs(output_dir, exist_ok=True)
results = []
for source in sources:
slug = source["slug"]
url = source["url"]
output_path = os.path.join(output_dir, f"{slug}.png")
if os.path.exists(output_path):
print(f"Cached: {slug}")
results.append({"slug": slug, "status": "cached", "path": output_path})
continue
try:
resp = requests.get(
"https://hermesforge.dev/api/screenshot",
params={
"url": url,
"width": source.get("width", 1280),
"format": "png",
"wait_for": "networkidle",
"key": api_key
},
timeout=30
)
resp.raise_for_status()
with open(output_path, "wb") as f:
f.write(resp.content)
print(f"Captured: {slug}")
results.append({"slug": slug, "status": "ok", "path": output_path})
except Exception as e:
print(f"Failed: {slug} — {e}")
results.append({"slug": slug, "status": "failed", "error": str(e)})
time.sleep(1) # Polite rate — 1 req/sec
return results
sources.json format:
[
{"slug": "g2-profile", "url": "https://www.g2.com/products/yourproduct/reviews", "width": 1440},
{"slug": "tweet-power-user", "url": "https://twitter.com/user/status/12345678901234567", "width": 600},
{"slug": "linkedin-cto", "url": "https://www.linkedin.com/posts/...", "width": 800},
{"slug": "capterra-profile", "url": "https://www.capterra.com/p/123456/yourproduct/", "width": 1440}
]
Using Screenshots in Marketing
Landing Page Social Proof Section
Reference the captured screenshots as static images in your landing page:
<section class="social-proof">
<h2>What customers are saying</h2>
<div class="proof-grid">
<img src="/assets/social-proof/tweet-power-user.png" alt="Customer tweet" loading="lazy">
<img src="/assets/social-proof/g2-profile.png" alt="G2 reviews" loading="lazy">
<img src="/assets/social-proof/linkedin-cto.png" alt="LinkedIn review" loading="lazy">
</div>
</section>
Sales Deck Automation
For sales teams that build custom decks per prospect, capture fresh social proof screenshots before each deck generation:
def prepare_sales_deck_assets(industry: str, api_key: str) -> dict:
"""Capture fresh social proof screenshots for a specific industry vertical."""
industry_sources = {
"saas": [
{"slug": "g2-saas-review", "url": "https://www.g2.com/reviews/saas-review-id"},
{"slug": "linkedin-saas-cto", "url": "https://www.linkedin.com/posts/saas-cto-post"}
],
"ecommerce": [
{"slug": "capterra-ecom", "url": "https://www.capterra.com/reviews/ecom-review-id"}
]
}
sources = industry_sources.get(industry, [])
assets = {}
for source in sources:
resp = requests.get(
"https://hermesforge.dev/api/screenshot",
params={"url": source["url"], "width": 1280, "format": "png", "key": api_key},
timeout=30
)
if resp.status_code == 200:
assets[source["slug"]] = resp.content
return assets
Email Campaigns
Embed social proof screenshots as linked images in email:
<img src="https://yoursite.com/assets/social-proof/g2-profile.png"
alt="4.8 stars on G2"
width="600"
style="display:block; max-width:100%;">
Host the screenshots as static files and reference them by URL. Email clients render images from URLs natively — no inline base64 needed.
Refresh Strategy
| Asset type | Refresh frequency | Reason |
|---|---|---|
| G2 / Capterra profile | Weekly | Star rating and review count change as new reviews come in |
| Individual review pages | One-time | Review content doesn't change |
| Tweet screenshots | One-time | Tweet content doesn't change |
| LinkedIn posts | One-time | Post content doesn't change |
Run the batch pipeline weekly for profile pages. Cache individual review/post screenshots indefinitely — they're static after first capture.
Handling Paywalls and Login Walls
Review platforms often show partial content to unauthenticated visitors. If a review page requires login:
- Use the public listing URL (e.g., the profile overview page) instead of individual review pages
- Use the embed URL if the platform provides one
- Screenshot the review widget — many review platforms offer embeddable widgets at public URLs that render without auth
The screenshot API captures what a logged-out browser would see. Design your social proof library around publicly accessible pages.
Hermesforge Screenshot API handles JavaScript-heavy review sites and social platforms. Get your API key — 50 screenshots/day free, no signup.