Send app optins to ClickFunnels
ClickFunnels is built into every OverSkill app — connect once from your app's chat and your opt-in forms push contacts, tags, and course enrollments straight into your workspace. No webhook, no API key, no environment variables.
Built an opt-in page, quiz, or lead form on OverSkill and want every submission to land in your ClickFunnels workspace? Here's the one-line answer: you don't need a webhook, an API key, or any environment variables. ClickFunnels is built into every OverSkill app — ask the AI in your app's chat to send your opt-ins to ClickFunnels, click Connect ClickFunnels on the card that appears, and you're done. The platform holds the connection; your app's code never touches ClickFunnels credentials.
💬 Ask your AI to set this up Paste this into your app's chat:
When someone submits my opt-in form, send their name and email to my connected ClickFunnels workspace as a contact using the built-in ClickFunnels integration (no API keys or env vars), and tag them with 'my-app-lead'. If ClickFunnels isn't connected for this workspace yet, show me the Connect card so I can connect it. If the integration isn't available on my account, say so honestly instead of guessing.The AI can't click Connect for you — when the card appears in chat, click Connect ClickFunnels and authorize (or use the API-token option on the card). And if your app is already live, publish the change to production when the AI is done.
How the built-in integration works
Every OverSkill app ships with built-in ClickFunnels endpoints (/api/clickfunnels/...). When your app calls them, the platform makes the actual ClickFunnels API call using the connection you set up once for your workspace. That means:
- No setup in your app's code. No
CLICKFUNNELS_API_KEY, no env vars, no OAuth app to create in ClickFunnels' Developer Portal. - Public opt-in forms just work. The two lead-capture endpoints (create/update a contact, apply a tag) work for visitors who aren't logged into your app — exactly what an opt-in page needs.
- Writes cost 0.1 credits each (10 writes = 1 credit), billed to your workspace. Reads are free.
- Rate-limited for abuse protection. The public lead-capture endpoints are capped at 1,000 calls per workspace per day by default.
Connecting ClickFunnels (two ways)
From your app's chat (recommended). Ask the AI anything ClickFunnels-related — like the prompt above. If your workspace isn't connected yet, a Connect card appears right in the chat with two options:
- Connect ClickFunnels — one click, log into ClickFunnels, authorize. If your ClickFunnels team has more than one workspace, you'll pick which one to use.
- Or connect with an API token instead — in ClickFunnels, go to Team Settings → Developer Portal → Add new platform application, copy the API access token, and paste it into the card. OverSkill verifies it and finds your workspaces automatically.
From Workspace Integrations. Open your account menu → My Integrations (the Workspace Integrations page), click the ClickFunnels card, and connect from there. Same two options.
Connections are per-workspace — check which workspace your app lives in
This is the thing that trips people up most. A ClickFunnels connection belongs to one OverSkill workspace. If you have multiple workspaces, connecting ClickFunnels in one of them does not connect it for apps that live in another — those apps will keep reporting that ClickFunnels isn't connected, even though you can see a healthy connection elsewhere in your account.
How to stay out of trouble:
- Connect from inside the app's own chat. The Connect card connects the workspace you're working in — when you're in an app's editor, that's the workspace the app lives in.
- Check where the app lives. Your account menu shows your current workspace and lets you switch; an app belongs to the workspace whose dashboard lists it.
- Symptom to recognize: the AI (or your live app) says ClickFunnels needs to be connected, but you're sure you already connected it. You almost certainly connected a different workspace — open the app's chat and connect again from there.
What your app can do
The two endpoints marked public work without a login — they're the lead-capture path. Everything else requires a signed-in user of your app.
| Endpoint | What it does | Public? |
|---|---|---|
POST /api/clickfunnels/contacts/upsert |
Create or update a contact by email, optionally tagging them | ✅ Public |
POST /api/clickfunnels/tags/apply |
Apply a tag (by name or id) to a contact | ✅ Public |
POST /api/clickfunnels/tags/remove |
Remove a tag from a contact | Login required |
GET /api/clickfunnels/contacts/find?email= |
Look up a contact's full record | Login required |
GET /api/clickfunnels/tags |
List the workspace's tags | Login required |
GET /api/clickfunnels/courses |
List the workspace's courses | Login required |
POST /api/clickfunnels/courses/enroll |
Enroll a contact in a course | Login required |
GET /api/clickfunnels/status |
Check the connection + which workspace it's bound to | Login required |
The one you'll use most — the opt-in endpoint:
POST /api/clickfunnels/contacts/upsert
{
"email": "[email protected]", // required
"first_name": "Jane", // optional
"last_name": "Doe", // optional
"phone": "+15551234567", // optional
"custom_fields": { "source": "quiz" }, // optional, string values
"tags": ["my-app-lead", "quiz-completed"] // optional, tag names
}
You don't need to write these calls yourself — describe what you want in chat and the AI wires them up. The reference is here so you know what's possible.
How tags behave
Tags are applied additively by name: if a tag doesn't exist in your workspace yet, it's created; if the contact already has it, nothing changes; and the contact's existing ClickFunnels tags are never removed by an upsert. So it's safe to tag every submission without worrying about clobbering the tags your funnels already set.
When ClickFunnels isn't connected
Calls return needs_connection: true instead of failing silently, and the AI responds by showing you the Connect card. Nothing is lost mid-build — connect, then ask the AI to continue.
A security note on the public endpoints
Because the two public endpoints can be called by any visitor of your published app, never gate paid or members-only content on a tag that public code applies. If a tag unlocks anything valuable — a course, a ClickFunnels automation that grants access — apply it from a logged-in flow instead.
Advanced: let your app's users connect their own ClickFunnels
By default, everything above talks to your connected workspace — right for opt-ins and lead capture. If instead you're building a tool where each of your app's users connects their own ClickFunnels account (and your app writes into their workspace), the same endpoints accept an explicit scope: "user", and there are companion endpoints for users to connect and manage their own account inside your app (/api/clickfunnels/user/status, /user/connect, /user/disconnect). The scope is always explicit — your app never silently mixes your workspace up with a user's. Ask the AI for per-user ClickFunnels connections
if this is what you're building.
When you'd still use the ClickFunnels API directly
The built-in integration covers contacts, tags, and course enrollments — the lead-capture and membership patterns. For anything beyond that (reading orders, writing fulfillments, building pages, reacting to ClickFunnels webhooks), you'll work with the ClickFunnels API directly with your own credentials: see Connecting to the ClickFunnels API.
What to read next
- Building ClickFunnels + fulfillment apps — reacting to orders and writing fulfillments back
- Single login between your app and ClickFunnels courses
- Connecting to the ClickFunnels API — custom API work beyond the built-in integration