Automation Setup — Pabbly, Zapier & Make
All three tools do the same thing: send an HTTP POST to
https://<your-platform-host>/api/v1/provision/student/ with your X-API-Key header and a JSON body.
Use whichever your team already has.
First get an API key (Complete Onboarding Walkthrough → Step 1) and note the
coursesnames orcourse_idsyour products map to (GET /api/v1/courses/).
Map your products to courses first
Write this table down before building the workflow. It is the only decision you need to make.
| Your product | Send | Duration |
|---|---|---|
| IELTS 6‑month plan | "courses": ["ielts"] |
"tenure_months": 6 |
| PTE + IELTS bundle | "courses": ["pte_academic", "ielts"] |
"tenure_months": 3 |
| IELTS Weekend Batch | "course_ids": [371] |
leave out (the course's own default) |
| IELTS renewal, bought before expiry | "courses": ["ielts"], "extend_access": true |
"tenure_months": 3 |
Always send external_ref with the order id: it lets you trace a student back to the order, and it is
required for extend_access.
Pabbly Connect
- Trigger — your source app, e.g. WooCommerce → Order Completed, or your membership plugin's "member activated" event.
- Action — API by Pabbly (HTTP request):
- Method:
POST - URL:
https://<your-platform-host>/api/v1/provision/student/ - Headers:
X-API-Key=<your-key>,Content-Type=application/json - Payload type: JSON / Raw:
json { "email": "{{billing_email}}", "first_name": "{{billing_first_name}}", "last_name": "{{billing_last_name}}", "courses": ["ielts"], "tenure_months": 6, "external_ref": "{{order_id}}", "source": "pabbly" }Replace the{{…}}tokens with the fields Pabbly shows for your trigger. - Different products → different courses: add a Router (or one Filter per product) before the
action, and give each path its own
courses/course_idsandtenure_months. - Test the action. A
201or200with"status": "success"means the student is in. - Turn the workflow on.
Zapier
- Trigger — your source app event.
- Action — Webhooks by Zapier → POST:
- URL:
https://<your-platform-host>/api/v1/provision/student/ - Payload Type:
json - Data: one row per field:
email,first_name,last_name,courses(e.g.ielts, orielts, gmatfor several),tenure_months(e.g.6),external_ref(the order id),source(zapier). - Headers:
X-API-Key=<your-key> - Use Paths if different products need different courses.
- Test & turn on.
Zapier sends every value as text. That's fine: "6", "true" and "ielts, gmat" are all accepted.
Make.com
- Trigger — your source module.
- HTTP → Make a request:
- URL:
https://<your-platform-host>/api/v1/provision/student/ - Method:
POST - Headers:
X-API-Key=<your-key> - Body type:
Raw, Content type:application/json, Request content:json { "email": "{{1.email}}", "first_name": "{{1.first_name}}", "courses": ["ielts"], "tenure_months": 6, "external_ref": "{{1.order_id}}", "source": "make" } - Parse response: Yes, so later modules can read
email.statusorset_password_url. - Use a Router if different products need different courses.
- Run once to test, then switch scheduling on.
Choosing how the student signs in
By default the student gets an email with a link to set their own password, and your workflow never handles a secret. Two alternatives, matching the Add Student page:
| Add to the body | Result |
|---|---|
"password_mode": "generate" |
The platform makes a password, emails it to the student, and returns it in credentials.password so you can show it on a thank-you page. |
"username": "priya.n", "password": "Monsoon-Study-42!" |
The account uses exactly those details, and the student is emailed them. |
Either way the student is asked to change the password at first sign-in. If your own system already creates the account elsewhere, note that an email that already has an account keeps its own username and password: the API will not overwrite them.
Handling the response in your workflow
| You see | Do |
|---|---|
200/201, "status": "success" |
Done. |
200, "status": "already_provisioned" |
Done: this was a repeat. |
email.status is failed or suppressed |
Optional: alert your team, or email the student yourself with set_password_url. |
400 |
Stop. Fix the mapping (the error text says which field). Don't retry unchanged. |
401 / 403 |
Stop. Check the key, or ask your platform administrator. |
500 |
Retry later. It is safe. |
Sending your own welcome email
Set "send_welcome_email": false and add a step after the API call that sends your email containing
set_password_url from the response. That link works for 3 days (set_password_expires_at). It is only
returned for accounts your organization created through the API; anyone else can use Forgot password
on the login page.
Test from the command line
curl -s -X POST https://<your-platform-host>/api/v1/provision/student/ \
-H "X-API-Key: <your-key>" -H "Content-Type: application/json" \
-d '{
"email": "you@yourcompany.com",
"first_name": "Test",
"last_name": "Student",
"courses": ["ielts"],
"tenure_months": 1,
"external_ref": "manual_test_1"
}'
Expect 201 with "status": "success", and a welcome email in that inbox. Send the same request again:
you get "already_provisioned" and no second email.
