Connect Retool to Thinkific using a REST API Resource with your API key and subdomain configured in the base URL and headers. Build online school admin panels that manage courses, track student enrollments, monitor completion rates, and analyze order revenue — providing operations teams with a custom dashboard that combines Thinkific data in ways the native admin panel does not support.
| Fact | Value |
|---|---|
| Tool | Thinkific |
| Category | Other |
| Method | REST API Resource |
| Difficulty | Beginner |
| Time required | 20 minutes |
| Last updated | April 2026 |
Build a Custom Online School Operations Dashboard on Top of Thinkific
Thinkific's admin interface is designed for individual course creators and provides solid tools for content management, but it shows its limits when operations teams need portfolio-level views, cross-course student analytics, or custom reporting that combines enrollment data with external business metrics. Building reports across twenty courses means twenty separate Thinkific admin page visits — a workflow that does not scale for growing online schools. Retool connects directly to Thinkific's REST API and enables purpose-built operational dashboards that surface exactly the data your team needs in one view.
Thinkific's API uses an API key plus subdomain authentication model. You generate an API key in your school settings, configure it as a custom header in Retool's REST API Resource, and specify your school's unique subdomain in a separate header. This combination authenticates every request to Thinkific's API servers without any OAuth flow. All data surfaces — courses, users (students and instructors), enrollments, orders, bundles, and promotions — are accessible through GET requests that return paginated JSON arrays, easily consumable by Retool's query editor and component system.
For online education businesses with significant course catalogs, the value of this integration compounds quickly. A single Retool dashboard can show completion rates trending by week, identify students who have been enrolled for over 30 days without starting the course, surface courses with unexpectedly high drop-off rates, and combine Thinkific order data with payment processor records for reconciliation. These are views that take hours to construct manually from Thinkific's native reports but are available instantly once the Retool dashboard is built.
Integration method
Thinkific connects to Retool via a REST API Resource using a combination of API key authentication and subdomain-specific base URL. Your Thinkific API key is sent as an X-Auth-API-Key header, and requests target your school's unique subdomain at api.thinkific.com. All queries for courses, users, enrollments, and orders are built visually in Retool's query editor without writing application code. Retool proxies every request server-side, keeping your API key off the browser.
Prerequisites
- A Thinkific account with at least one published course and existing student data
- Thinkific Basic plan or higher (API access requires a paid plan)
- Your Thinkific school subdomain (the part before .thinkific.com in your school URL)
- A Thinkific API key generated from Settings → Code & API → API in your school admin
- A Retool account (Cloud or self-hosted) with permission to create Resources
Step-by-step guide
Generate a Thinkific API key and find your subdomain
Before configuring Retool, gather two pieces of information from your Thinkific school: your API key and your subdomain. Sign in to your Thinkific school admin panel. To find your subdomain, look at your browser's address bar — your Thinkific admin URL is in the format yourschool.thinkific.com/admin. The subdomain is the 'yourschool' portion before .thinkific.com. Write this down as you will need it for the Resource header configuration. To generate an API key, navigate to Settings in the left sidebar of your Thinkific admin panel. Click 'Code & API' or look for an 'API' tab in settings — the location varies slightly depending on your Thinkific plan. On the API settings page, you will find your API key displayed or a 'Reveal' button to show it. Copy the API key value. If no API key exists yet, look for a 'Generate' or 'Regenerate' button. Thinkific provides a single API key per school account — it is not possible to create multiple keys with different scopes. The API key provides full read and write access to your school's data, so treat it with the same security as a password. Store it temporarily somewhere safe — you will paste it into Retool's Resource configuration in the next step. Note that Thinkific API keys do not expire unless explicitly regenerated, but if you regenerate the key, you must update it in Retool immediately to avoid API authentication failures.
Pro tip: Your Thinkific subdomain is case-sensitive and must exactly match what appears in your school's URL. Custom domains (e.g., courses.yourcompany.com) do not replace the subdomain — your original .thinkific.com subdomain is still required for API requests.
Expected result: Your Thinkific API key is copied and your school subdomain is noted. Both values are ready to configure in the Retool REST API Resource.
Create a REST API Resource with Thinkific headers
In Retool, navigate to the Resources tab from your organization's homepage sidebar. Click '+ Create new', scroll through the connector list, and select 'REST API'. Set the Name to 'Thinkific API'. Set the Base URL to https://api.thinkific.com — this is Thinkific's central API host, not your school-specific URL. For Authentication, select 'No authentication' from the dropdown — Thinkific uses custom headers rather than the standard Bearer token or Basic auth schemes that Retool's built-in auth options cover. In the Headers section, click 'Add header' three times to add the required headers. First, add X-Auth-API-Key with your Thinkific API key as the value. Second, add X-Auth-Subdomain with your school subdomain as the value (e.g., yourschool, not the full yourschool.thinkific.com domain). Third, add Content-Type with value application/json. These three headers are required on every Thinkific API request — the API key authenticates you, the subdomain routes the request to your school, and the content type ensures JSON encoding. Click 'Test connection'. Thinkific's root API endpoint may return a 404 since there is no base path, but if the network request reaches Thinkific without a DNS or connectivity error, the resource is configured correctly. Click 'Save resource'.
Pro tip: Thinkific's API requires both the X-Auth-API-Key and X-Auth-Subdomain headers on every request — the subdomain header is what routes the request to your specific school's data. Missing either header returns a 401 or an empty response.
Expected result: A REST API Resource named 'Thinkific API' is saved with the X-Auth-API-Key, X-Auth-Subdomain, and Content-Type headers configured. The resource is available in the query editor for all apps in your Retool organization.
Query courses and enrollments
Open a Retool app and navigate to the Code panel at the bottom. Click '+ New query', select your Thinkific API resource, and name the query getCourses. Set the Method to GET and the URL path to /api/v1/courses. Add URL parameters: set page to 1 and limit to 50 (Thinkific's maximum per-page response). Click 'Run query'. Thinkific returns a JSON object with a items array containing course objects and a meta object with pagination info (total_count, next_page, previous_page). Each course in the items array has fields including id, name, slug, description, price, course_card_image_url, duration, and status ('published' or 'draft'). Create a transformer that filters to only published courses and extracts the fields you need for display. Bind the transformed output to a Table component by dragging a Table onto the canvas and setting Data source to {{ getCourses.data }}. To get enrollment data, create a second query named getEnrollments with path /api/v1/enrollments. Add parameters including page, limit (50), and course_id set to {{ coursesTable.selectedRow.id }} to filter enrollments for the selected course. The enrollments response includes user data (id, email, first_name, last_name) and enrollment metadata (activated_at, completed_at, percentage_completed, is_free_trial, created_at, and updated_at for the last activity timestamp).
1// Transformer: flatten Thinkific courses response2const courses = data.items || [];3return courses4 .filter(c => c.status === 'published')5 .map(c => ({6 id: c.id,7 name: c.name,8 slug: c.slug,9 price: c.price ? `$${(c.price / 100).toFixed(2)}` : 'Free',10 status: c.status,11 duration: c.duration || 'N/A'12 }));Pro tip: Thinkific returns price in the smallest currency unit (cents). Divide by 100 before displaying dollar amounts. Free courses have price: 0, not null — check for 0 when identifying free vs paid courses in your transformer.
Expected result: The getCourses query returns published courses in a Table. Clicking a course row triggers getEnrollments and shows all enrolled students for that course in a second Table below.
Calculate student completion metrics with transformers
Thinkific's enrollments endpoint returns raw completion data that needs transformation to be useful for dashboards. Each enrollment includes percentage_completed (a number 0-100), activated_at (when the student first accessed the course), completed_at (null if not finished), and updated_at (the last time any enrollment record was modified, which approximates last activity). Create a JavaScript query named enrollmentMetrics that processes the getEnrollments response and calculates per-enrollment derived fields for display. The transformer should calculate: days since enrollment (from created_at to today), days since last activity (from updated_at to today), enrollment status classification ('Completed' when completed_at is not null, 'Active' when updated within 14 days, 'At Risk' when updated 14-30 days ago, 'Inactive' when updated over 30 days ago), and format the percentage_completed as a display string. Also create a summary statistics query named courseSummary using the same data to calculate overall completion rate (enrollments with completed_at not null / total enrollments × 100), average completion percentage across all enrollments, count of active students, and count of at-risk students. Display summary statistics in Stat components above the enrollments Table, and use the status classification in the Table to color-code rows: green for Completed, blue for Active, yellow for At Risk, red for Inactive.
1// Transform enrollments with derived activity and status fields2const enrollments = getEnrollments.data?.items || [];3const today = new Date();45return enrollments.map(e => {6 const enrolledAt = e.created_at ? new Date(e.created_at) : null;7 const lastActivity = e.updated_at ? new Date(e.updated_at) : null;8 const daysEnrolled = enrolledAt ? Math.floor((today - enrolledAt) / (1000 * 60 * 60 * 24)) : null;9 const daysSinceActivity = lastActivity ? Math.floor((today - lastActivity) / (1000 * 60 * 60 * 24)) : null;1011 const status = e.completed_at ? 'Completed'12 : daysSinceActivity === null ? 'Unknown'13 : daysSinceActivity <= 14 ? 'Active'14 : daysSinceActivity <= 30 ? 'At Risk'15 : 'Inactive';1617 return {18 student_name: `${e.user?.first_name || ''} ${e.user?.last_name || ''}`.trim() || 'N/A',19 email: e.user?.email || 'N/A',20 enrolled_at: enrolledAt ? enrolledAt.toLocaleDateString() : 'N/A',21 completion_pct: `${Math.round(e.percentage_completed || 0)}%`,22 status,23 days_enrolled: daysEnrolled ?? 'N/A',24 days_since_activity: daysSinceActivity ?? 'N/A',25 completed: e.completed_at ? new Date(e.completed_at).toLocaleDateString() : null26 };27});Pro tip: Thinkific's updated_at field on enrollments reflects the last time any aspect of the enrollment record changed — including completion percentage updates. It is a good proxy for 'last active date' since Thinkific does not expose a direct last_login field on enrollments.
Expected result: The enrollment Table shows students with color-coded status badges (Active, At Risk, Inactive, Completed), days since activity, and completion percentage. Stat components above the table display total enrolled, active, at-risk, and completed counts.
Build an order management and revenue panel
To build revenue visibility into your Thinkific dashboard, create queries for the orders endpoint. Create a query named getOrders with Method GET and path /api/v1/orders. Add URL parameters to filter by date range using created_at[gte] and created_at[lte] bound to a DateRangePicker component in your app — for example, set created_at[gte] to {{ dateRange.start }} and created_at[lte] to {{ dateRange.end }}. Also set limit to 50 and page for pagination. The orders response includes user information, amount_in_cents (the amount charged in cents), created_at, status ('complete', 'pending', or 'refunded'), coupon_id, and a course or bundle reference. Create a JavaScript transformer named orderSummary that aggregates the orders response: sum amount_in_cents for all complete orders and convert to dollars, count of complete orders, count of refunded orders, and calculate the refund rate as a percentage. Display these as Stat components: Gross Revenue, Orders Completed, Refund Rate. A Table below shows all individual orders with student name, email, course name, amount paid, coupon code if any, and status. Add a DateRangePicker component linked to the getOrders query's date parameters so finance staff can review any billing period on demand. For complex Thinkific deployments integrating with payment processors, CRM systems, and accounting tools for automated revenue reporting, RapidDev's team can help architect the complete Retool solution.
1// Calculate order revenue summary2const orders = getOrders.data?.items || [];34const completedOrders = orders.filter(o => o.status === 'complete');5const refundedOrders = orders.filter(o => o.status === 'refunded');67const grossRevenue = completedOrders.reduce((sum, o) => sum + (o.amount_in_cents || 0), 0);8const refundAmount = refundedOrders.reduce((sum, o) => sum + (o.amount_in_cents || 0), 0);910return {11 gross_revenue: `$${(grossRevenue / 100).toFixed(2)}`,12 net_revenue: `$${((grossRevenue - refundAmount) / 100).toFixed(2)}`,13 completed_orders: completedOrders.length,14 refunded_orders: refundedOrders.length,15 refund_rate: orders.length > 016 ? `${Math.round((refundedOrders.length / orders.length) * 100)}%`17 : '0%'18};Pro tip: Thinkific's orders endpoint supports date filtering via created_at[gte] and created_at[lte] query parameters. Use ISO 8601 date format (YYYY-MM-DDTHH:mm:ssZ) for these parameters — passing a plain date string like '2026-01-01' may not filter correctly.
Expected result: The revenue panel shows Gross Revenue, Net Revenue, and Refund Rate Stat components that update when the DateRangePicker values change. The orders Table below shows individual transactions with student details, course name, amount, and status.
Common use cases
Build a school-wide course performance overview
Your online school has twenty-five courses and you need a dashboard showing total enrollment, active students (enrolled within the last 30 days), average completion rate, and total revenue generated for each course — sorted by revenue to identify your top performers. Thinkific's admin shows this data per course with no cross-course comparison view. The Retool app queries courses, enriches each with enrollment and order counts, and displays everything in a sortable Table with an inline bar chart for revenue comparison.
Build a course performance dashboard that lists all Thinkific courses with their name, enrollment count, active student count (enrolled in last 30 days), completion rate, and total revenue. Add a bar chart showing revenue per course sorted descending. Include a search bar and a category filter dropdown.
Copy this prompt to try it in Retool
Create a student lifecycle management panel
Your student success team needs to identify at-risk learners: students enrolled in any course who have not logged in for more than 14 days and have completion rates below 30%. Finding these students in Thinkific requires manual filtering across each course. The Retool app queries all enrollments across all courses, joins them with user data, calculates days since last activity from the updated_at timestamp, and presents a filtered table of at-risk students with their email for outreach campaigns.
Build a student risk panel that queries all Thinkific enrollments, joins with user data to get student email and name, calculates days since last activity, and filters for students with completion percentage below 30% and last activity more than 14 days ago. Show results in a Table with student email, course name, completion rate, and days inactive. Include a 'Copy emails' button.
Copy this prompt to try it in Retool
Build an order and revenue reconciliation dashboard
Your finance team processes monthly revenue reports and needs to reconcile Thinkific orders with your accounting system. They need a view of all orders within a billing period showing course purchased, price paid, coupon applied, and payment status — filterable by date range and exportable. Thinkific's native order history view does not support custom date range filters or bulk data review. The Retool app builds this using Thinkific's orders endpoint with date parameters bound to DateRangePicker components.
Build a revenue reconciliation panel with date range pickers that query Thinkific orders for a selected period. Show each order's student name, email, course or bundle purchased, full price, amount paid after discount, coupon code, and payment provider. Calculate and display total gross revenue, total discount, and net revenue as Stat components above the Table.
Copy this prompt to try it in Retool
Troubleshooting
Query returns 401 Unauthorized
Cause: The X-Auth-API-Key header is missing, incorrect, or the API key has been regenerated in Thinkific since it was configured in Retool. The X-Auth-Subdomain header may also be missing or use the wrong format.
Solution: Navigate to your Thinkific school admin, go to Settings → Code & API → API, and verify the API key matches what is in your Retool Resource. Also confirm the X-Auth-Subdomain header contains only the subdomain portion of your school URL (e.g., 'yourschool', not 'yourschool.thinkific.com'). Edit the Retool Resource to update both headers: Resources tab → select Thinkific API → edit headers → Save.
Enrollment percentage_completed shows 0 for all students despite course activity
Cause: The percentage_completed field in Thinkific represents the percentage of lessons marked complete by the student, not the percentage of lessons accessed. Students who watched videos or read content without clicking the 'Complete Lesson' button show 0% completion.
Solution: Inform your students that they need to click 'Complete Lesson' (or the lesson completion button) in the Thinkific course player for completion tracking to work. This is a Thinkific platform behavior, not an API issue. For dashboards where lesson access matters more than explicit completion marking, use the updated_at field to infer recent activity instead of relying solely on percentage_completed.
Orders query returns an empty items array despite existing orders
Cause: Date filter parameters (created_at[gte] and created_at[lte]) are not in the correct ISO 8601 format, or the DateRangePicker values are empty and the filter is excluding all records.
Solution: Verify that the date filter values from the DateRangePicker are formatted as ISO 8601 strings (YYYY-MM-DDTHH:mm:ssZ). If the DateRangePicker returns date strings in a different format, add a transformer in the parameter field to convert: new Date(dateRange.start).toISOString(). If the date range pickers are empty on initial load, add null-coalescing logic to omit the date parameters when no range is selected.
1// Convert DateRangePicker values to ISO format for Thinkific2// In query params:3// created_at[gte]: {{ dateRange.start ? new Date(dateRange.start).toISOString() : '' }}4// created_at[lte]: {{ dateRange.end ? new Date(dateRange.end).toISOString() : '' }}Best practices
- Store the Thinkific API key as a secret configuration variable in Retool (Settings → Configuration Variables, marked as secret) and reference it in the Resource header as {{ retoolContext.configVars.THINKIFIC_API_KEY }} — never paste the key value directly in a Resource header that non-admin Retool users can view.
- Both the X-Auth-API-Key and X-Auth-Subdomain headers must be present on every Thinkific API request. Configure them in the Resource's global headers section so they are automatically included in all queries without adding them per-query.
- Thinkific returns prices in the smallest currency unit (cents). Always divide by 100 before displaying dollar amounts in Stat components or Table columns — this is the most common data formatting error in Thinkific integrations.
- Use Thinkific's pagination parameters (page and limit) with Retool Table's built-in pagination feature for courses and enrollments — schools with large student databases will return incomplete data if pagination is not implemented.
- Add enrollment status classification in your transformer (Active, At Risk, Inactive) using updated_at as a proxy for last activity — this derived field enables proactive student success interventions that Thinkific's native reporting does not surface.
- For dashboards accessed by multiple team members (student success managers, finance staff, content managers), use Retool's permission system to restrict write operations (enrollment creation, order management) to authorized roles while allowing read-only access for reporting users.
- Build a separate Retool Workflow with a weekly Schedule trigger that calculates at-risk student counts per course and sends a summary email to student success managers — this proactive reporting layer reduces the need for manual dashboard checks.
Alternatives
Teachable uses simple API key Bearer authentication without a subdomain header, and is a better choice for individual course creators who need straightforward enrollment and revenue tracking rather than multi-course school management.
LearnWorlds is better suited for organizations building corporate e-learning programs with interactive video, SCORM compliance, and white-label requirements rather than self-paced online courses.
Podia is a simpler all-in-one platform for solo creators selling courses, memberships, and downloads without the multi-instructor or advanced school management features that Thinkific offers.
Frequently asked questions
Does Retool have a native Thinkific connector?
No. Retool does not have a dedicated native connector for Thinkific as of 2026. You connect via a generic REST API Resource using Thinkific's REST API with custom authentication headers. The setup requires adding X-Auth-API-Key (your API key) and X-Auth-Subdomain (your school subdomain) as global headers in the Resource configuration — this approach provides full access to all Thinkific API endpoints.
What is the difference between the Thinkific subdomain and a custom domain?
Your Thinkific subdomain is the unique identifier for your school assigned at registration — it appears in your original Thinkific URL (yourschool.thinkific.com). Even if you use a custom domain (e.g., courses.yourcompany.com) for your school's public-facing URL, the original Thinkific subdomain is still required for API authentication. Use the Thinkific subdomain in the X-Auth-Subdomain header, not your custom domain.
Can I create or modify enrollments from Retool?
Yes. Thinkific's API supports creating enrollments via POST /api/v1/enrollments with a JSON body containing user_id and course_id. You can build a Retool Form where admins enter a student email (look up the user ID first with GET /api/v1/users?search=email), then trigger the enrollment creation POST. This enables granting course access to students directly from Retool without logging into Thinkific's admin panel.
How do I handle Thinkific schools with thousands of students?
Thinkific's API limits responses to 50 items per page. For large schools, implement pagination in Retool using the page URL parameter and bind it to a Table's pagination state. Alternatively, use a Retool Workflow on a nightly schedule to export all enrollments to your internal database and build the dashboard against that local copy — this approach handles very large datasets without hitting Thinkific API rate limits during dashboard load.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation