Skip to the content.

Quick reference (TL;DR for agents)

Why Skool’s “webhooks” aren’t enough

Skool’s Zapier/Make integration exposes a couple of trigger-style webhooks (new member, new post) but:

For production reliability, polling the Skool API yourself and emitting webhooks is the more honest pattern.

Architecture — polling proxy

[Scheduler]                         [Apify actor]                      [Your webhook receiver]
   │                                      │                                   │
   ├── every 60s ──POST action────────────┤                                   │
   │   { posts:filter, since: last_seen } │                                   │
   │                                      ├──── api.skool.com ──── data       │
   │                                      │                                   │
   ◄────── new items ────────────────────┤                                   │
   │                                                                          │
   ├── for each new item ──HTTP POST your webhook ─────────────────────────►──┤
   │                                                                          │
   ├── update last_seen                                                       │

The “scheduler” can be n8n cron, Make schedule, a GitHub Action on cron, a Cloudflare Worker scheduled trigger, or a one-line Linux cron.

Setup — 10 minutes

1. Decide your polling interval

2. Pick the event to poll

Event Actor action Filter
New member application members:pending All returned items are pending (poll, diff by memberId)
New member joined (approved) members:list Track joinedAt against last seen
New post in feed posts:list or posts:filter since: last_poll_timestamp
New comment on a specific post direct /posts/{postId}/comments call Track comment IDs seen
New comment in any post poll posts:list then posts:getComments on hot threads More expensive — only do this for high-priority threads

3. n8n implementation (shortest path)

[Schedule Trigger — every 1 min]
        │
        ▼
[HTTP Request — POST Apify with posts:filter since=]
        │
        ▼
[Function — diff against $workflow.staticData.seenPostIds; collect new items]
        │
        ▼
[Loop — for each new item]
        │
        ▼
[HTTP Request — POST your webhook URL with the item payload]
        │
        ▼
[Function — update lastSeen + seenPostIds in $workflow.staticData]

n8n’s $workflow.staticData persists across runs — perfect for “last seen” state without a database.

4. Cron + curl implementation (no infrastructure)

#!/bin/bash
# /usr/local/bin/skool-webhook-poll.sh — runs every minute via cron

APIFY_TOKEN="..."
COOKIES="..."   # rotate via separate auth:login script every 3 days
GROUP="your-community"
WEBHOOK_URL="https://your-receiver.example.com/skool-events"
LAST_SEEN=$(cat /tmp/skool-last-seen 2>/dev/null || echo "2026-01-01T00:00:00Z")

POSTS=$(curl -s -X POST \
  "https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/run-sync-get-dataset-items?token=$APIFY_TOKEN&build=latest&timeout=30" \
  -H 'Content-Type: application/json' \
  -d "{
    \"action\": \"posts:filter\",
    \"cookies\": \"$COOKIES\",
    \"groupSlug\": \"$GROUP\",
    \"params\": {\"since\": \"$LAST_SEEN\", \"limit\": 50}
  }")

echo "$POSTS" | jq -c '.[] | .data.posts[]?' | while read post; do
  curl -s -X POST "$WEBHOOK_URL" -H 'Content-Type: application/json' -d "$post"
done

date -u +%Y-%m-%dT%H:%M:%SZ > /tmp/skool-last-seen

Cron: * * * * * /usr/local/bin/skool-webhook-poll.sh >> /var/log/skool-webhook.log 2>&1.

Cookies expire every ~3.5 days. For unattended polling, your runner must auto-rotate:

  1. Detect errorCode: "WAF_EXPIRED" in the response
  2. Call auth:login with stored email/password
  3. Update the stored cookies
  4. Retry the failed action

This is critical for any production webhook setup. See authentication docs.

Production gotchas


Get production-grade Skool webhooks today

→ Open the Skool All-in-One API actor on Apify

Polling-based webhooks via one POST per check. Pay-per-event (~$1.50-$15/mo depending on polling frequency). Battle-tested in production.

New to Skool? Launch your community here — 14-day trial.