Screenshot shows demo data 😎
A private TRMNL plugin that displays RevenueCat metrics including MRR (Monthly Recurring Revenue) and total revenue for the last 28 days, with per-project/app breakdowns.
Inspired by jazzychad's TRMNL RevenueCat plugin but with support for multiple projects.
- 📊 Monthly Recurring Revenue (MRR) - last 28 days
- 💰 Total Revenue - last 28 days
- 📱 Per-project/app metrics breakdown
- 🔐 Secure password authentication via header
- 💱 Multi-currency support (USD, EUR) with live exchange rates
- Log in to your RevenueCat dashboard
- Navigate to each project
- For each project, go to Settings → API Keys
- Create a new V2 Read-Only API Key for each project
- Copy all API keys (format:
sk_xxxxxxxxxxxxx)
This is a Next.js application that can be deployed to Vercel, Netlify, or any platform supporting Next.js.
Deploy to Vercel:
npm install
npm run build
vercel deployCreate a .env.local file in your project root when testing, or configure these in Vercel, ... UI when deployed:
# Authentication password for TRMNL requests
TRMNL_PASSWORD=your_secret_password_here
# Array of RevenueCat API keys (one per project)
REVENUECAT_API_KEYS=["sk_project1_key","sk_project2_key","sk_project3_key"]Once deployed, configure your TRMNL device:
- Go to your TRMNL dashboard
- Add a new Private Plugin
- Set the plugin URL to:
https://your-deployment-url.vercel.app/api/trmnl- For EUR instead of USD, use:
https://your-deployment-url.vercel.app/api/trmnl?currency=EUR
- For EUR instead of USD, use:
- Add a Custom Header:
Authorization=Bearer your_secret_password_here
Endpoint: GET /api/trmnl
Authentication:
- Header:
Authorization: Bearer <your_trmnl_password>
Query Parameters:
currency(optional): Currency for the response. Supported values:USD(default),EUR- Example:
/api/trmnl?currency=EUR
- Example:
sort(optional): Sort order for projects. Supported values:name(default),mrr,revenuename: Alphabetical by project namemrr: By Monthly Recurring Revenue (descending)revenue: By total revenue (descending)- Example:
/api/trmnl?sort=mrr - Example with currency:
/api/trmnl?currency=EUR&sort=revenue
demo(optional): Enable demo mode with mock data for screenshots/testing. Set totrueto enable.- Example:
/api/trmnl?demo=true - Example with currency:
/api/trmnl?demo=true¤cy=EUR
- Example:
Response Format (USD):
{
"total_mrr": "$15.00",
"total_revenue": "$119.00",
"projects": [
{
"name": "My lovely project",
"mrr": "$15.00",
"revenue": "$119.00"
}
]
}Response Format (EUR with ?currency=EUR):
{
"total_mrr": "€13.80",
"total_revenue": "€109.48",
"projects": [
{
"name": "My lovely project",
"mrr": "€13.80",
"revenue": "€109.48"
}
]
}Currency Conversion:
- Conversions use live exchange rates from exchangerate-api.com
- Rates are cached for 1 hour to improve performance
- If the exchange rate API is unavailable, a fallback rate is used
- RevenueCat reports in USD, so USD values are the source of truth
Use these variables in your TRMNL template:
{{ total_mrr }}- Total Monthly Recurring Revenue across all projects (last 28 days){{ total_revenue }}- Total revenue across all projects (last 28 days){{ projects }}- Array of project metrics with:{{ name }}- Project/App name{{ mrr }}- Project MRR{{ revenue }}- Project revenue
Multiple optimized layouts are available in the /layouts directory, each designed for different TRMNL screen configurations:
-
shared.html- Reusable Liquid templates (used in the other layouts)- Title bar component
- Metric box templates
- Project table templates
-
full.html- Full screen layout (800x480px)- Two-column metrics grid (MRR + Revenue) if less than 6 projects
- Complete projects table with all data
- Ideal for comprehensive overview
-
half_horizontal.html- Wide, short display- Side-by-side metrics prominently displayed
- Optimized for horizontal half-screen
-
half_vertical.html- Narrow, tall display- Stacked metrics (vertical layout)
- Project count only (no detailed table)
- Optimized for vertical half-screen
-
quadrant.html- Small square display- Single primary metric (MRR)
- Large, readable value
- Compact title bar ("RC")
- Minimal chrome, maximum data visibility
- Add all four layouts in the editor:
- Full Screen → use
full.html - Half Horizontal → use
half_horizontal.html - Half Vertical → use
half_vertical.html - Quadrant → use
quadrant.html
- Full Screen → use
# Install dependencies
npm install
# Run development server
npm run dev
# Build for production
npm run build
# Start production server
npm startRevenueCat V2 API has rate limits. This plugin:
- Makes 1 + N API calls per request (projects list + overview per project)
- Recommended: Set TRMNL refresh to 30+ minutes
401 Unauthorized:
- Check that your password in the Authorization header matches
TRMNL_PASSWORDin.env - Verify the Authorization header format:
Bearer your_password_here - Ensure you're using the correct password (not your RevenueCat API keys)
500 Server Error:
- Check the RevenueCat API status
- Verify all API keys in
REVENUECAT_API_KEYSare valid V2 keys starting withsk_ - Ensure API keys have read permissions for projects and overview metrics
- Check the server logs for detailed error messages
- Verify
REVENUECAT_API_KEYSis properly formatted as a JSON array
No Data Showing:
- Verify your RevenueCat projects have active subscriptions
- Check that all API keys have access to their respective projects
- Ensure you have revenue in the last 28 days
- Check server logs to see if individual projects are failing to load
- Never commit your
.envfile to version control - Use environment variables for all sensitive data (password and API keys)
- All RevenueCat API keys should have read-only permissions
- Use a strong, unique password for
TRMNL_PASSWORD - Consider implementing rate limiting on the endpoint
- In production (Vercel), set environment variables in the deployment settings
