Requirements
To use TeachMetrics, you need:
- A Teachable school on the Growth, Advanced, or Unlimited plan
- Your Teachable API key (we'll show you how to get this)
If you choose the self-hosted option, you also need:
- A web host running PHP 8.4+ and MySQL 8 — ordinary shared hosting works; no VPS or container platform required
- HTTPS on your domain (most hosts include this via Let's Encrypt)
- The ability to run a single cron job (TeachMetrics schedules everything else itself)
Note: TeachMetrics requires API access, which is only available on Teachable's Growth plan and above. The Basic plan does not include API access.
Managed vs Self-Hosted
TeachMetrics is the same application either way — the difference is who runs it:
- Managed hosting — We install and run TeachMetrics for you on your own
yourschool.teachmetrics.cosubdomain, with a dedicated database, backups, and updates handled for you. You just connect your Teachable API key. - Self-hosted — You download TeachMetrics and install it on your own web host. Your data lives entirely on infrastructure you control, and we never see it.
See pricing for what each option includes.
Installation
Managed hosting: there is nothing to install. After you sign up, we set up your instance and send you your subdomain and login — skip ahead to API Key Setup.
Self-hosted: TeachMetrics installs like classic web software — upload, then a guided web installer does the rest:
Upload the App
Unpack your TeachMetrics download and upload it to your web host, with the app's public/ directory as your site's document root.
Create a MySQL Database
Create an empty MySQL 8 database and a database user in your hosting control panel. Have the credentials handy.
Enter the Setup Token
Visit your domain in a browser. For security — the installer is reachable by anyone until setup finishes — TeachMetrics asks for a one-time setup token so only you can create the admin account. On your first visit it writes the token to storage/install-token.txt; open that file in your hosting file manager (e.g. cPanel → File Manager) or over SSH and paste its contents. It's deleted automatically once install completes.
Run the Install Wizard
The wizard then walks you through the database connection, creating your admin account, and connecting your Teachable API key.
Add the Cron Job
Add the single cron entry the wizard shows you. It drives TeachMetrics' internal scheduler — data syncs, email sending, and maintenance all run from this one job.
API Key Setup
To connect TeachMetrics to your Teachable school, you'll need your API key.
Finding Your API Key
Log into Teachable
Go to your Teachable school admin dashboard.
Navigate to Settings
Click on Settings in the left sidebar, then select API Keys.
Copy Your API Key
If you don't have an API key, click "Generate API Key". Copy the key to your clipboard.
Enter in TeachMetrics
Log into your TeachMetrics dashboard, go to Settings, and paste your API key. TeachMetrics tests the connection live before saving.
Keep your API key secure! Your API key provides access to your school data. Never share it publicly. TeachMetrics encrypts your key at rest with AES-256-GCM, and you can rotate it from Settings at any time.
First Sync
After connecting your API key, TeachMetrics syncs your school's history. Small schools finish in minutes; schools with years of history and thousands of students can take an hour or more — the sync runs in the background and you can watch its progress from the dashboard.
During the sync, TeachMetrics fetches:
- All courses and their details
- Student enrollments and progress
- Transaction history and revenue data
- Pricing plans and coupons
Your data, your server: everything TeachMetrics stores lives in the app's own MySQL database — on your web host if you self-host, or in your dedicated managed database. After the first sync, the scheduler and Teachable webhooks keep it current automatically.
Dashboard
The dashboard gives you an at-a-glance view of your school's performance:
- Revenue Overview - Total revenue, monthly trends, and growth rates
- Student Metrics - Active students, new enrollments, completion rates
- Course Performance - Top-performing courses by revenue and engagement
- Recent Activity - Latest enrollments and transactions
Analytics
Dive deeper into your school's data with our analytics tools:
Revenue Analytics
Track revenue over time, compare periods, and identify trends. See revenue breakdowns by course, pricing plan, and payment type.
Student Analytics
Understand your student base with cohort analysis, engagement metrics, and progress tracking. Identify at-risk students before they drop out.
Course Analytics
See which courses drive the most revenue and engagement. Track completion rates and identify where students get stuck.
Email Campaigns
Because TeachMetrics knows your students and their activity, it can also talk to them:
- Campaigns - Compose and send email to segments of your students, built with a visual template editor
- Segments - Target by course, enrollment, engagement, and purchase behavior
- Automations - Trigger email from school events, like a new enrollment
Email sends through the SMTP provider you configure in Settings, so it comes from your own address.
Storage buckets (S3 / Wasabi)
Two optional features use S3-compatible object storage (Wasabi works great and is what we run): off-site database backups and inline image uploads for the email template editor. One access key serves both, but they need two separate buckets with opposite visibility:
- Backup bucket — private. Encrypted database dumps land here nightly, rotated automatically (14 daily / 8 weekly / 12 monthly / 10 manual kept).
- Images bucket — public-read. Images you drop into email templates are served from here to your recipients' mail clients. Never reuse the backup bucket for this.
Setup (once, ~10 minutes)
Create an access key
In Wasabi: create a user (e.g. teachmetrics-bot) with programmatic access and note the access key + secret.
Create the two buckets
A private bucket for backups (e.g. myschool-backups) and a second bucket for email images (e.g. myschool-email-images) with public access allowed. Note the region — both buckets and your endpoint (e.g. https://s3.us-east-2.wasabisys.com) must match.
Attach the two policies to the user
Copy these exactly, substituting your bucket names. The backup policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BackupObjectAccess",
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::myschool-backups/*"
},
{
"Sid": "BackupBucketList",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::myschool-backups"
}
]
}
The images policy — note the extra s3:PutObjectAcl: TeachMetrics marks each uploaded image public-read, and without this action uploads fail with Access Denied:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EmailImagesObjectAccess",
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::myschool-email-images/*"
},
{
"Sid": "EmailImagesBucketList",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::myschool-email-images"
}
]
}
Enter and test in TeachMetrics
Backups: Settings → Export & Backup — key, secret, endpoint, region, backup bucket → Test connection. Images: Settings → Email → Inline image uploads — just the images bucket name → Test upload, which uploads a tiny image, fetches it anonymously the way a mail client would, and cleans up after itself.
Both tests green? You're done: nightly encrypted backups go off-site with automatic rotation, and the template editor accepts image drag & drop.
AI Insights
Ask questions about your school in plain English — "which courses had the most refunds this quarter?" — and TeachMetrics answers from your own data. Self-hosted operators bring their own AI provider key; managed hosting can include AI as an add-on.
Sandboxed by design: AI queries run against a read-only view of your analytics data, isolated from the rest of the application.
Data Exports
Export your data for use in other tools:
- CSV Export - Download reports as CSV files for spreadsheets
- Direct database access - Self-hosted operators own the MySQL database outright and can query or back it up with standard tools
Webhook Setup
TeachMetrics runs on a real server, so it receives Teachable webhooks directly — no relay services or third-party glue. Setup takes a minute:
Get Your Webhook URL
In TeachMetrics, go to Settings to find your installation's unique webhook URL.
Add to Teachable
In your Teachable admin, go to Settings > Webhooks and add your TeachMetrics URL.
Select Events
Enable the events you want to track: enrollments, progress updates, transactions, etc.
How Updates Work
With webhooks registered, your data stays current automatically:
- Instant updates - Webhook events are applied the moment Teachable sends them
- Lecture-by-lecture progress - See exactly where students are in your courses
- Notifications - Get alerts for new enrollments and completions
- Scheduled reconciliation - The built-in scheduler also re-checks against the Teachable API, so a missed webhook can't leave your numbers stale
Update Check & Telemetry
Once a day, the built-in scheduler asks teachmetrics.co whether a newer version or a security advisory exists. That request carries exactly four small facts — and this table is the complete list (License Agreement §8 commits us to updating this disclosure before the payload ever changes):
| Field | Example | Purpose | Retention |
|---|---|---|---|
| License ID | TM-XXXX-XXXX-XXXX | Associate the install with a purchase | Aggregated in place while the license exists; deleted on request |
| Install ID | Random identifier, generated at install — derived from nothing in your data | Distinguish installations (e.g. staging vs production) | Same as above |
| Version | 1.0.0 | Know which versions are in use; tell you when an update or advisory applies | Same as above |
| Timestamp | Request time | Last-seen bookkeeping | Only first-seen/last-seen are kept — there is no per-ping log |
Our web server additionally sees ordinary connection metadata (your server's IP address) in standard request logs with routine rotation. The request never includes student records, course data, analytics, database contents, credentials, or anything else about your school.
- Nothing depends on it. If the request fails or teachmetrics.co is unreachable or blocked, your instance runs exactly as before — there is no kill switch (License Agreement §9a). You only stop hearing about updates.
- You can turn it off in Settings → Updates & telemetry. The same panel shows precisely what was sent and when, and what came back.
- What comes back: the latest available version and any published security advisories — shown as a notice on your dashboard. Published advisories always appear at the security advisories page, the designated location referenced by the License Agreement.
Need help? Reach us through the contact page and we'll help you get set up.