Integrations Guide
EduNest LMS connects to third-party providers for payments, email, storage, analytics, video, and a range of premium services (SMS, WhatsApp, chat, chatbot, live chat, CAPTCHA, calendar, social login, and shipping). All integrations are configured in Admin → Integrations (/admin/settings/integrations), and every secret is stored encrypted server-side — credentials are never exposed to the browser.
Each provider ships as a built-in add-on (src/product/addons/<id>/). A small set of providers is free; everything else is a premium add-on unlocked by a license entitlement or a purchase code. This guide covers the channels, how to connect one, and the free-vs-premium model.
The Channel Catalog
Integrations are organized into channels, each holding one or more providers. The full catalog is assembled in src/core/channels/registry.ts (base channels + installed add-ons). EduNest ships these providers across channels:
| Channel | Free providers | Premium add-on providers |
|---|---|---|
| Payments | COD, Bank Transfer, PayPal | Stripe, Razorpay, Square, Mollie, Paystack, Flutterwave, PayU, Authorize.Net, Checkout.com, Mercado Pago, Coinbase Commerce, Airwallex, dLocal, eWAY, PayTabs, Tap, Telr, Viva Wallet, Xendit, Yoco |
| SMTP | SendGrid, Postmark, Amazon SES | |
| Storage | Cloudflare R2 | Amazon S3, Google Cloud Storage, DigitalOcean Spaces |
| Analytics | Google Analytics (GA4) | Google Tag Manager, Meta Pixel, Microsoft Clarity, PostHog, TikTok |
| Video | YouTube, Vimeo | Mux, Cloudflare Stream, Bunny |
| SMS | — | Twilio, MSG91 |
| — | WhatsApp Cloud API, Twilio WhatsApp | |
| Realtime Chat | — | Pusher, Ably |
| AI Chatbot | — | OpenAI, Anthropic, OpenRouter |
| Live Chat | — | Crisp, Tawk, Intercom, Freshchat, Tidio, Zendesk |
| CAPTCHA | — | reCAPTCHA v2, reCAPTCHA v3 |
| Calendar | — | Google Calendar, Calendly |
| Social Login | — | Google, Facebook |
| Shipping | — | NimbusPost |
The base product ships only the channels that contain a free provider (email, payments, storage, analytics, video). Entirely-premium channels (SMS, WhatsApp, chat, chatbot, live chat, CAPTCHA, calendar, social, shipping) appear in the catalog once their add-on is bundled.
Free vs Premium Tiers
The free base set is defined in src/core/channels/tiers.ts:
email:smtp · analytics:ga4 · payments:cod · payments:bank · payments:paypal
storage:r2 · video:youtube · video:vimeo
Every other provider is premium. At runtime premiumBlock(headers, channel, provider) (src/lib/premium.ts) decides access:
- Free provider → always allowed.
- License entitlement covers it —
"*"/"all"(full unlock), the channel id (whole-channel unlock), or the exact"<channel>:<provider>"key → allowed. - Purchase code for that add-on has been activated on this domain → allowed.
- Otherwise → blocked with an unlock prompt.
On development/localhost hosts, all providers are unlocked for testing.
Connecting a Provider
Admin → Integrations (/admin/settings/integrations)
- Find the channel card (e.g. Payments) and pick a provider (e.g. Stripe).
- Click Connect and fill in the provider's fields. Field definitions come from the provider's
ProviderDef;secret-typed fields are encrypted before storage and shown masked (••••••••) thereafter. - Save. The connection is recorded in the
integration_connectionstable with anis_activeflag; you can mark one connection primary per channel. - For premium providers not covered by your main license, click to enter a purchase code.
POST /api/v1/admin/addons/license({ channel, provider, code }) validates the code and stores the entitlement for your domain;GET /api/v1/admin/addons/licenselists active add-on licenses.
A premium integration is live only when it is entitled (license or purchase code) and connected + active.
Provider Field Reference (examples)
The exact fields each provider asks for are declared in its ProviderDef. Two representative examples:
Stripe (Payments — premium)
| Field | Type | Notes |
|---|---|---|
| Mode | select | Live / Sandbox (Test) |
| Publishable Key | text | pk_live_… / pk_test_… |
| Secret Key | secret | sk_live_… / sk_test_… |
| Webhook Secret | secret | Endpoint signing secret |
Setup steps (shown in admin): get API keys from the Stripe Dashboard → Developers → API keys, then add a webhook endpoint and copy its signing secret.
PayPal (Payments — free)
| Field | Type | Notes |
|---|---|---|
| Mode | select | Live / Sandbox |
| Client ID | text | PayPal Developer → Apps & Credentials |
| Secret | secret | App secret |
| Webhook ID | text | Optional — for verifying PayPal webhook events |
Email, storage, analytics, video, and the premium channels each present their own fields the same way — for example, Storage offers free Cloudflare R2 (r2) and premium Amazon S3, Google Cloud Storage, and DigitalOcean Spaces; uploaded images are optimized to WebP before being stored regardless of which storage provider is selected.
Where Credentials Live
- Channel credentials entered in admin are encrypted (AES-256-GCM, key from
SECRET_KEY) and stored in the database (integration_connections) — there is nothing to add to.env. They are decrypted only server-side when a driver runs, and always masked in API responses. - The only baseline secrets in the environment are the platform's own:
DATABASE_URL,JWT_SECRET, andSECRET_KEY.
For how these integration add-ons are built and registered, see the Add-on Development Guide; for feature plugins like Certificates and Gamification, see the Plugin Development Guide.
© CreativeCape Solutions · creative-cape.com · support@creative-cape.com