Connecting Zoom
EduBook talks to Zoom in two ways:
- Webhooks — Zoom pushes events to EduBook every time a participant joins or leaves an online meeting. The system uses these to mark attendance automatically.
- API calls — for Enterprise tenants, EduBook calls Zoom’s API to create a new recurring meeting whenever you save a new online group, so you don’t have to copy-paste the link.
Both flows use Server-to-Server OAuth — a special Zoom app type that authenticates with credentials only, no user redirect. You create one Zoom app per tenant and paste its credentials into EduBook.
This doc walks through the full setup. It takes about 10 minutes.
1. Create a Server-to-Server OAuth app on Zoom
- Sign in to marketplace.zoom.us with the Zoom account that hosts your classes.
- Top-right menu → Develop → Build App.
- Pick Server-to-Server OAuth as the app type.
- Give it a name (e.g. EduBook Pro) and click Create.
You’re now in the app’s config wizard. We’ll fill four tabs: App Credentials, Information, Feature, Scopes, and finally Activation.
2. App Credentials — copy three values
The first tab shows three values. Copy them all — you’ll paste them into EduBook in step 6.
| Field | Use |
|---|---|
| Account ID | Identifies your Zoom account. |
| Client ID | Public app identifier. |
| Client Secret | Authenticates EduBook to Zoom. Treat as a password — won’t be readable again after you leave the page. |
3. Information
Fill the basic app info Zoom requires. None of it affects EduBook — it’s just metadata Zoom keeps on file.
- Short description: “EduBook attendance integration”
- Long description: copy the short one
- Company name: your center name
- Developer contact: your email
4. Feature → Event Subscriptions
This is where webhooks get wired up.
- Toggle Event Subscriptions ON.
- Add a new Event notification endpoint.
- Subscription Name:
EduBook Attendance - Event notification endpoint URL: open EduBook → Settings →
Integrations → Zoom card and copy the URL shown there. It
looks like:
https://license.edubookapp.com/api/webhooks/zoom?tenant=<your-id>
- Click Validate. Zoom does a one-shot signature check against your endpoint. Wait for the green checkmark.
- Add Events → check:
- Meeting →
Participant/Host joined meeting - Meeting →
Participant/Host left meeting - Meeting →
End Meeting
- Meeting →
- Secret Token — Zoom generates one and shows it on the page. Copy it — you’ll paste it into EduBook in step 6 as the “Webhook Secret”.
5. Scopes — exactly four
Zoom uses scopes to limit what your app can do. Add only these four (search by keyword in the Scopes tab):
| Scope | Why |
|---|---|
meeting:write:meeting:admin | Create recurring meetings (Enterprise auto-create). |
meeting:read:meeting:admin | Read meeting metadata. |
meeting:read:participant:admin | Required for participant join/leave webhook events. |
user:read:user:admin | Identify the host account when creating meetings. |
Don’t add anything else — extra permissions widen the blast radius if a credential ever leaks.
6. Connect from EduBook
In EduBook → Settings → Integrations → Zoom:
- Paste Account ID (from step 2)
- Paste Client ID (from step 2)
- Paste Client Secret (from step 2)
- Paste Webhook Secret Token (from step 4)
- Click Connect Zoom
EduBook will probe the credentials against Zoom’s /oauth/token
endpoint before saving. If the credentials are wrong you’ll see a
toast error — nothing gets persisted.
On success the card flips to Connected ✓ and shows your Account ID + last event time.
7. Activate the Zoom app
Back in Zoom Marketplace → final tab Activation → Activate your app.
Without activation, Zoom won’t actually deliver webhooks. Skip this step and the connection looks healthy in EduBook but no events arrive.
8. Test it
The fastest end-to-end test:
- In EduBook, create an online group with provider = Zoom and paste a Zoom meeting URL you control. The Meeting ID auto-fills from the URL.
- Add a student to the group with the same email they’ll use to join Zoom.
- Start the Zoom meeting and have the student join. Have them stay for at least the threshold time (default 30 minutes).
- After they leave (or after the meeting ends), open the group’s
attendance page — the student should be marked present with
source: zoom.
In Settings → Integrations → Zoom, the Last event received field updates with each join/leave event Zoom delivers.
What if a student isn’t matched?
The auto-attendance flow matches the Zoom participant against your student records by:
- Participant’s Zoom email → student’s email (exact, case-insensitive)
- Participant’s phone → student’s phone, then student’s parent phone (digits-only comparison)
If neither matches, the event is still recorded but the student isn’t auto-marked present. Make sure students join Zoom with the exact email or phone you have on file. Display-name fuzzy matching is intentionally NOT supported — too many false positives in real classrooms.
Disconnecting
Settings → Integrations → Zoom → Disconnect clears the secrets from EduBook’s database (they’re encrypted at rest with AES-256-GCM, and disconnect overwrites them with NULL). Your Zoom app on marketplace.zoom.us is untouched — re-connect with the same credentials anytime.
Troubleshooting
The “Validate” button in Zoom fails with a timeout — your EduBook deployment might be cold. Open the webhook URL in a browser first (you’ll see a 404, that’s fine — it just warms the function), then click Validate again.
“Last event received” stays empty after a real meeting — check:
- The Zoom app is activated (step 7).
- The events you subscribed to are actually firing — check the Zoom app’s “Recent Events” tab.
- Your group’s Meeting ID matches the actual Zoom meeting id.
Auto-attendance doesn’t mark a student present even after 30+ minutes — check that the email the student joined Zoom with EXACTLY matches their record in EduBook. The match is case- insensitive but otherwise exact.