# App Review Process Source: https://docs.orbitforms.ai/apps/app-review Learn about the review process your app must go through before being listed in the OrbitForms marketplace. Before your app can be listed in the OrbitForms marketplace, it must go through our review process. This ensures all apps meet our quality and security standards. ## Review Timeline **3-5 Business Days** — Average review time for most applications. Complex apps or those requiring additional security review may take longer. You'll receive email updates at each stage of the process. ## Review Stages Complete your app profile, add screenshots, and ensure all required fields are filled. Our team reviews your app configuration, permissions, and user experience. We verify OAuth implementation, data handling, and security best practices. If needed, we'll request changes. You can update and resubmit your app. Once approved, your app will be listed in the OrbitForms marketplace. ## Submission Checklist Ensure your app meets these requirements before submitting: ### Required * App name and description * Website URL * Privacy policy URL * Terms of service URL * Valid OAuth callback URLs ### Optional * App icon (image up to 5MB) * Documentation link ## Common Rejection Reasons Avoid these common issues that can lead to rejection: * Missing or invalid privacy policy * Requesting unnecessary permissions * Insecure OAuth implementation * Poor user experience or confusing flows * Misleading app name or description * Non-functional features or broken links ## After Approval Your app will appear in the OrbitForms integrations directory. Users can rate and review your app publicly. Maintain quality standards to keep your listing active. Minor updates go live instantly; major changes require re-review. ## Need help with your submission? Our developer relations team is here to help you through the review process. Reach out if you have questions or need guidance. Get help from our developer relations team. # Authentication Source: https://docs.orbitforms.ai/apps/authentication Learn how to authenticate API requests using access tokens obtained through the OAuth 2.0 flow. ## Making Authenticated Requests Include the access token in the Authorization header of your API requests: ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/forms" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" ``` ## Token Expiration **Access tokens expire after 1 hour.** Use the refresh token to obtain a new access token without requiring the user to re-authorize. To refresh an expired access token: ```bash theme={null} curl -X POST "https://orbitforms.ai/api/oauth/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=refresh_token" \ -d "client_id=YOUR_CLIENT_ID" \ -d "client_secret=YOUR_CLIENT_SECRET" \ -d "refresh_token=YOUR_REFRESH_TOKEN" ``` ## Authentication Errors | Status | Error | Solution | | ------ | -------------------- | ------------------------------------------------- | | `401` | `invalid_token` | Token is expired or invalid. Refresh the token. | | `401` | `token_expired` | Use your refresh token to get a new access token. | | `403` | `insufficient_scope` | Request additional scopes from the user. | | `429` | `rate_limited` | Too many requests. Implement exponential backoff. | ## Best Practices Never expose tokens in client-side code or logs. Refresh tokens before they expire to avoid interruptions. Implement proper error handling for auth failures. ## Next Steps Learn about available scopes Make your first API call # Best Practices Source: https://docs.orbitforms.ai/apps/best-practices Follow these best practices to build reliable, secure, and user-friendly integrations that scale with your users. Follow these best practices to build reliable, secure, and user-friendly integrations that scale with your users. ## API Usage Implement exponential backoff when you hit rate limits. Cache responses when possible to reduce API calls. Use the page-based pagination (`page` and `per_page` parameters) for large result sets. Don't request more data than you need. Store access tokens and refresh tokens securely. Never log tokens or expose them in client-side code. ## Webhook Handling Return a 2xx response within 5 seconds. Queue processing for later if needed. Store webhook IDs to handle duplicate deliveries gracefully. Always validate webhook signatures before processing payloads. Log failed processing and implement retry mechanisms. ## Error Handling | Error Type | Recommended Action | | ----------------------- | ------------------------------------------------------------- | | `400 Bad Request` | Check your request parameters and payload format | | `401 Unauthorized` | Refresh the access token and retry | | `403 Forbidden` | Request additional scopes from the user | | `404 Not Found` | Verify the resource ID exists | | `429 Too Many Requests` | Implement exponential backoff | | `500 Server Error` | Retry with exponential backoff, contact support if persistent | ## User Experience * **Clear onboarding** — Guide users through setup with clear instructions and progress indicators. * **Helpful error messages** — Show actionable error messages that help users resolve issues. * **Sync status** — Show sync status and last successful sync time. * **Easy disconnection** — Provide a clear way for users to disconnect your app. ## Next Steps Review listing requirements. Get your app approved. # Developer Community Source: https://docs.orbitforms.ai/apps/community Connect with other developers building on OrbitForms. Get help, share ideas, and stay updated on the latest features. Connect with other developers building on OrbitForms. Get help, share ideas, and stay updated on the latest features and best practices. ## Join the Conversation Get help with API integration, report bugs, or ask questions about the platform. Browse comprehensive guides, tutorials, and API reference documentation. ## Developer Resources Complete API documentation. Tips for building great apps. # App Guidelines Source: https://docs.orbitforms.ai/apps/guidelines Guidelines to ensure apps in the OrbitForms marketplace provide a great experience for users. These guidelines ensure apps in the OrbitForms marketplace provide a great experience for users. Following these requirements will help your app pass review quickly. ## Core Requirements Implement OAuth 2.0 correctly, validate all inputs, and handle user data securely. Provide clear UI, helpful error messages, and intuitive workflows. Respond to webhooks within 5 seconds and maintain high availability. Provide clear setup instructions and user documentation. ## Do's and Don'ts ### Do * Request minimal permissions * Provide clear error messages * Include a privacy policy * Handle rate limits gracefully * Offer a way to disconnect * Keep user data secure ### Don't * Request unnecessary permissions * Store tokens insecurely * Ignore webhook failures * Mislead users about functionality * Collect data without consent * Violate rate limits repeatedly ## Branding Requirements | Item | Requirement | | ----------- | ----------------------------------------------- | | App Icon | 512x512 PNG, no transparency required | | App Name | Clear, descriptive, no trademarks you don't own | | Description | Accurate summary of features (max 500 chars) | | Screenshots | At least 2 screenshots showing key features | | Category | Select the most appropriate category | ## Privacy & Data Handling Your app must respect user privacy and comply with data protection regulations: * Publish a clear privacy policy explaining what data you collect and how it's used * Only collect data necessary for your app's functionality * Provide users a way to request data deletion * Don't share user data with third parties without explicit consent * Implement appropriate security measures to protect user data ## Next Steps Submit for marketplace listing. Tips for building great apps. # App Marketplace Source: https://docs.orbitforms.ai/apps/marketplace Learn how to optimize your marketplace listing and grow your user base on the OrbitForms App Marketplace. The OrbitForms App Marketplace is where users discover and install integrations. Learn how to optimize your listing and grow your user base. ## Marketplace Benefits Access thousands of active OrbitForms users looking for integrations. Verified apps get a trust badge and higher visibility. Track installs, usage, and user engagement metrics. One-click installation for users, seamless OAuth flow. ## Your Marketplace Listing A great listing includes these elements: * **App Icon** — A recognizable 512x512 icon that stands out in the directory. * **App Name** — Clear, memorable name that describes your integration. * **Short Description** — 140-character summary shown in search results. * **Full Description** — Detailed explanation of features, use cases, and setup instructions. * **Screenshots** — Visual demonstrations of your app in action (2-5 recommended). * **Category** — Primary category for discovery (CRM, Automation, Analytics, etc.). ## Optimization Tips 1. Use keywords in your description that users search for 2. Include screenshots showing real use cases 3. Respond to user reviews promptly 4. Keep your app updated and bug-free 5. Provide excellent documentation 6. Offer responsive support ## App Categories Apps can be listed under the following categories: * Notifications * CRM * Automation * Analytics * Email Marketing * Productivity * Payments * Database * Developer Tools ## Next Steps Review listing requirements. Get your app approved. # OAuth 2.0 Integration Source: https://docs.orbitforms.ai/apps/oauth OrbitForms uses OAuth 2.0 for secure authentication. This guide walks you through implementing the authorization code flow to access the OrbitForms API on behalf of users. ## OAuth Flow Overview Redirect users to OrbitForms authorization page User reviews and approves requested permissions OrbitForms redirects back with an authorization code Exchange the code for access and refresh tokens Use the access token to make API requests ## Step 1: Build Authorization URL Redirect users to the OrbitForms authorization endpoint with the following parameters: ``` https://orbitforms.ai/api/oauth/authorize? client_id=YOUR_CLIENT_ID& redirect_uri=https://yourapp.com/callback& response_type=code& scope=forms:read forms:write submissions:read& state=RANDOM_STATE_STRING ``` | Parameter | Description | | --------------- | --------------------------------------------- | | `client_id` | Your application's Client ID | | `redirect_uri` | Must match a registered callback URL | | `response_type` | Always "code" for authorization code flow | | `scope` | Space-separated list of requested permissions | | `state` | Random string for CSRF protection | ## Step 2: Exchange Code for Tokens After the user authorizes your app, they'll be redirected to your callback URL with an authorization code. Exchange this code for access and refresh tokens: ```bash theme={null} curl -X POST https://orbitforms.ai/api/oauth/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=authorization_code" \ -d "client_id=YOUR_CLIENT_ID" \ -d "client_secret=YOUR_CLIENT_SECRET" \ -d "code=AUTHORIZATION_CODE" \ -d "redirect_uri=https://yourapp.com/callback" ``` **Response:** ```json theme={null} { "access_token": "YOUR_ACCESS_TOKEN", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "YOUR_REFRESH_TOKEN", "scope": "forms:read forms:write submissions:read" } ``` ## Available Scopes Request only the permissions your app needs: Read form configurations Create and update forms Delete forms Read form submissions Update submission data Delete submissions Read contacts and tags Create, update, and manage contacts and tags Delete contacts Read team information Update team settings Manage team members Read webhook configurations Create and manage webhooks Read scheduling pages, event types, and availability Create and update scheduling pages and event types Delete scheduling pages and event types Read meetings Update meetings (status changes, notes) Delete meetings Read sequences, steps, enrollments, analytics, and unsubscribes Enroll contacts and manage unsubscribes Unenroll contacts and remove unsubscribes Read form analytics Read user profile Update user profile ## Security Best Practices Never expose your Client Secret in client-side code or version control. Always include a random state string to prevent CSRF attacks. Use refresh tokens to get new access tokens before they expire. Only use pre-registered callback URLs to prevent open redirect vulnerabilities. ## Next Steps Learn about permission scopes Explore available endpoints # Build Apps for OrbitForms Source: https://docs.orbitforms.ai/apps/overview Create powerful integrations and extend OrbitForms's functionality with custom OAuth applications. Connect your services, automate workflows, and reach thousands of users through the OrbitForms marketplace. ## Get Started Register OAuth apps, manage API credentials, and access your developer tools. Learn how to build OAuth applications that integrate with OrbitForms's API securely. ## Quick Start Guide Follow these steps to create your first OrbitForms integration: Create your account to get access to the developer tools. Set up your app in the Developer Portal. Define what your app can access and where users are redirected. Integrate the authorization code flow into your application. Get your app reviewed and listed in the marketplace. ## What You Can Build Create powerful integrations that extend OrbitForms's capabilities: Sync form submissions with your CRM Trigger workflows from form events Custom authentication integrations Build tools for OrbitForms teams ## Resources Complete API documentation with examples Requirements for marketplace listing Connect with other developers **Ready to build?** Sign up and start building integrations today. Join hundreds of developers building on OrbitForms. [Get Started](/apps/portal) # App Permissions Source: https://docs.orbitforms.ai/apps/permissions OAuth scopes define what your app can access on behalf of users. Request only the permissions your app needs—users are more likely to approve apps that request minimal access. **Principle of Least Privilege** — Only request scopes that are essential for your app's core functionality. You can always request additional permissions later if needed. ## Forms | Scope | Description | | -------------- | ---------------------------------------------- | | `forms:read` | Read form configurations, fields, and settings | | `forms:write` | Create and update forms | | `forms:delete` | Delete forms | ## Submissions | Scope | Description | | -------------------- | ----------------------------------- | | `submissions:read` | Read form submissions and responses | | `submissions:write` | Update submission data | | `submissions:delete` | Delete form submissions | ## Contacts | Scope | Description | | ----------------- | -------------------------------------------- | | `contacts:read` | Read contacts and tags | | `contacts:write` | Create, update, and manage contacts and tags | | `contacts:delete` | Delete contacts | ## Team | Scope | Description | | -------------- | --------------------- | | `team:read` | Read team information | | `team:write` | Update team settings | | `team:members` | Manage team members | ## Webhooks | Scope | Description | | ---------------- | --------------------------------------- | | `webhooks:read` | Read webhook configurations | | `webhooks:write` | Create and manage webhook subscriptions | ## Scheduling | Scope | Description | | ------------------- | ---------------------------------------------------- | | `scheduling:read` | Read scheduling pages, event types, and availability | | `scheduling:write` | Create and update scheduling pages and event types | | `scheduling:delete` | Delete scheduling pages and event types | ## Meetings | Scope | Description | | ----------------- | --------------------------------------- | | `meetings:read` | Read meetings | | `meetings:write` | Update meetings (status changes, notes) | | `meetings:delete` | Delete meetings | ## Sequences | Scope | Description | | ------------------ | --------------------------------------------------------------- | | `sequences:read` | Read sequences, steps, enrollments, analytics, and unsubscribes | | `sequences:write` | Enroll contacts and manage unsubscribes | | `sequences:delete` | Unenroll contacts and remove unsubscribes | ## Analytics | Scope | Description | | ---------------- | -------------------------------- | | `analytics:read` | Read form analytics and insights | ## User | Scope | Description | | ------------ | ------------------- | | `user:read` | Read user profile | | `user:write` | Update user profile | ## Requesting Scopes Include the scopes you need in the authorization URL as a space-separated list: ``` scope=forms:read submissions:read webhooks:read webhooks:write ``` ## Common Scope Combinations ### Read-only Dashboard View forms and submissions without making changes `forms:read` `submissions:read` ### Form Builder Create and manage form configurations `forms:read` `forms:write` ### Full Integration Complete access for building comprehensive integrations `forms:read` `forms:write` `submissions:read` `webhooks:read` `webhooks:write` ## Next Steps Implement the authorization flow Submit for marketplace listing # Developer Portal Source: https://docs.orbitforms.ai/apps/portal The Developer Portal is your central hub for creating and managing OAuth applications, accessing API credentials, and monitoring your integrations. **Get started with the Developer Portal** — Sign up for an OrbitForms account to access the Developer Portal and start building integrations. ## Portal Features Register new OAuth applications and configure their settings, redirect URIs, and permissions. Generate and manage Client IDs and Client Secrets for your applications. Rotate credentials securely. Track total installs of your app over time from the app detail page. Update app settings, branding, descriptions, and callback URLs at any time. Track the status of your app review submissions and receive feedback from our team. ## Creating Your First App Once you have an OrbitForms account, follow these steps to register your first OAuth application: From your dashboard, click "API & Developers" in the sidebar, then open the "OAuth Apps" tab to view your registered apps. Start the app creation flow by clicking the "New App" button. Fill in the required information: * **App Name:** A unique name for your application * **Description:** Brief explanation of what your app does * **Website URL:** Your app's website * **Redirect URIs:** OAuth callback URLs (can add multiple) * **Scopes:** The permissions your app will request After creation, you'll receive your Client ID and Client Secret. Store the secret securely—it won't be shown again. ## Next Steps Implement the OAuth 2.0 flow Get listed in the marketplace # Webhooks Source: https://docs.orbitforms.ai/apps/webhooks Webhooks allow your app to receive real-time notifications when events occur in OrbitForms. Build reactive integrations that respond instantly to form submissions and other events. ## Available Events New form submission received Submission met qualification criteria Submission data was modified Submission was deleted ## Webhook Payload Each webhook delivers a JSON payload with event details: ```json theme={null} { "event": "submission.created", "timestamp": "2024-01-15T10:30:00Z", "data": { "form_id": "form_xyz789", "form_title": "Contact Us", "form_slug": "contact-us", "submission_id": "sub_abc123", "submission_data": { "email": "user@example.com", "name": "John Doe", "message": "Hello!" }, "submitted_at": "2024-01-15T10:29:58Z", "metadata": { "referrer": "https://example.com/contact", "user_agent": "Mozilla/5.0 ...", "device_type": "desktop", "country": "US", "utm_source": null, "utm_medium": null, "utm_campaign": null } } } ``` ## Signature Verification All webhook requests include a signature header for verification. Always verify the signature to ensure the request came from OrbitForms: ```javascript theme={null} const crypto = require('crypto'); function verifyWebhook(payload, signature, secret) { const expectedSignature = crypto .createHmac('sha256', secret) .update(payload) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from('sha256=' + expectedSignature) ); } ``` ## Best Practices Return a 2xx response within 5 seconds. Process asynchronously if needed. Always validate the webhook signature before processing. Webhooks are retried on failure. Implement idempotency to avoid duplicates. ## Next Steps Full webhook documentation Manage webhooks via API # Changelog Source: https://docs.orbitforms.ai/changelog New features, improvements, and fixes in OrbitForms. ### New * **"Added to another sequence" exit option** — Automatically remove a contact from a sequence when they're added to one or more sequences you choose. Perfect for handing contacts off from one campaign to the next. Find it in your sequence's **Settings → Exit criteria**. * **HubSpot contact owner sync** — The HubSpot destination in workflows can now mirror the OrbitForms contact owner to the HubSpot contact owner, so the right rep owns the record in both tools. Enable it per workflow with the new **Sync contact owner** toggle. * **AI credit alerts** — If your AI credits run out, we'll email you and show a warning on the Billing page so your AI-powered workflows never stop unexpectedly. ### Improvements * **Smarter meeting gates** — Cancelled meetings no longer count toward a sequence's "Meeting booked" exit condition or the "Skip if meeting already booked" entry check, and skip reasons are now shown when a contact isn't enrolled. * **Faster marketing site** — Public pages load noticeably faster. * **Billing page refresh** — A cleaner, easier-to-scan billing summary with a quicker way to change plans. * **Security hardening** — A round of platform-wide security improvements. ### Fixes * Sequence analytics now correctly show delivered, open, click, and bounce metrics. * Publishing a sequence no longer fails because of hidden leftover steps. * Backspace and delete now remove variable pills in the token editor as expected. * The contact page now shows friendly labels for every sequence exit reason. # Authentication Source: https://docs.orbitforms.ai/developers/api/authentication The OrbitForms API uses API keys to authenticate requests. You can manage your API keys from your dashboard. The OrbitForms API uses API keys to authenticate requests. You can manage your API keys from your dashboard. ## API Keys There are two types of API keys: `sk_live_*` — Live keys for production use. All requests affect real data. `sk_test_*` — Test keys for development and testing, so you can distinguish non-production credentials in your dashboard. ## Using API Keys Include your API key using either the `Authorization` header as a Bearer token, or the `X-API-Key` header: ``` Authorization: Bearer sk_live_your_api_key_here # Or use the X-API-Key header: X-API-Key: sk_live_your_api_key_here ``` Example request: ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/forms" \ -H "Authorization: Bearer sk_live_your_api_key_here" \ -H "Content-Type: application/json" # Alternative with X-API-Key header: curl -X GET "https://orbitforms.ai/api/v1/forms" \ -H "X-API-Key: sk_live_your_api_key_here" \ -H "Content-Type: application/json" ``` ## OAuth 2.0 For third-party applications that need to access user data, use OAuth 2.0 with PKCE. OAuth access tokens use the `orb_at_*` prefix. To build an OAuth app, visit the [Developer Portal](https://orbitforms.ai/developer) to register your application and obtain client credentials. ## Security Best Practices **Keep keys secret** — Never expose API keys in client-side code, public repositories, or browser localStorage/sessionStorage. **Use environment variables** — Store API keys in environment variables on your server. Never include them in frontend bundles. **Rotate compromised keys** — If a key is exposed, revoke it immediately from your dashboard and generate a new one. ## Authentication Errors | Status | Meaning | | ------ | ---------------------------------- | | `401` | Invalid or missing API key | | `403` | API key lacks required permissions | [Next: Forms API](/developers/api/forms) # Forms API Source: https://docs.orbitforms.ai/developers/api/forms The Forms API allows you to create, read, update, and delete forms programmatically. The Forms API allows you to create, read, update, and delete forms programmatically. ## Endpoints | Method | Endpoint | Description | | -------- | ---------------- | ------------------- | | `GET` | `/v1/forms` | List all forms | | `GET` | `/v1/forms/{id}` | Get a specific form | | `POST` | `/v1/forms` | Create a new form | | `PATCH` | `/v1/forms/{id}` | Update a form | | `DELETE` | `/v1/forms/{id}` | Delete a form | ## Query Parameters Use these query parameters when listing forms: | Parameter | Type | Description | | ---------- | ------- | ----------------------------------------------- | | `page` | integer | Page number (default: 1) | | `per_page` | integer | Results per page (default: 20, max: 100) | | `status` | string | Filter by status: published, draft, or archived | ## List Forms Returns a paginated list of all forms in your team. ```json theme={null} { "data": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "title": "Contact Form", "slug": "contact-form", "type": "standard", "status": "published", "created_at": "2024-01-15T10:00:00Z", "updated_at": "2024-01-15T12:00:00Z" } ], "meta": { "total": 1, "page": 1, "per_page": 20, "total_pages": 1 } } ``` ## Get Form Returns detailed information about a specific form, including fields and settings. ```json theme={null} { "data": { "id": "550e8400-e29b-41d4-a716-446655440000", "title": "Contact Form", "slug": "contact-form", "description": "Get in touch with our team", "type": "standard", "status": "published", "fields": [ { "id": "660e8400-e29b-41d4-a716-446655440001", "type": "email", "label": "Email Address", "name": "email", "placeholder": "you@example.com", "required": true, "position": 0 }, { "id": "660e8400-e29b-41d4-a716-446655440002", "type": "textarea", "label": "Message", "name": "message", "required": false, "position": 1 } ], "settings": { "redirect_url": "https://example.com/thank-you" }, "created_at": "2024-01-15T10:00:00Z", "updated_at": "2024-01-15T12:00:00Z" } } ``` [Next: Submissions API](/developers/api/submissions) # API Overview Source: https://docs.orbitforms.ai/developers/api/overview The OrbitForms REST API enables you to programmatically manage forms, submissions, scheduling pages, meetings, sequences, and integrate with your applications. The OrbitForms REST API enables you to programmatically manage forms, submissions, scheduling pages, meetings, sequences, and integrate with your applications. ## Base URL ``` https://orbitforms.ai/api/v1 ``` ## Authentication All API requests require authentication using a Bearer token in the Authorization header: ``` Authorization: Bearer YOUR_API_KEY ``` [Learn more about authentication](/developers/api/authentication) ## Available Endpoints Create, read, update, and delete forms Retrieve and manage form submissions Manage scheduling pages, event types, meetings, and availability Enroll contacts in drip campaigns, view analytics, manage unsubscribes API keys and OAuth tokens ## Response Format All responses are returned in JSON format with consistent structure: ```json theme={null} { "data": { ... }, "meta": { "total": 100, "page": 1, "per_page": 20 } } ``` # Rate Limits Source: https://docs.orbitforms.ai/developers/api/rate-limits The API enforces rate limits to ensure fair usage and platform stability. ## Rate Limits | Authentication Type | Rate Limit | | ------------------- | ---------------------- | | API Key | 1,000 requests/minute | | OAuth (Development) | 100 requests/minute | | OAuth (Approved) | 10,000 requests/minute | **Benefits of OAuth App Approval** * **100x higher rate limits** – Scale without worrying about throttling * **Marketplace listing** – Get discovered in the OrbitForms directory * **Priority support** – Direct access to our developer relations team [Learn about the review process →](https://orbitforms.ai/developer/app-review) Need higher limits for your use case? Contact us at [support@orbitforms.ai](mailto:support@orbitforms.ai) to discuss custom rate limits for your application. ## Handling Rate Limits **429 Too Many Requests** When you exceed the rate limit, you'll receive a 429 response with a `Retry-After` header. Implement exponential backoff: 1. Wait for the time specified in the `Retry-After` header 2. Or implement exponential backoff (1s, 2s, 4s, 8s...) 3. Maximum retry time should be capped at 60 seconds ## Best Practices * Cache responses when possible to reduce API calls * Use webhooks instead of polling for real-time updates * Batch operations when the API supports it * Monitor your rate limit headers proactively [Next: Webhooks →](/developers/webhooks) # Scheduling API Source: https://docs.orbitforms.ai/developers/api/scheduling The Scheduling API lets you manage scheduling pages, event types, meetings, and availability schedules programmatically. The Scheduling API lets you manage scheduling pages, event types, meetings, and availability schedules programmatically. Requires `scheduling:read`, `scheduling:write`, `meetings:read`, or `meetings:write` scopes. ## Scheduling Pages Scheduling pages are booking pages your contacts use to schedule meetings. Each page can contain multiple event types. ### Endpoints | Method | Endpoint | Description | | -------- | --------------------------- | -------------------------------------- | | `GET` | `/v1/scheduling-pages` | List scheduling pages | | `POST` | `/v1/scheduling-pages` | Create a scheduling page | | `GET` | `/v1/scheduling-pages/{id}` | Get a scheduling page with event types | | `PATCH` | `/v1/scheduling-pages/{id}` | Update a scheduling page | | `DELETE` | `/v1/scheduling-pages/{id}` | Delete a scheduling page | ### Query Parameters Use these when listing scheduling pages: | Parameter | Type | Description | | ---------- | ------- | ---------------------------------------- | | `page` | integer | Page number (default: 1) | | `per_page` | integer | Results per page (default: 20, max: 100) | | `status` | string | Filter by status: draft or published | ### List Scheduling Pages ```bash theme={null} curl https://orbitforms.ai/v1/scheduling-pages \ -H "Authorization: Bearer YOUR_API_KEY" ``` ```json theme={null} { "data": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "title": "Book a Demo", "slug": "book-a-demo", "description": "Schedule a product demo with our team", "type": "schedule", "page_type": "one_on_one", "status": "published", "settings": { "confirmation_message": "You're booked!", "show_avatar": true }, "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-01-20T14:30:00Z", "published_at": "2026-01-16T09:00:00Z" } ], "meta": { "total": 1, "page": 1, "per_page": 20, "total_pages": 1 } } ``` ### Create a Scheduling Page ```bash theme={null} curl -X POST https://orbitforms.ai/v1/scheduling-pages \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "title": "Book a Demo", "slug": "book-a-demo", "description": "Schedule a product demo", "page_type": "one_on_one" }' ``` ### Get Scheduling Page Returns the scheduling page with its event types included. ```json theme={null} { "data": { "id": "550e8400-e29b-41d4-a716-446655440000", "title": "Book a Demo", "slug": "book-a-demo", "description": "Schedule a product demo with our team", "type": "schedule", "page_type": "one_on_one", "status": "published", "settings": { "confirmation_message": "You're booked!", "show_avatar": true, "redirect_url": "https://example.com/confirmed" }, "remove_branding": false, "event_types": [ { "id": "660e8400-e29b-41d4-a716-446655440001", "title": "30 Min Meeting", "slug": "30-min-meeting", "duration_minutes": 30, "location_type": "google_meet", "is_active": true, "color": "#3B82F6", "position": 0, "buffer_time_before": 0, "buffer_time_after": 10, "min_notice_minutes": 60, "max_booking_days": 14, "start_time_increment": 30, "requires_confirmation": false, "guests_allowed": true } ], "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-01-20T14:30:00Z" } } ``` ## Event Types Event types define the different kinds of meetings available on a scheduling page (e.g., "30 Min Demo", "15 Min Quick Call"). Event type endpoints are nested under their parent scheduling page. ### Endpoints | Method | Endpoint | Description | | -------- | ----------------------------------------------------- | --------------------------- | | `GET` | `/v1/scheduling-pages/{id}/event-types` | List event types for a page | | `POST` | `/v1/scheduling-pages/{id}/event-types` | Create an event type | | `GET` | `/v1/scheduling-pages/{id}/event-types/{eventTypeId}` | Get an event type | | `PATCH` | `/v1/scheduling-pages/{id}/event-types/{eventTypeId}` | Update an event type | | `DELETE` | `/v1/scheduling-pages/{id}/event-types/{eventTypeId}` | Delete an event type | ### Event Type Fields | Field | Type | Description | | ----------------------- | ------- | ------------------------------------------------------------------ | | `title` | string | Display name (e.g., "30 Min Meeting") | | `slug` | string | URL-friendly identifier (auto-generated from title if omitted) | | `duration_minutes` | integer | Meeting duration in minutes (default: 30) | | `location_type` | string | google\_meet, zoom, microsoft\_teams, phone, in\_person, or custom | | `buffer_time_before` | integer | Minutes of buffer before the meeting (default: 0) | | `buffer_time_after` | integer | Minutes of buffer after the meeting (default: 0) | | `min_notice_minutes` | integer | Minimum advance notice required (default: 60) | | `max_booking_days` | integer | How far in advance bookings are allowed (default: 14) | | `start_time_increment` | integer | Time slot intervals: 5, 10, 15, 30, or 60 minutes | | `requires_confirmation` | boolean | Whether the host must confirm the booking | | `guests_allowed` | boolean | Whether attendees can add guests | ## Meetings Meetings represent booked appointments. You can list, retrieve, update the status of, or delete meetings. ### Endpoints | Method | Endpoint | Description | | -------- | ------------------- | --------------------------------------------------------------------------- | | `GET` | `/v1/meetings` | List meetings | | `GET` | `/v1/meetings/{id}` | Get a meeting | | `PATCH` | `/v1/meetings/{id}` | Update a meeting (status, notes). Cancelling cleans up Zoom and calendar. | | `DELETE` | `/v1/meetings/{id}` | Delete a meeting. Cleans up the associated Zoom meeting and calendar event. | ### Query Parameters Use these when listing meetings: | Parameter | Type | Description | | -------------------- | ------- | ------------------------------------------------------------------------------------- | | `page` | integer | Page number (default: 1) | | `per_page` | integer | Results per page (default: 20, max: 100) | | `status` | string | Filter: scheduled, completed, cancelled, pending\_confirmation, no\_show, rescheduled | | `since` | string | ISO date. Only meetings starting after this time. | | `until` | string | ISO date. Only meetings starting before this time. | | `scheduling_page_id` | string | Filter by scheduling page UUID | ### List Meetings ```bash theme={null} curl "https://orbitforms.ai/v1/meetings?status=scheduled&since=2026-02-01T00:00:00Z" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ```json theme={null} { "data": [ { "id": "770e8400-e29b-41d4-a716-446655440010", "attendee_name": "Jane Smith", "attendee_email": "jane@example.com", "start_time": "2026-02-10T14:00:00Z", "end_time": "2026-02-10T14:30:00Z", "timezone": "America/New_York", "status": "scheduled", "meeting_link": "https://meet.google.com/abc-defg-hij", "notes": null, "guests": [], "contact_id": "880e8400-e29b-41d4-a716-446655440020", "host_user_id": "990e8400-e29b-41d4-a716-446655440030", "event_type_id": "660e8400-e29b-41d4-a716-446655440001", "scheduling_page_id": "550e8400-e29b-41d4-a716-446655440000", "created_at": "2026-02-08T09:15:00Z", "updated_at": "2026-02-08T09:15:00Z" } ], "meta": { "total": 1, "page": 1, "per_page": 20, "total_pages": 1 } } ``` ### Update a Meeting You can update the `status` (to *pending\_confirmation*, *scheduled*, *completed*, *cancelled*, *rescheduled*, or *no\_show*), `notes`, and `cancellation_reason` (when cancelling). **Cancellation cleanup:** When you set the status to *cancelled*, OrbitForms automatically deletes the associated Zoom meeting (if one was created), removes the calendar event, and sends a cancellation notification email to the attendee. ```bash theme={null} curl -X PATCH https://orbitforms.ai/v1/meetings/{id} \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "status": "completed", "notes": "Great demo call, follow-up scheduled" }' ``` ## Availability Schedules Availability schedules define working hours and date-specific overrides (holidays, vacation, etc.) for team members. These endpoints are **read-only** via the public API since availability is tied to individual user calendars. ### Endpoints | Method | Endpoint | Description | | ------ | --------------------------------- | -------------------------------- | | `GET` | `/v1/availability-schedules` | List availability schedules | | `GET` | `/v1/availability-schedules/{id}` | Get schedule with date overrides | ### Query Parameters | Parameter | Type | Description | | --------- | ------ | ---------------------------------------- | | `user_id` | string | Filter schedules by a specific user UUID | ### Get Availability Schedule Returns the schedule with its weekly rules and any date-specific overrides. ```bash theme={null} curl https://orbitforms.ai/v1/availability-schedules/{id} \ -H "Authorization: Bearer YOUR_API_KEY" ``` ```json theme={null} { "data": { "id": "aa0e8400-e29b-41d4-a716-446655440040", "user_id": "990e8400-e29b-41d4-a716-446655440030", "name": "Working Hours", "timezone": "America/New_York", "is_default": true, "rules": [ { "day": 1, "start": "09:00", "end": "17:00", "enabled": true }, { "day": 2, "start": "09:00", "end": "17:00", "enabled": true }, { "day": 3, "start": "09:00", "end": "17:00", "enabled": true }, { "day": 4, "start": "09:00", "end": "17:00", "enabled": true }, { "day": 5, "start": "09:00", "end": "17:00", "enabled": true } ], "date_overrides": [ { "id": "bb0e8400-e29b-41d4-a716-446655440050", "date": "2026-02-17", "is_unavailable": true, "reason": "Holiday" } ], "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-10T08:00:00Z" } } ``` ## Calendar These public-facing endpoints power the booking widget. They allow your contacts to check available time slots and book meetings without authentication. The availability endpoint accounts for the host's calendar events, buffer times, and date overrides. The booking endpoint creates the calendar event, generates the meeting link (Zoom or Google Meet), and sends a confirmation email to both parties. Microsoft Teams support coming soon. These are public-facing endpoints used by the booking widget. They do not require an API key or authentication. ### Endpoints | Method | Endpoint | Description | | ------ | ---------------------------- | ------------------------------------ | | `GET` | `/api/calendar/availability` | Get available time slots for booking | | `POST` | `/api/calendar/book` | Book a meeting | ### Get Available Time Slots Returns available time slots for a given host on a given date. Slots are calculated based on the host's availability schedule, existing calendar events, buffer times, and minimum notice requirements. Pass `event_type_id` (recommended) so the event type's duration, buffer, and booking-window rules apply; for round-robin and group pages, also pass `scheduling_page_id`. #### Query Parameters | Parameter | Type | Description | | -------------------- | ------- | ------------------------------------------------------------------ | | `user_id` | string | UUID of the host whose calendar to check (required) | | `team_id` | string | UUID of the team that owns the scheduler (required) | | `date` | string | Date to check, `YYYY-MM-DD` (required) | | `duration` | integer | Meeting duration in minutes (default: event type setting, or 30) | | `timezone` | string | IANA timezone, e.g. America/New\_York (default: UTC) | | `event_type_id` | string | Event type UUID whose settings drive slot generation (recommended) | | `scheduling_page_id` | string | Scheduling page UUID, for round-robin/group context (optional) | ```bash theme={null} curl "https://orbitforms.ai/api/calendar/availability?user_id=990e8400-e29b-41d4-a716-446655440030&team_id=550e8400-e29b-41d4-a716-446655440000&date=2026-02-10&event_type_id=660e8400-e29b-41d4-a716-446655440001&timezone=America/New_York" ``` ```json theme={null} { "date": "2026-02-10", "duration": 30, "timezone": "America/New_York", "available_slots": [ { "start": "2026-02-10T14:00:00.000Z", "end": "2026-02-10T14:30:00.000Z" }, { "start": "2026-02-10T14:30:00.000Z", "end": "2026-02-10T15:00:00.000Z" } ] } ``` Round-robin pages return an additional `round_robin: true` flag and an `available_host_count` on each slot. ### Book a Meeting Books a meeting for the selected time slot. Creates a calendar event on the host's calendar, generates a meeting link (Zoom or Google Meet depending on the event type configuration; Microsoft Teams coming soon), and sends a confirmation email to both the host and attendee. Booking a slot that is already taken returns a `409` error. #### Request Body | Parameter | Type | Description | | -------------------- | --------- | ------------------------------------------------------------------------ | | `user_id` | string | UUID of the host to book with (required) | | `team_id` | string | UUID of the team that owns the scheduler (required) | | `start` | string | Meeting start time, ISO 8601 — from the availability response (required) | | `end` | string | Meeting end time, ISO 8601 (required) | | `attendee_email` | string | Attendee email address (required) | | `attendee_name` | string | Attendee full name (optional; defaults to the email address) | | `title` | string | Calendar event title (optional) | | `description` | string | Calendar event description (optional) | | `timezone` | string | IANA timezone of the attendee (optional) | | `event_type_id` | string | Event type UUID being booked (optional, recommended) | | `scheduling_page_id` | string | Scheduling page UUID (optional) | | `guests` | string\[] | Array of additional guest email addresses (optional) | | `notes` | string | Additional notes or message from the attendee (optional) | | `lead_capture_data` | object | Lead capture field responses, e.g. phone number (optional) | | `custom_fields` | object | Custom field values (optional) | ```bash theme={null} curl -X POST https://orbitforms.ai/api/calendar/book \ -H "Content-Type: application/json" \ -d '{ "user_id": "990e8400-e29b-41d4-a716-446655440030", "team_id": "550e8400-e29b-41d4-a716-446655440000", "event_type_id": "660e8400-e29b-41d4-a716-446655440001", "scheduling_page_id": "550e8400-e29b-41d4-a716-446655440000", "start": "2026-02-10T14:00:00.000Z", "end": "2026-02-10T14:30:00.000Z", "timezone": "America/New_York", "attendee_name": "Jane Smith", "attendee_email": "jane@example.com", "guests": ["colleague@example.com"], "notes": "Interested in the enterprise plan" }' ``` Returns `201 Created` with the meeting record, the calendar event, and the meeting link: ```json theme={null} { "success": true, "meeting": { "id": "770e8400-e29b-41d4-a716-446655440099", "event_type_id": "660e8400-e29b-41d4-a716-446655440001", "scheduling_page_id": "550e8400-e29b-41d4-a716-446655440000", "host_user_id": "990e8400-e29b-41d4-a716-446655440030", "contact_id": "880e8400-e29b-41d4-a716-446655440020", "start_time": "2026-02-10T14:00:00.000Z", "end_time": "2026-02-10T14:30:00.000Z", "status": "scheduled", "meeting_link": "https://meet.google.com/abc-defg-hij", "timezone": "America/New_York", "created_at": "2026-02-08T12:00:00Z" }, "event": { "id": "calendar-event-id", "summary": "30 Min Meeting with Jane Smith", "start": "2026-02-10T14:00:00.000Z", "end": "2026-02-10T14:30:00.000Z", "htmlLink": "https://calendar.google.com/event?eid=..." }, "meeting_link": "https://meet.google.com/abc-defg-hij" } ``` ## Required Scopes | Scope | Description | | ------------------- | -------------------------------------------------------------- | | `scheduling:read` | Read scheduling pages, event types, and availability schedules | | `scheduling:write` | Create and update scheduling pages and event types | | `scheduling:delete` | Delete scheduling pages and event types | | `meetings:read` | Read meetings | | `meetings:write` | Update meetings (status changes, notes) | | `meetings:delete` | Delete meetings | [Next: Rate Limits](/developers/api/rate-limits) # Sequences API Source: https://docs.orbitforms.ai/developers/api/sequences Programmatically manage sequences (email and SMS steps), enroll contacts, and track engagement. Sequences are created and edited in the dashboard. The API lets you list and inspect sequences and their steps, enroll and unenroll contacts, view analytics, and manage unsubscribes. Sequences with **SMS** steps require a valid **Send from number** and Salesmsg setup as described in the [Salesmsg integration](/integrations/salesmsg) guide. ## Available Endpoints | Method | Endpoint | Description | | -------- | ------------------------------------------------- | -------------------------- | | `GET` | `/api/v1/sequences` | List all sequences | | `GET` | `/api/v1/sequences/:id` | Get sequence details | | `GET` | `/api/v1/sequences/:id/steps` | List a sequence's steps | | `GET` | `/api/v1/sequences/:id/analytics` | Get sequence analytics | | `GET` | `/api/v1/sequences/:id/enrollments` | List enrollments | | `POST` | `/api/v1/sequences/:id/enrollments` | Enroll a contact | | `DELETE` | `/api/v1/sequences/:id/enrollments/:enrollmentId` | Unenroll a contact | | `GET` | `/api/v1/sequences/unsubscribes` | List unsubscribed contacts | | `POST` | `/api/v1/sequences/unsubscribes` | Add unsubscribes | **Authentication** All Sequences API endpoints require a valid API key passed via the `Authorization: Bearer YOUR_API_KEY` header. Get your API key from the [Developer Portal](https://orbitforms.ai/developer-portal). Learn how sequences work API rate limit details # Submissions API Source: https://docs.orbitforms.ai/developers/api/submissions Retrieve and manage form submissions. Each submission contains the user's responses and metadata. Retrieve and manage form submissions. Each submission contains the user's responses and metadata. ## Endpoints | Method | Endpoint | Description | | ------ | --------------------------------- | --------------------------- | | `GET` | `/v1/forms/{form_id}/submissions` | List submissions for a form | ## Query Parameters | Parameter | Type | Description | | ---------- | ------- | -------------------------------------------- | | `page` | integer | Page number (default: 1) | | `per_page` | integer | Results per page (default: 20, max: 100) | | `since` | string | Filter submissions after this ISO 8601 date | | `until` | string | Filter submissions before this ISO 8601 date | | `status` | string | Filter by status: completed or partial | ## Example Response `GET /v1/forms/{form_id}/submissions` ```json theme={null} { "data": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "fields": { "email": "user@example.com", "message": "Hello, I have a question..." }, "status": "completed", "submitted_at": "2024-01-15T14:30:00Z", "metadata": { "referrer": "https://example.com", "user_agent": "Mozilla/5.0...", "device_type": "desktop", "utm_source": "google", "utm_medium": "cpc", "utm_campaign": "spring_sale" } } ], "meta": { "total": 150, "page": 1, "per_page": 20, "total_pages": 8 } } ``` [Next: Scheduling API](/developers/api/scheduling) # Best Practices Source: https://docs.orbitforms.ai/developers/best-practices Follow these recommendations to build reliable, secure, and performant integrations. ## Security Use environment variables, never hardcode keys in source code. Always validate the signature header before processing webhooks. All webhook URLs must use HTTPS for secure communication. Regenerate API keys regularly as a security best practice. ## Performance Cache form configurations and reduce unnecessary API calls. Request only the data you need with appropriate page sizes. Use webhooks instead of polling for real-time updates. Group related API calls when possible. ## Reliability Implement proper error handling for all API responses. Retry failed requests with increasing delays. Handle duplicate webhook deliveries gracefully. Track your API usage and stay within limits. ## Error Handling | Code | Action | | ----- | ------------------------------------------------- | | `400` | Check request parameters | | `401` | Verify API key is valid | | `429` | Implement backoff and retry | | `500` | Retry with backoff, contact support if persistent | [Next: Troubleshooting →](/developers/troubleshooting) # Core Concepts Source: https://docs.orbitforms.ai/developers/core-concepts Understand the fundamental concepts of the OrbitForms platform before diving into the API. Understand the fundamental concepts of the OrbitForms platform before diving into the API. ## Forms Forms are the primary resource in OrbitForms. Each form has a unique ID, contains fields, styling configuration, and settings for how submissions are handled. * **Form ID:** Unique identifier (a UUID, e.g., `550e8400-e29b-41d4-a716-446655440000`) * **Fields:** Input elements that collect data * **Settings:** Configuration for notifications, redirects, etc. * **Styling:** Visual appearance and branding ## Submissions Submissions are the data collected when someone fills out a form. Each submission contains the field responses, metadata, and timestamps. * **Submission ID:** Unique identifier for each response * **Fields:** Key-value pairs of submitted data * **Metadata:** Browser, IP, referrer, UTM parameters * **Timestamps:** Created and updated times ## Teams Forms belong to teams. Teams can have multiple members with different roles and permissions. ## API Keys API keys authenticate your requests. Each key is scoped to a team and can have different permission levels. ## Webhooks Webhooks send HTTP POST requests to your server when events occur, like new submissions or form updates. ## Next Steps Explore the endpoints Real-time events # Embed Script Source: https://docs.orbitforms.ai/developers/embed Add OrbitForms forms to any website. Iframe for the most reliable inline embeds; the embed script for popup, slider, sidetab, and auto-resize. ## Iframe Embed **Recommended for inline forms** — Pure HTML, no third-party script. Renders even when ad blockers, corporate firewalls, or strict CSPs would block scripts. ```html theme={null} ``` The small ` ``` Or use the JavaScript API for more control: ```html theme={null}
``` ## Popup Modal Open the form in a modal overlay when a button is clicked. There are two approaches. ### Option 1: Native dialog + iframe (recommended) Uses the native browser `` element with inline JavaScript. No third-party script, so it can't be blocked by ad blockers or strict CSPs. Universal browser support since 2022. ```html theme={null} ``` The native `` element handles the backdrop dimming, escape-to-close, focus trap, and ARIA roles automatically. Add the generated trigger class to as many buttons as you want — they'll all open the same form. Use a unique class per form if you have multiple popup embeds on the same page. Adjust the `width` and `height` inline styles on the `` to fit your form. ### Option 2: Script embed Use the embed script if you want auto-resize, event callbacks, or slider/sidetab/popover modes. This loads `embed.js` from `orbitforms.ai`, which can be blocked by aggressive ad blockers or corporate firewalls — use Option 1 above for maximum reliability. #### Auto-generated trigger button The embed script creates a styled button for you: ```html theme={null}
``` #### Trigger from your own buttons Use the JavaScript API to open a popup from any button or element on your page: Add the script tag and popup setup code to your site's footer or a custom code block. This only needs to appear once on the page. ```html theme={null} ``` Add the CSS class `orbit-popup-trigger` to every button that should open the popup. You can have as many buttons as you want across the page — they'll all trigger the same popup. Publish or deploy your site. The popup will only work on the live/published site — most website builders don't execute custom JavaScript in their preview or designer mode. **Why use a class instead of an ID?** HTML IDs must be unique — only one element per page can have a given ID. If you have multiple "Get Started" buttons, `document.getElementById` only finds the first one. Using a class with `querySelectorAll` attaches the popup trigger to every matching button. **Important:** `OrbitForms.popup()` does not open the popup immediately. It creates an instance and returns an object with `open()`, `close()`, and `toggle()` methods. You must call `.open()` to show the popup. ### Popup sizes (script embed only) The script-based popup automatically fits the form content and never overflows the viewport. On mobile, it goes full-screen. You can control the max width: | Size | Width | Best for | | -------- | ----- | ---------------------------- | | `small` | 440px | Short forms (1-3 fields) | | `medium` | 540px | Standard forms (4-8 fields) | | `large` | 700px | Long forms, multi-step flows | ### Platform-specific setup 1. In Webflow, select each button that should open the popup 2. In the Styles panel, add a class called `orbit-popup-trigger` 3. Go to **Project Settings → Custom Code → Footer Code** 4. Paste the embed script code from Step 1 above 5. **Publish** your site (custom code does not run in the Webflow Designer or preview mode) 1. Add the class `orbit-popup-trigger` to your button block (under "Additional CSS class(es)" in the block settings) 2. Add the embed script to your theme's footer, or use a plugin like "Insert Headers and Footers" 3. Save and preview 1. Add the class `orbit-popup-trigger` to your button via the button's settings 2. Go to **Settings → Advanced → Code Injection → Footer** 3. Paste the embed script code 4. Save 1. Add `class="orbit-popup-trigger"` to any button or clickable element 2. Include the embed script before `` or in your layout component ## Slider Slide the form in from the right edge of the screen. Use the native dialog + iframe option for maximum reliability. ```html theme={null} ``` To slide in from the left, swap `right:0;left:auto` to `left:0;right:auto` and change the transform to `translateX(-100%)`. ### Script-based slider Use the script embed if you need the `OrbitForms.slider()` JavaScript API: ```html theme={null} ``` ## Scheduling Popup Open a scheduling page in a popup modal. Use the native dialog + iframe option for maximum reliability. ```html theme={null} ``` Add the generated trigger class to any button that should open the scheduling popup. ### Script-based scheduling popup Use the script embed if you need the `OrbitSchedule.popup()` JavaScript API: ```html theme={null} ``` ## Scheduling Slider Slide a scheduling page in from the right edge of the screen. Use the native dialog + iframe option for maximum reliability. ```html theme={null} ``` ### Script-based scheduling slider Use the script embed if you need the `OrbitSchedule.slider()` JavaScript API: ```html theme={null} ``` ## JavaScript API All embed types are available via the `OrbitForms` and `OrbitSchedule` globals: ```javascript theme={null} // Inline — render inside a target element OrbitForms.inline('form-slug', '#container', { team: 'your-team-id' }); // Popup — centered modal var popup = OrbitForms.popup('form-slug', { team: 'your-team-id', size: 'medium' }); popup.open(); // Slider — slides in from the side var slider = OrbitForms.slider('form-slug', { team: 'your-team-id', position: 'right' }); slider.open(); // Sidetab — persistent tab on the edge of the screen var sidetab = OrbitForms.sidetab('form-slug', { team: 'your-team-id', position: 'right' }); // Popover — floating button with popover form var popover = OrbitForms.popover('form-slug', { team: 'your-team-id' }); // Scheduling — popup or slider var scheduler = OrbitSchedule.popup('schedule-slug', { team: 'your-team-id', size: 'large' }); scheduler.open(); ``` ### Options | Option | Description | | ----------------- | --------------------------------------------------------- | | `team` | Team ID — first 8 characters of your team UUID (required) | | `size` | Popup size: `small`, `medium`, `large` | | `position` | Slider/sidetab position: `left`, `right` | | `type` | Form type: `standard`, `flow` | | `buttonText` | Text on the auto-generated trigger button | | `buttonColor` | Background color of the trigger button | | `buttonTextColor` | Text color of the trigger button | | `openOnLoad` | Open the modal automatically on page load | | `keepSession` | Keep form state when closing and reopening | | `autoClose` | Auto-close delay in ms after form submission | | `hiddenFields` | Object of field values to pre-fill | ### Instance Methods Every popup, slider, sidetab, and popover call returns an instance with these methods: | Method | Description | | ----------- | ------------------------- | | `open()` | Open the modal | | `close()` | Close the modal | | `toggle()` | Toggle open/close | | `refresh()` | Reload the form | | `unmount()` | Remove the embed entirely | ### Closing behavior Popups can be closed in multiple ways: * Clicking the **X button** in the top-right corner * Clicking the **overlay** (dark area outside the popup) * Pressing the **Escape** key * Calling `popup.close()` programmatically ## Data Attributes | Attribute | Description | | ------------------------- | ----------------------------------------------------- | | `data-orbit-form` | Form slug (required) | | `data-orbit-team` | Team ID (required) | | `data-orbit-embed` | Embed type: standard, popup, slider, sidetab, popover | | `data-orbit-type` | Form type: standard, flow | | `data-orbit-button-text` | Button text for interactive embeds | | `data-orbit-button-color` | Button background color | | `data-orbit-size` | Popup size: small, medium, large | | `data-orbit-position` | Slider/sidetab position: left, right | | `data-orbit-height` | Explicit height for inline embeds | ## Events Listen for form events using CustomEvents: ```javascript theme={null} document.addEventListener('orbitFormLoaded', function(e) { console.log('Form loaded:', e.detail.slug); }); document.addEventListener('orbitFormSubmitted', function(e) { console.log('Form submitted:', e.detail); // e.detail contains: { slug, formId, embedId } }); document.addEventListener('orbitFormError', function(e) { console.error('Form error:', e.detail.message); }); document.addEventListener('orbitFormResize', function(e) { console.log('Form resized to:', e.detail.height); }); document.addEventListener('orbitPopupClosed', function(e) { console.log('Popup closed:', e.detail); // e.detail contains: { slug, type } where type is popup/slider/sidetab/popover }); ``` ## Embed Types Embed directly in page content Centered modal overlay Slides in from the side Floating tab that expands to form Anchored popover near trigger # Developer Documentation Source: https://docs.orbitforms.ai/developers/overview Welcome to the OrbitForms API documentation. Use our REST API to programmatically manage forms, retrieve submissions, and integrate OrbitForms into your applications. Welcome to the OrbitForms API documentation. Use our REST API to programmatically manage forms, retrieve submissions, and integrate OrbitForms into your applications. ## Explore the API Complete API documentation with endpoints, parameters, and response examples. Receive real-time notifications when form events occur in your account. ## Quick Example Make your first API request to list all forms in your account: ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/forms" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" ``` [View full Quick Start guide](/developers/quick-start) ## API Features Standard REST endpoints with JSON responses Secure authentication with API keys Real-time event notifications Generous rate limits for production use ## Resources Get up and running in minutes Add forms to any website Create OAuth integrations # Quick Start Source: https://docs.orbitforms.ai/developers/quick-start Get started with the OrbitForms API in just a few minutes. This guide will walk you through authentication and making your first API requests. Get started with the OrbitForms API in just a few minutes. This guide will walk you through authentication and making your first API requests. Generate an API key from your dashboard: 1. Go to **Developer Portal → API Keys** 2. Click **Generate New Key** 3. Copy and store your key securely Make your first API request to list all forms in your account: ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/forms" \ -H "Authorization: Bearer YOUR_API_KEY" ``` Retrieve submissions for a specific form: ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/forms/{form_id}/submissions" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **You're all set!** You've made your first API requests. Explore the full API reference to discover all available endpoints. ## Next Steps Explore all endpoints Real-time notifications # Troubleshooting Source: https://docs.orbitforms.ai/developers/troubleshooting Solutions to common issues developers encounter when integrating with OrbitForms. ## Common Issues This usually means your API key is invalid or expired. Check that you're using the correct key and that it's included in the Authorization header as a Bearer token. Make sure there are no extra spaces or characters. Implement exponential backoff in your retry logic. Cache responses when possible, use webhooks instead of polling, and batch operations together. Check your plan limits and consider upgrading if needed. Verify your endpoint URL is correct and accessible from the internet. Check that your server responds with a 2xx status within 30 seconds (the default delivery timeout, configurable up to 60 seconds). Review the webhook delivery logs in your dashboard for error details. Ensure you're using the raw request body (not parsed JSON) for signature verification. Check that you're using the correct webhook secret. The signature is computed on the exact bytes received. The embed script should be loaded directly from our CDN. If you're seeing CORS errors, make sure you haven't modified the script URL. The script handles CORS automatically. Check that the form slug/ID is correct and the form is published. Verify the embed script is loaded before calling OrbitEmbed methods. Check the browser console for JavaScript errors. Check your pagination parameters - you might need to fetch more pages. Verify you're using the correct form ID. There may be a slight delay before new submissions appear in the API. ## Debugging Tips * Check the response body for detailed error messages * Use test API keys during development * Review webhook delivery logs in your dashboard * Check browser console for JavaScript errors * Verify your request headers are formatted correctly * Use tools like Postman or curl to test API calls directly ## HTTP Status Codes | Code | Meaning | | ----- | ------------------------------------ | | `200` | Success | | `201` | Created | | `400` | Bad Request - Check your parameters | | `401` | Unauthorized - Invalid API key | | `403` | Forbidden - Insufficient permissions | | `404` | Not Found - Resource doesn't exist | | `429` | Too Many Requests - Rate limited | | `500` | Server Error - Contact support | ## Still stuck? Our developer support team is here to help. Include your request ID and any error messages when contacting us. [Contact Support →](/support/contact) # Webhook Events Source: https://docs.orbitforms.ai/developers/webhooks/events Subscribe to specific events to receive notifications when they occur. Select only the events you need. ## Submissions | Event | Description | | ---------------------- | --------------------------------------- | | `submission.created` | A new form submission was received | | `submission.qualified` | A submission met qualification criteria | | `submission.updated` | A submission was modified | | `submission.deleted` | A submission was deleted | [Next: Webhook Security →](/developers/webhooks/security) # Inbound Workflow Webhook Source: https://docs.orbitforms.ai/developers/webhooks/inbound-trigger Send form-shaped JSON from external systems to trigger a specific OrbitForms workflow via a signed webhook URL. ## Overview An **inbound workflow webhook** lets external systems (your backend, Zapier, Make, custom scripts) POST data into OrbitForms and run a **specific workflow** — without using the public form embed. Inbound webhooks are **always tied to a Form trigger**. You must select a form on the workflow trigger first; the webhook accepts data in the **exact same structure** as that form's fields. **The form defines the payload contract.** The accepted fields, their types, and which ones are required come directly from the selected form's current fields. If you add, rename, or remove fields on the form, the webhook's expected payload changes immediately — update your sending system to match, or requests will start failing with `422` errors. ### What happens when data arrives 1. OrbitForms validates the HMAC signature and payload structure 2. A **form submission** is created (visible in your submissions list) 3. **Only that workflow** runs — other form integrations (outbound webhooks, Slack, Zapier, etc.) are **not** triggered ## Setup: from form to first request An inbound webhook always belongs to a **workflow** whose trigger is a **form**. The form defines the payload contract, the workflow defines what happens when data arrives. Setting one up is a three-part flow: **build a form → wire up the workflow → send matching data**. ### Step 1 — Create the form Before you can enable an inbound webhook, you need a form whose fields describe the data you'll send: 1. Go to **Forms** and create a new form 2. Add a field for every piece of data your external system will send — e.g. an email field, a first-name field, a company field 3. Note each field's **name** (not its label) — the webhook payload is keyed by field name, and names must match exactly 4. Mark fields **required** if your sender must always include them The form is only used as a data contract — it does **not** need to be published, shared, or embedded anywhere. But the endpoint refuses to enable a webhook on a form with no data fields, so add at least one field first. ### Step 2 — Create the workflow and enable the webhook 1. Go to **Workflows** and create a new workflow 2. Add a **Form Submission** trigger and select the form you just created 3. In the trigger panel, toggle on **Inbound Webhook** 4. Copy the **Webhook URL** and **Signing Secret** — the secret is shown once, so store it like a password 5. Add the actions the workflow should run when data arrives (create a contact, send an email, push to your CRM, etc.) 6. **Activate** the workflow — the endpoint rejects requests with `409` while the workflow is still a draft The trigger panel displays the exact JSON structure required, keyed by each field's `name` (not label). ### Step 3 — Send data that matches the form Build a JSON object whose keys are the form's field names. If your form looks like this: | Form field label | Field `name` | Required | | ---------------- | ------------ | -------- | | Email | `email` | Yes | | First name | `first_name` | No | | Company | `company` | No | …then a valid payload looks like this: ```json theme={null} { "email": "jane@example.com", "first_name": "Jane", "company": "Acme Inc" } ``` Send it with the signature headers described below, and the workflow runs once per request. **Field names must match exactly.** `first_name` and `firstName` are different fields. If you rename, add, or remove a field on the form, the expected payload changes immediately — update your sending system to match, or requests will start failing with `422` errors telling you exactly which fields are wrong. ## Endpoint ``` POST https://orbitforms.ai/api/webhooks/inbound/{token} ``` Each workflow gets a unique `{token}` when you enable the inbound webhook. ### Required headers | Header | Description | | ------------------- | ------------------------------------------------------------------------------ | | `Content-Type` | `application/json` | | `X-Orbit-Signature` | HMAC-SHA256 signature of the **raw request body**: `sha256=` | | `X-Orbit-Timestamp` | *(Optional)* Unix timestamp in milliseconds — rejected if older than 5 minutes | ## Payload structure Send a **flat JSON object** where each key is a form field `name`: ```json theme={null} { "email": "jane@example.com", "first_name": "Jane", "last_name": "Doe", "company": "Acme Inc", "interests": ["Product A", "Product B"] } ``` ### Field types | Form field type | JSON type | Example | | -------------------------------------------------------------------------------- | ---------- | -------------------------- | | Text, email, phone, URL, textarea, number, date, time, dropdown, multiple choice | `string` | `"jane@example.com"` | | Multi-select | `string[]` | `["Option 1", "Option 2"]` | **Strict validation** * Only field names from the selected form — plus any [custom fields](#custom-fields) declared on the trigger — are allowed * Required fields must be present and non-empty * System keys starting with `_` are rejected * Unknown fields return a `422` error with details ## Custom fields You can send data that isn't part of the form — a lead score, a qualification flag, an external ID — by declaring **custom fields** on the trigger: 1. Open the workflow trigger panel with the inbound webhook enabled 2. Under **Custom fields**, add a field name (e.g. `qualified`) and choose its type — **Text** (`string`) or **List** (`string[]`) 3. Save the workflow Declared custom fields are accepted in the payload alongside the form's fields: ```json theme={null} { "email": "jane@example.com", "first_name": "Jane", "qualified": "yes" } ``` Custom field values behave exactly like form field values downstream: they're stored on the submission, can be used in **Filter** conditions (e.g. `qualified` equals `yes`), and are available to later workflow steps and field mappings. * Custom fields are **always optional** — a payload that omits them is still valid * Names must start with a letter and contain only letters, numbers, and underscores (max 64 characters, up to 20 custom fields) * A custom field cannot reuse a form field's name — the form's definition wins * Undeclared fields are still rejected with `422`, so typos fail loudly instead of silently dropping data * Like form-field edits, custom-field changes take effect as soon as the workflow is **saved** (the editor auto-saves) — they do not wait for a publish, so update your sender before removing or renaming a field the sender still uses ## Signing requests Compute the signature over the **exact raw JSON body** (before parsing): ```javascript theme={null} const crypto = require('crypto'); function signPayload(rawBody, secret) { const hmac = crypto.createHmac('sha256', secret); hmac.update(rawBody, 'utf8'); return `sha256=${hmac.digest('hex')}`; } const body = JSON.stringify({ email: 'jane@example.com', first_name: 'Jane', last_name: 'Doe', }); const signature = signPayload(body, process.env.ORBIT_WEBHOOK_SECRET); const timestamp = Date.now().toString(); // Send with fetch, axios, etc. ``` ```python theme={null} import hmac import hashlib import json import time def sign_payload(raw_body: str, secret: str) -> str: digest = hmac.new(secret.encode(), raw_body.encode(), hashlib.sha256).hexdigest() return f"sha256={digest}" body = json.dumps({"email": "jane@example.com", "first_name": "Jane"}) signature = sign_payload(body, os.environ["ORBIT_WEBHOOK_SECRET"]) timestamp = str(int(time.time() * 1000)) ``` The signing algorithm matches [outbound webhook verification](/developers/webhooks/security). Use the same HMAC-SHA256 approach with your inbound webhook secret. ## cURL example Replace `{token}`, `{secret}`, and field values with your workflow's values: ```bash theme={null} BODY='{"email":"jane@example.com","first_name":"Jane","last_name":"Doe"}' TIMESTAMP=$(date +%s000) SIGNATURE=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "YOUR_SECRET" | sed 's/^.* //') SIGNATURE="sha256=$SIGNATURE" curl -X POST "https://orbitforms.ai/api/webhooks/inbound/{token}" \ -H "Content-Type: application/json" \ -H "X-Orbit-Signature: $SIGNATURE" \ -H "X-Orbit-Timestamp: $TIMESTAMP" \ -d "$BODY" ``` ## Responses ### Success (`200`) ```json theme={null} { "success": true, "submission_id": "550e8400-e29b-41d4-a716-446655440000", "workflow_id": "660e8400-e29b-41d4-a716-446655440001" } ``` ### Error codes | Status | Meaning | | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- | | `401` | Missing or invalid `X-Orbit-Signature` | | `404` | Webhook token not found or disabled | | `409` | Workflow is not active — activate the workflow before sending data. (A **paused** workflow accepts data and queues it to run when resumed.) | | `413` | Request body exceeds 1 MB | | `422` | Payload validation failed — see `details` array | | `429` | Rate limit exceeded (100 requests/minute per team) | | `500` | Server error | Example validation error: ```json theme={null} { "error": "Payload validation failed", "details": [ "Required field \"email\" is missing or empty", "Unknown field \"unknown_field\"" ] } ``` ## Rotating the signing secret In the workflow trigger panel, use **Rotate secret** to generate a new signing secret. Update your external system immediately — requests signed with the old secret will fail. ## Disabling the webhook Toggle off **Inbound Webhook** in the trigger panel, or delete the workflow. The URL becomes invalid immediately. ## Related Receive events when forms are submitted (Orbit → your server) HMAC signature verification details Build and manage automation workflows Understand field names and types # Webhooks Overview Source: https://docs.orbitforms.ai/developers/webhooks/overview Webhooks allow your application to receive real-time HTTP notifications when events occur in OrbitForms. ## How Webhooks Work Configure a webhook endpoint URL in your dashboard Select which events you want to receive When an event occurs, we send a POST request to your URL Your server processes the payload and returns a 2xx response ## Payload Format All webhook payloads follow this structure: ```json theme={null} { "event": "submission.created", "timestamp": "2024-01-15T14:30:00Z", "data": { "form_id": "550e8400-e29b-41d4-a716-446655440000", "form_title": "Contact Form", "form_slug": "contact-form", "submission_id": "660e8400-e29b-41d4-a716-446655440001", "submission_data": { "email": "user@example.com", "name": "John Doe" }, "submitted_at": "2024-01-15T14:30:00Z", "metadata": { "referrer": "https://example.com", "user_agent": "Mozilla/5.0...", "device_type": "desktop", "utm_source": "google", "utm_medium": "cpc", "utm_campaign": "spring_sale" } } } ``` ## Learn More All available webhook events Verify webhook signatures ## Best Practices * Return a 2xx response within 30 seconds (the default timeout, configurable up to 60 seconds per webhook) * Process webhooks asynchronously for long operations * Implement idempotency to handle duplicate deliveries * Always verify the webhook signature # Webhook Security Source: https://docs.orbitforms.ai/developers/webhooks/security Verify webhook signatures to ensure requests are genuinely from OrbitForms and haven't been tampered with. ## Signature Header Every webhook request includes a signature in the `X-Orbit-Signature` header: ``` X-Orbit-Signature: sha256=abc123def456... ``` ## Verification Example Here's how to verify the signature in Node.js: ```javascript theme={null} const crypto = require('crypto'); function verifyWebhookSignature(payload, signature, secret) { const expectedSignature = crypto .createHmac('sha256', secret) .update(payload, 'utf8') .digest('hex'); const expected = `sha256=${expectedSignature}`; return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from(expected) ); } // Usage in Express — the signature is computed over the raw request body, // so mount express.raw() for this route (express.json() would re-serialize // the body and break verification) app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.headers['x-orbit-signature']; const isValid = verifyWebhookSignature( req.body.toString('utf8'), signature, process.env.WEBHOOK_SECRET ); if (!isValid) { return res.status(401).send('Invalid signature'); } // Process webhook... res.status(200).send('OK'); }); ``` **Important** Always verify the signature before processing webhook data. Never trust webhook payloads without verification. ## Webhook Secret Your webhook secret is available in your dashboard under **Integrations → Webhooks**. If you suspect it has been compromised, you can regenerate it at any time. * Store the secret in environment variables * Never commit secrets to version control * Rotate secrets periodically for security [Next: Embed Script →](/developers/embed) # Analytics Source: https://docs.orbitforms.ai/getting-started/analytics Track form performance and understand how users interact with your forms. ## Key Metrics Total form loads Users who began filling Successful submissions Views to submissions ## Viewing Analytics Analytics are available on the **Analytics** tab of the form detail page. You can see: * Activity and engagement trend charts (views, starts, and completions over time) * Conversion and completion rate trends * Field-level drop-off analysis showing where users abandon the form (last 30 days) * Abandoned (partial) submissions — available on the Business plan and above # Best Practices Source: https://docs.orbitforms.ai/getting-started/best-practices Follow these proven practices to create forms that convert better and provide a great user experience. Follow these proven practices to create forms that convert better and provide a great user experience. Small improvements can lead to significant gains. ## Form Design | | Do | Don't | | - | ----------------------------- | ------------------------------------------------- | | ✅ | Keep forms short and focused | ❌ Ask for unnecessary information | | ✅ | Use clear, descriptive labels | ❌ Use jargon or ambiguous terms | | ✅ | Group related fields together | ❌ Scatter related information throughout the form | * Every extra field can reduce completion rates by 5-10% * Labels should tell users exactly what to enter * Use sections to organize complex forms ## User Experience | | Do | Don't | | - | -------------------------------------- | --------------------------------------- | | ✅ | Show progress indicators on long forms | ❌ Leave users guessing how much is left | | ✅ | Use inline validation | ❌ Wait until submission to show errors | | ✅ | Make the submit button stand out | ❌ Hide or minimize the call to action | * Flow Forms automatically show progress * Help users fix mistakes as they type * Use contrasting colors for your submit button ## Mobile Optimization | | Do | Don't | | - | ----------------------------- | --------------------------------------- | | ✅ | Test on mobile devices | ❌ Assume desktop designs work on mobile | | ✅ | Use appropriate input types | ❌ Use text inputs for everything | | ✅ | Make tap targets large enough | ❌ Crowd elements too close together | * Over 50% of form submissions come from mobile * Email fields show @ keyboard, number fields show numpad * Minimum 44x44px for touch targets ## Conversion Optimization | | Do | Don't | | - | --------------------------------- | --------------------------------------------- | | ✅ | Start with easy questions | ❌ Ask sensitive info upfront | | ✅ | Use social proof when appropriate | ❌ Leave users wondering if they can trust you | | ✅ | Customize the thank you message | ❌ Use generic confirmation text | * Build trust before asking for email or phone * Mention how many people have signed up * Set expectations for what happens next ## Key Takeaways * Less is more — only ask for what you truly need * Test on mobile — most users are on their phones * Build trust — start easy and explain why you need info * Optimize continuously — use analytics to find drop-off points # Billing & Plans Source: https://docs.orbitforms.ai/getting-started/billing Manage your subscription and view plan details. ## Plans * **Up to 3 forms** * **50 form responses / month** * 1 team member * Basic analytics * Everything in Free * **Up to 10 forms** * **1,000 form responses / month** * Unlimited team members * Remove Orbit branding * Search engine indexing for forms * Advanced analytics * Lead Capture + Schedule * 3 workflow automations * Everything in Pro * **Unlimited forms** * **10,000 form responses / month** * **Group and Round Robin scheduling** * Unlimited workflows * 100 AI credits/mo * Priority support * Everything in Business * **100,000 form responses / month** * Sequences * Contact owner assignment * SMS messaging (Salesmsg, with Sequences) * Custom domains Annual plans get 12× the monthly response cap as a single yearly bucket. ## Managing Your Subscription * Go to Billing in your dashboard (via Settings or sidebar) * View current plan and usage * Upgrade or downgrade anytime * Update payment method * View invoices and billing history # Form Editor Overview Source: https://docs.orbitforms.ai/getting-started/editor Learn how to use the OrbitForms form editor to create beautiful, high-converting forms. Learn how to use the OrbitForms form editor to create beautiful, high-converting forms. ## Editor Layout The form editor is divided into three main sections: Add and reorder fields (Build), style your form (Design), and configure what happens after submission See how your form looks in real-time Configure the selected field's label, validation, and conditional logic ## Quick Actions Click a field type in the Build tab to add it, then drag to reorder Changes auto-save, click Publish to go live # Embedding Forms Source: https://docs.orbitforms.ai/getting-started/embedding Add your form directly to your website with our embed code. Add your form directly to your website with our embed code. ## Embed Types Form appears within your page content Form opens in a centered modal overlay Form slides in from the right edge of the screen ## How to Embed For Popup and Slider embeds, add the generated trigger class to any button or link on your site to open the form. # Exporting Data Source: https://docs.orbitforms.ai/getting-started/export Download your form submissions for analysis or backup. ## Export Options Download submissions as a spreadsheet-compatible file Apply search or filters first to export only matching submissions Export includes all fields plus submission date metadata ## How to Export Go to your form's Submissions tab Click the "Export CSV" button (search or filter first if you only want a subset) Your CSV file downloads automatically # Adding Fields Source: https://docs.orbitforms.ai/getting-started/fields OrbitForms offers a variety of field types to collect any kind of information from your users. OrbitForms offers a variety of field types to collect any kind of information from your users. ## Available Field Types ### Input Fields Single line text input Multi-line text Email with validation Phone number input Numeric input with optional min/max Date picker Time picker URL input Upload files Pre-built name fields ### Choice Fields Pick one option Select from a dropdown Pick multiple options Star rating scale Numeric scale (e.g. 1-5) ### Layout & Advanced Section heading text Static text block Visual separator Stores a value without showing it to respondents ## Field Settings Each field can be customized with: * Custom label and placeholder text * Required/optional toggle * Validation rules (e.g. min/max for number fields) * Help text for users * Conditional visibility (show or require a field based on earlier answers) # Create Your First Form Source: https://docs.orbitforms.ai/getting-started/first-form Build your first form in under 5 minutes. This guide walks you through creating, customizing, and publishing a form from start to finish. Build your first form in under 5 minutes. This guide walks you through creating, customizing, and publishing a form from start to finish. Takes about 5 minutes ## Step by Step Go to your OrbitForms dashboard. If you don't have an account yet, you can sign up for free. * Use Google or email to sign up * A team workspace is created automatically From your Forms page, click the "Create Form" button. * Give your form a descriptive name Select between a Standard form (all fields visible) or a Flow form (one question at a time). * Flow Forms have higher completion rates * Standard Forms work great for simple surveys Use the editor to add fields like email, text, dropdowns, and more. Drag to reorder. * Mark important fields as required * Add descriptions to help users Match your brand by choosing colors, fonts, and adding your logo. * Use your brand colors for consistency * Preview on different devices Click Publish to make your form live. Share via link or embed on your website. * Copy the direct link to share anywhere * Use embed code for your website ## What's Next? Learn all editor features Build conversational forms **Ready to start?** Create your free account and build your first form now. [Get Started Free →](https://orbitforms.ai/signup) # Flow Forms Source: https://docs.orbitforms.ai/getting-started/flow-forms Create conversational, one-question-at-a-time form experiences that boost completion rates. Create conversational, one-question-at-a-time form experiences that boost completion rates. ## Why Flow Forms? Users are more likely to finish when focused on one question Keyboard navigation lets users fly through questions Animated transitions create a polished, professional impression ## Creating a Flow Form ## End With a Scheduler Flow forms can show one of your [scheduling pages](/guides/scheduling) right on the thank-you screen — respondents book a meeting without leaving the form, with their name and email prefilled from their answers. Configure it in the editor under **After Submission → Scheduler**. See [Show a Scheduler After Submission](/guides/flow-forms#show-a-scheduler-after-submission) for details. # Connect Apps Source: https://docs.orbitforms.ai/getting-started/integrations Connect OrbitForms to your favorite tools and automate your workflows. ## Popular Integrations Connect to 5,000+ apps Mailchimp, ActiveCampaign HubSpot, Salesforce, Pipedrive, Close, Attio Slack, Notion, Google Sheets, Airtable ## Setting Up Integrations Go to **Integrations** in the dashboard sidebar Click the card of the app you want to connect Follow the authorization steps (OAuth or API key, depending on the app) Configure how form fields map to the app's fields # Account Settings Source: https://docs.orbitforms.ai/getting-started/settings Manage your account preferences and team settings. ## Settings Overview Update your name, email, and profile picture Control email notifications and alerts Set up a custom domain for your forms (Advanced plan) Invite members, manage roles, and configure team settings ## Accessing Settings Click **Settings** in the sidebar to access workspace settings (email & calendar, meeting types, tags, custom fields, email sending, domains, and team). Click your profile picture for your personal profile. Team settings are available to admins and owners. # Share Options Source: https://docs.orbitforms.ai/getting-started/sharing Multiple ways to get your form in front of your audience. Multiple ways to get your form in front of your audience. ## Sharing Methods Copy your unique form URL to share anywhere Add the form to your website inline, as a popup, or as a slider ## Getting Your Link You can customize the form's URL slug from the Share tab, and on the Advanced plan you can serve forms from your own custom domain. # Styling Your Form Source: https://docs.orbitforms.ai/getting-started/styling Make your forms match your brand with custom colors, fonts, and backgrounds. Make your forms match your brand with custom colors, fonts, and backgrounds. ## Customization Options Primary color, background, text, and button colors Choose from popular Google Fonts or use system fonts Solid colors, gradients, or transparent ## How to Style # Viewing Submissions Source: https://docs.orbitforms.ai/getting-started/submissions Access and manage all responses collected through your forms. ## Submission Features See all submissions in a clean table view Find specific submissions by any field value Filter by submission status or any field value with operators like equals, contains, or starts with Remove individual submissions when needed ## Accessing Submissions Go to Forms in your dashboard Click on the form you want to view Select the "Submissions" tab Browse, search, or export your data # Team Management Source: https://docs.orbitforms.ai/getting-started/team Collaborate with your team on forms and submissions. ## Team Features Add teammates via email invitation Assign admin, editor, or viewer roles All team members see the same forms and submissions ## Roles Explained | Role | Permissions | | ---------- | -------------------------------------------- | | **Owner** | Full access, billing, can delete team | | **Admin** | Manage forms, members, settings, and billing | | **Editor** | Create and edit forms, view submissions | | **Viewer** | View forms and submissions only | # Webhooks Source: https://docs.orbitforms.ai/getting-started/webhooks Send real-time data to your own servers or third-party services. ## What are Webhooks? Webhooks automatically send form data to a URL you specify whenever someone submits your form. This allows you to: * Sync data to your own database * Trigger custom workflows * Connect to apps without native integrations * Build custom automation ## Setting Up a Webhook Webhooks are available on the Pro plan and above. Go to **Integrations** in the dashboard sidebar Click the **Webhooks** integration Click **Add Webhook** Enter your endpoint URL and choose which forms it applies to Optionally set a signing secret and custom headers Click **Send Test** to verify your endpoint receives a sample payload Webhooks fire on the **Form Submitted** event (`submission.created`) whenever a matching form receives a submission. # Welcome to OrbitForms Source: https://docs.orbitforms.ai/getting-started/welcome Get started with OrbitForms and discover how to build intelligent, high-converting forms for your business. Get started with OrbitForms and discover how to build intelligent, high-converting forms for your business. Whether you're collecting leads, gathering feedback, or running surveys, this guide will help you make the most of OrbitForms. ## Why Choose OrbitForms? Create beautiful forms in minutes, not hours. Our intuitive editor makes form building effortless. Optimized for conversions with smart features like Flow Forms that guide users step-by-step. Track submissions, analyze performance, and optimize your forms with built-in analytics. Team workspaces, role-based access, and integrations with the tools you already use. ## Get Started Step-by-step guide to building your first form in under 5 minutes Learn the basics of the form editor and all its features ## What You'll Learn * **Form Building Basics** — Create and customize forms with our drag-and-drop editor * **Flow Forms** — Build conversational, one-question-at-a-time experiences * **Styling & Branding** — Match your forms to your brand with custom colors and fonts * **Publishing & Sharing** — Share forms via link or embed them on your website * **Viewing Responses** — Track submissions and analyze form performance * **Integrations** — Connect with your favorite tools via webhooks and native integrations **Ready to build your first form?** Jump right in and create a form in under 5 minutes with our step-by-step guide. [Create Your First Form →](/getting-started/first-form) # Workflows Source: https://docs.orbitforms.ai/getting-started/workflows Automate what happens after a form submission. Route data to CRMs, send notifications, enrich leads, and more — all without code. ## What are Workflows? Workflows are automated sequences that trigger when someone submits your form. They let you connect OrbitForms to your other tools and automate repetitive tasks. Runs on every submission Route based on responses Qualify leads with AI 15+ native integrations ## Creating a Workflow Go to **Workflows** in the dashboard sidebar Click **New Workflow** (or **Create Workflow** on the empty state) Add a trigger, then add nodes to build your automation sequence Configure each node with your settings Click **Activate** to set the workflow live ## Workflow Node Types Starts the workflow — on form submission, abandoned form, or meeting booked Classify leads into qualification buckets or summarize responses using AI Score leads with rule-based criteria Only continue if conditions are met Branch submissions down different paths based on responses Wait a specified time before continuing Send data to CRMs, Slack, email, webhooks, etc. ## Available Destinations Send your form data to any of these connected apps: * HubSpot * Salesforce * Pipedrive * Close * Attio * Slack * Email * Webhooks * Airtable * Google Sheets * Notion * Mailchimp * ActiveCampaign * Zapier ## Example Use Cases Classify leads with AI, then route high-intent leads to your CRM and notify sales on Slack Add subscribers to Mailchimp and send a welcome email automatically Create tickets in your helpdesk and notify the support team Store applications in Airtable and send confirmation emails ## Learn More * [Integrations documentation](/getting-started/integrations) * [See all workflow features](/getting-started/webhooks) # AI SDR Qualifying Source: https://docs.orbitforms.ai/guides/ai-nodes/qualifying Automatically classify inbound leads into qualification buckets using AI. Get human-readable reasoning and recommended next actions for every submission. ## Overview The AI SDR Qualifying node acts like an intelligent sales development rep. Instead of using rigid rules or point-based scoring, it analyzes each lead holistically and classifies them into meaningful qualification buckets with clear reasoning. ### What makes it different Assigns leads to qualification buckets instead of numeric scores. Sales knows exactly what action to take. Every classification comes with clear explanations your team can understand and trust. ## How to Use In your workflow, click "Add Node" and select "SDR Qualifying" from the AI Processing category. For best results, place the SDR Agent after a Clay enrichment node so the AI has company data to analyze. Write a description of your ideal customer profile. Be specific about company size, industry, and characteristics you're looking for. Add field-based auto-disqualify rules (e.g., "Email contains @gmail.com" or "Company is empty"). Leads matching a rule are assigned to a non-qualified bucket immediately, skipping the AI call entirely — this saves AI credits on obvious non-fits. Access classification results via template variables like `{{agent.bucket}}`, `{{agent.primary_reasons}}`, and `{{agent.recommended_action}}`. ## Configuration ### ICP Description (Required) A free-text description of your ideal customer profile. The AI uses this to evaluate fit. ``` Example: "B2B SaaS companies doing $1M–$50M ARR with internal marketing teams that actively run paid ads." ``` ### Auto-Disqualify Rules (Optional) Deterministic field rules that run before the AI. Each rule combines a field, an operator (equals, contains, is empty, etc.), and a value. A lead matching any rule is classified into a non-qualified bucket without an AI call, so you don't spend AI credits on obvious non-fits. Example: `Email` `contains` `@gmail.com` if you only want business emails, or `Company` `is empty` to skip leads with no company. ## Qualification Buckets Every agent starts with two default buckets — **Qualified** and **Not Qualified** — and you can add, rename, describe, or remove buckets to match your process (a minimum of two is required). Optional templates like **High-Intent ICP Match**, **Good ICP, Low/Medium Intent**, **Potential Future Fit**, **Wrong ICP**, and **Spam / Invalid** can be added for more granular routing. For each bucket you control: | Setting | Description | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | **Name & description** | What the bucket is called and what makes a lead fit it — the description guides the AI's classification | | **Qualified toggle** | Whether leads in this bucket count as qualified for routing and filtering | | **Contact status** | Optionally write a qualification status (Qualified, Unqualified, Pending) back to the contact record when a lead lands in this bucket | The AI classifies each lead into exactly one of your buckets with a confidence score and reasoning. ## Output Variables | Variable | Description | | ------------------------------ | ---------------------------------------------- | | `{{agent.bucket}}` | The assigned qualification bucket | | `{{agent.confidence}}` | Confidence score from 0.0 to 1.0 | | `{{agent.primary_reasons}}` | Array of reasons explaining the classification | | `{{agent.risks_or_unknowns}}` | Any uncertainties or missing information | | `{{agent.recommended_action}}` | Suggested next step | ## Best Practices * Be specific in your ICP description — the more context, the better the AI can classify leads * Use enrichment data from Clay before the SDR Agent for richer classification * Route high-intent leads to immediate notifications (Slack, email) and CRM creation * Use a Filter node after SDR Agent to branch based on bucket (e.g., only send qualified leads to HubSpot) * Review classification results periodically to refine your ICP description ## Example Workflow A typical lead qualification workflow using the SDR Agent: **Flow:** Form Submission → Clay Enrichment → SDR Agent → Router **Router conditions:** * Qualified → Slack notification + HubSpot * Not Qualified → No action (or a long-term nurture sequence) If you've added more granular buckets (e.g. High-Intent ICP Match, Potential Future Fit), you can route each one to a different path. ## Next Steps Generate AI summaries of submissions Explore all workflow nodes # AI SDR Summarizer Source: https://docs.orbitforms.ai/guides/ai-nodes/summarizer Automatically generate concise AI summaries of form submissions. Perfect for long-form responses, feedback, and detailed inquiries. ## Overview The AI Summarizer node analyzes all text fields in a form submission and generates a concise, readable summary. This is especially useful when you have open-ended questions that generate lengthy responses — instead of reading paragraphs of text, your team gets the key points instantly. ### Key Benefits Quickly understand submission content without reading every word. Include summaries in Slack messages or emails for at-a-glance context. ## How to Use In your workflow, click "Add Node" and select "Summarizer" from the AI Processing category. Draw a connection from your Form Submission trigger (or any upstream node) to the Summarizer. By default the AI summarizes all submission data. Optionally pick specific fields to focus on. Guide the summary with free-text instructions — e.g. "Focus on the prospect's needs and timeline. Keep it under 3 sentences." Access the generated summary via `{{agent.summary}}` in email notifications, Slack messages, or CRM notes. ## Configuration ### Key Fields to Summarize (Optional) Select specific fields for the AI to focus on. Leave empty to summarize all available submission data. ### Summary Instructions (Optional) Free-text instructions for how to generate the summary. Useful for specific formats or focus areas. ``` Example: "Summarize this form submission in 2-3 sentences. Focus on the main request, urgency level, and any specific requirements mentioned." ``` ### ICP Context (Optional) Describe your target audience so the AI generates more relevant summaries. You can use your team's default ICP (from AI Agents → Training) or write a custom one for this node. ## Output Variables | Variable | Description | | ------------------- | -------------------------------------------- | | `{{agent.summary}}` | The generated summary of the form submission | ## Use Cases Condense lengthy customer feedback or survey responses into actionable insights. Summarize detailed support tickets so agents can triage faster. Extract key details from demo requests or contact forms for faster follow-up. Summarize job applications, partnership requests, or vendor submissions. ## Example: Email Notification with Summary A common pattern is to include the AI summary in your team's notification so everyone gets instant context. The Email Notification node supports template variables, so you can drop the summary straight into the message body. **Email Message Template:** ``` New submission from {{field.name}} ({{field.email}}) AI Summary: {{agent.summary}} ``` The Slack destination also includes agent outputs (including the summary) in its structured message automatically. ## Best Practices * Use summaries for forms with long-form text fields (feedback, descriptions, messages) * Include the summary in Slack and email notifications for faster team response * Combine with the SDR Agent — use the summary for context and the bucket for routing * For support forms, use summary instructions to extract urgency and issue type * Ask for concise output in the summary instructions when the summary will appear in notifications **Pro Tip:** Add both Summarizer and SDR Agent nodes in your workflow. Use `{{agent.summary}}` for readable notifications and `{{agent.bucket}}` for routing decisions. The Summarizer provides context while the SDR Agent provides actionable classification. ## Next Steps Classify leads with AI reasoning Use summaries in email alerts # Analytics Source: https://docs.orbitforms.ai/guides/analytics Track your form performance with real-time analytics and insights. ## Dashboard Overview Access analytics from your form's **Analytics** tab. View real-time performance metrics and trends at a glance. **Example stats:** | Metric | Description | | --------------- | ------------------------- | | 1,234 views | Total form loads | | 892 starts | Users who began filling | | 456 submissions | Completed submissions | | 37% conversion | Views to submissions rate | ## Key Metrics Total number of times your form was loaded or viewed. Number of users who began filling out the form (entered at least one field). Number of completed form submissions. Percentage of views that resulted in a submission. Higher is better. ## Time Period Analytics are based on the **last 30 days** of form interactions, with trend charts showing views, starts, submissions, and conversion rate over that period. ## Drop-off Analysis For **Orbit Flows** (multi-step flow forms), analytics show where users drop off in the funnel. Identify which questions or steps have the highest abandonment so you can improve them. Use drop-off analysis to find friction points. If many users abandon at a specific step, consider simplifying the question, making it optional, or improving the flow. ## Next Steps Connect analytics to Meta Pixel, Google Analytics, and more Learn how to build multi-step forms with drop-off insights # API Reference Source: https://docs.orbitforms.ai/guides/api-reference Programmatically interact with OrbitForms to manage forms, submissions, scheduling, meetings, and more. ## Authentication Include your API key in the `Authorization` header: ``` Authorization: Bearer YOUR_API_KEY ``` Keep your API key secret. Do not expose it in client-side code or public repositories. ## Base URL ``` https://orbitforms.ai/api/v1 ``` ## Endpoints ### Forms **List all forms** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/forms" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Get form submissions** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/forms/:formId/submissions" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Create form** (`title` is required) ```bash theme={null} curl -X POST "https://orbitforms.ai/api/v1/forms" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"title": "My Form", "fields": [...]}' ``` ### Contacts **List contacts** (with optional filters: `page`, `per_page`, `status`, `search`, `tag`) ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/contacts?status=active&per_page=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Get contact** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/contacts/:contactId" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Update contact** ```bash theme={null} curl -X PATCH "https://orbitforms.ai/api/v1/contacts/:contactId" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"custom_fields": {"company": "Acme Inc"}}' ``` **Add tag to contact** ```bash theme={null} curl -X POST "https://orbitforms.ai/api/v1/contacts/:contactId/tags" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"tag_id": "tag_xyz"}' ``` **Remove tag from contact** ```bash theme={null} curl -X DELETE "https://orbitforms.ai/api/v1/contacts/:contactId/tags?tag_id=tag_xyz" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Contact Tags **List contact tags** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/contact-tags" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Create contact tag** ```bash theme={null} curl -X POST "https://orbitforms.ai/api/v1/contact-tags" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "High Intent"}' ``` **Delete contact tag** ```bash theme={null} curl -X DELETE "https://orbitforms.ai/api/v1/contact-tags/:tagId" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Scheduling Pages **List scheduling pages** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/scheduling-pages" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Get scheduling page** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/scheduling-pages/:id" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Create scheduling page** (`title` is required) ```bash theme={null} curl -X POST "https://orbitforms.ai/api/v1/scheduling-pages" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"title": "30-min Call", "page_type": "one_on_one"}' ``` **Delete scheduling page** ```bash theme={null} curl -X DELETE "https://orbitforms.ai/api/v1/scheduling-pages/:id" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Meetings **List meetings** (optional filters: `status`, `since`, `until`, `scheduling_page_id`, `page`, `per_page`) ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/meetings?status=completed&per_page=20" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Get meeting** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/meetings/:id" \ -H "Authorization: Bearer YOUR_API_KEY" ``` Example response: ```json theme={null} { "data": { "id": "meeting_abc123", "status": "completed", "attendee_name": "Jane Doe", "attendee_email": "client@example.com", "start_time": "2026-03-07T14:00:00Z", "end_time": "2026-03-07T14:30:00Z", "timezone": "America/New_York", "meeting_link": "https://...", "notes": "Discussed pricing and implementation timeline", "scheduling_page_id": "page_xyz", "created_at": "2026-03-01T09:00:00Z" } } ``` **Update meeting** (allowed fields: `status`, `notes`, `cancellation_reason`) ```bash theme={null} curl -X PATCH "https://orbitforms.ai/api/v1/meetings/:id" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"status": "cancelled", "cancellation_reason": "Requested by attendee"}' ``` **Delete meeting** ```bash theme={null} curl -X DELETE "https://orbitforms.ai/api/v1/meetings/:id" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Availability Schedules **List availability schedules** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/availability-schedules" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Get availability schedule** ```bash theme={null} curl -X GET "https://orbitforms.ai/api/v1/availability-schedules/:id" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Sequences Sequences have a separate API reference. See [Sequences API](/developers/api/sequences) for full documentation. ## Rate Limits API requests are rate limited per API key. Read endpoints allow **1,000 requests per minute**; creation endpoints have their own hourly caps (for example, 100 form creations per hour). OAuth apps receive tiered limits based on their verification status. Exceeding a limit returns `429 Too Many Requests` with a `Retry-After` header telling you when to try again. ## Iframe Tracking Integration Send tracking parameters from your page into OrbitForms forms for attribution and analytics. ### How It Works 1. **Pass tracking fields to the form** — Add `comet_token` as a query param on the form's URL, or send any of the supported fields from your page into the embedded form via `postMessage` 2. **Orbit captures them** — When a user submits, these values are stored with the submission 3. **Use in workflows** — Reference them in workflows, webhooks, or exports for attribution reporting Arbitrary URL parameters can also be captured with [Hidden fields](/guides/form-fields) — set a hidden field's value source to "URL parameter" and it will store that query param with every submission. ### Supported Tracking Fields | Field | Description | | ---------------- | --------------------------- | | `comet_token` | Cometly attribution token | | `attribution_id` | Generic attribution ID | | `tracking_id` | Campaign or source tracking | | `visitor_id` | Visitor identifier | | `session_id` | Session identifier | Example (JavaScript, parent page of an iframe embed): ```javascript theme={null} // Send tracking fields into the embedded form const iframe = document.querySelector('iframe'); iframe.contentWindow.postMessage({ comet_token: 'abc123', attribution_id: 'campaign_xyz', visitor_id: getVisitorId() }, 'https://orbitforms.ai'); ``` When embedding via iframe, the parent page can also pass these fields to the form with `postMessage` — see the Cometly iframe-tracking pattern linked in the [Embed Script documentation](/developers/embed). If you're an analytics or attribution provider and want to integrate with OrbitForms, contact support for partnership options. ## Next Steps Receive real-time submission data Connect to CRMs and tools # Billing & Plans Source: https://docs.orbitforms.ai/guides/billing Understand OrbitForms's pricing plans, manage your subscription, and learn about AI credits. ## Pricing Overview OrbitForms offers four plans so you can start free and upgrade as you grow. Each plan includes a per-billing-period response cap — annual plans get **12×** the monthly limit as a single bucket for the year. No credit card required to get started. Upgrade your plan whenever you need more features. No long-term contracts. Cancel when you need to. ## Plans * **Up to 3 forms** * **50 form responses / month** * Standard & flow forms * Basic customization * Email notifications * Basic analytics * Everything in Free * **Up to 10 forms** * **1,000 form responses / month** (12,000 / year on annual) * Unlimited team members * Remove branding * Search engine indexing for forms * Custom CSS * Redirect after submission * Conditional routing * Advanced analytics * Slack & webhooks * Contact tagging * Lead Capture + Schedule * 3 workflows **Most Popular** * Everything in Pro * **Unlimited forms** * **10,000 form responses / month** (120,000 / year on annual) * **Group and Round Robin scheduling** * 100 AI credits/month * AI Agent workflows * Unlimited workflows * A/B testing * Partial submissions * Contact tagging * Priority support * Everything in Business * **100,000 form responses / month** (1,200,000 / year on annual) * Sequences * Contact owner assignment * SMS messaging (Salesmsg, with Sequences) * Custom domains * 100 AI credits/month See the [full pricing comparison](https://orbitforms.ai/pricing) for detailed feature breakdowns. ## Feature Comparison | Category | Free | Pro | Business | Advanced | | --------------------------------------------------- | ---------------------------- | --------- | --------- | ---------- | | **Forms & Responses** | | | | | | Forms | 3 | 10 | Unlimited | Unlimited | | Form responses | 50/mo | 1,000/mo | 10,000/mo | 100,000/mo | | Standard forms | ✓ | ✓ | ✓ | ✓ | | Flow forms | ✓ | ✓ | ✓ | ✓ | | Conditional logic | ✓ | ✓ | ✓ | ✓ | | File uploads | ✓ | ✓ | ✓ | ✓ | | **Design & Branding** | | | | | | Basic styling | ✓ | ✓ | ✓ | ✓ | | Custom CSS | — | ✓ | ✓ | ✓ | | Remove branding | — | ✓ | ✓ | ✓ | | Redirect after submit | — | ✓ | ✓ | ✓ | | Custom domains | — | — | — | ✓ | | **Scheduling** | | | | | | 1:1 scheduling | ✓ | ✓ | ✓ | ✓ | | Lead Capture + Schedule | — | ✓ | ✓ | ✓ | | Group scheduling | — | — | ✓ | ✓ | | Round Robin scheduling | — | — | ✓ | ✓ | | **Team & Collaboration** | | | | | | Team members | 1 | Unlimited | Unlimited | Unlimited | | **Integrations** | | | | | | Email notifications | ✓ | ✓ | ✓ | ✓ | | Zapier | ✓ | ✓ | ✓ | ✓ | | CRMs (HubSpot, Salesforce, Close, Pipedrive, Attio) | — | ✓ | ✓ | ✓ | | Google Sheets / Airtable / Notion | ✓ | ✓ | ✓ | ✓ | | Mailchimp / ActiveCampaign | ✓ | ✓ | ✓ | ✓ | | Slack | — | ✓ | ✓ | ✓ | | Webhooks | — | ✓ | ✓ | ✓ | | Clay | — | ✓ | ✓ | ✓ | | Email verification | — | ✓ | ✓ | ✓ | | SMS | — | — | — | ✓ | | **Workflows** | | | | | | Workflows | 1 (email notifications only) | 3 | Unlimited | Unlimited | | Email notification nodes | ✓ | ✓ | ✓ | ✓ | | Logic nodes | ✓ | ✓ | ✓ | ✓ | | CRM nodes | — | ✓ | ✓ | ✓ | | Enrichment | — | ✓ | ✓ | ✓ | | Email verification | — | ✓ | ✓ | ✓ | | Slack / webhook nodes | — | ✓ | ✓ | ✓ | | AI Agent | — | — | ✓ | ✓ | | Sequence | — | — | — | ✓ | | **Advanced Features** | | | | | | Basic analytics | ✓ | ✓ | ✓ | ✓ | | Advanced analytics | — | ✓ | ✓ | ✓ | | A/B testing | — | — | ✓ | ✓ | | Partial submissions | — | — | ✓ | ✓ | | Contact tagging | — | ✓ | ✓ | ✓ | | AI credits | 0 | 0 | 100/mo | 100/mo | | Sequences | — | — | — | ✓ | | Contact owner | — | — | — | ✓ | | Priority support | — | — | ✓ | ✓ | **Integrations vs Workflows:** Integrations connect your forms to external tools (e.g., Slack, CRMs). Workflows let you automate multi-step logic with conditions, delays, and AI. Some integrations are available at the form level; workflow nodes unlock more automation options. ## Response Limits Every plan includes a per-billing-period response cap. Each accepted form submission counts toward the cap. | Plan | Monthly | Annual (12×) | | -------- | ------- | ------------ | | Free | 50 | n/a | | Pro | 1,000 | 12,000 | | Business | 10,000 | 120,000 | | Advanced | 100,000 | 1,200,000 | **How the cap works** * The cap is **inclusive**: a Free team gets exactly 50 accepted responses per month — the 50th submission is the last one accepted. * We email the team owner at **50%, 90%, and 100%** of the cap so there are no surprises. A dashboard popup also appears at each threshold. * When you reach 100%, your forms swap in a clean **“upgrade required”** view for any visitor and stop saving new submissions. * Your form structure, integrations, and existing responses are all preserved. Upgrading reactivates submissions instantly. * **Annual plans** get the monthly limit times 12 as a single bucket for the whole year — perfect for traffic that spikes seasonally. ## AI Credits AI credits power AI Agent nodes in your workflows—including lead qualification, summarization, and other AI-powered automation. ### Credit Allocation * **Business & Advanced plans:** 100 credits per month (or 1,200 per year on annual billing) * Credits reset at the start of each billing period ### On-Demand Credits Need more? Purchase additional credits at **\$0.10 per credit**. On-demand credits are invoiced when you reach a \$100 threshold (1,000 credits); unbilled usage below the threshold rolls over to your next billing cycle. ### Credit Alerts We'll email you at **80%** and **100%** of your AI credit allocation, and show a warning on the **Billing** page, so your AI-powered workflows never stop unexpectedly. Purchase on-demand credits or upgrade your plan to keep them running. ## Changing Your Plan ### Upgrading * Takes effect immediately * You receive prorated credit for the remainder of your billing period * You pay the difference for the upgraded plan ### Downgrading * Takes effect at the end of your current billing period * You keep your current plan's features until the period ends * After that, features revert to the new plan's limits ## Managing Your Subscription From the **Billing** page in your dashboard, you can: * **Change Plan** — Upgrade or downgrade * **Update Payment Method** — Add or edit your card * **View Invoices** — Download past invoices * **Cancel Subscription** — Cancel at the end of your billing period ## Common Questions Your forms remain published and continue collecting submissions until you hit your new plan's response cap. Features that exceed your new plan (e.g., workflows, remove branding, advanced scheduling modes) will stop working. You may need to simplify workflows, re-enable branding, or convert advanced scheduling pages to standard 1:1 mode before the downgrade takes effect. Your forms swap in an “upgrade required” view for visitors and stop saving new submissions until your next billing period or until you upgrade. Existing responses, integrations, and form structure are preserved. We email you at 50%, 90%, and 100% so there are no surprises. Standard 1:1 scheduling is on every plan, including Free. Lead Capture + Schedule is included on Pro and above. Group scheduling and Round Robin scheduling require the Business or Advanced plan. No. Unused AI credits do not roll over to the next billing period. Use them before your period resets. Yes. You can switch at any time. Annual billing offers a discount (e.g., \$23/mo vs \$29/mo for Pro). When switching, you'll be charged or credited the prorated difference. Nothing changes. Subscribers on the earlier \$79/mo Pro plan are grandfathered and keep their current price and features until they choose to change plans. Only team members with the Owner or Admin role can access billing settings and change plans. ## Next Steps Compare plans and features Invite team members and manage roles # Conditional Logic Source: https://docs.orbitforms.ai/guides/conditional-logic Show or hide fields based on user answers to create dynamic, personalized form experiences. Show or hide fields based on user answers to create dynamic, personalized form experiences. **Available in Standard and Flow Forms** Conditional logic works in both form editors. In Flow forms, fields that don't meet their conditions are skipped during navigation; in Standard forms, they're hidden on the page. ## What is Conditional Logic? Conditional logic lets you control which fields appear based on previous answers. This creates shorter, more relevant forms that adapt to each user. Fields that don't meet their conditions are automatically skipped during navigation. Display a field only when conditions are met. Hidden by default until triggered. Hide a field when conditions are met. Visible by default until triggered. Display a field and make it required when conditions are met. ## Example Use Case **Contact Form with Role-Based Questions** * **Question 1:** What describes you best? * Options: Customer, Partner, Developer * If "Developer" is selected, show: * **Question 2:** What's your tech stack? * Only shown when "Developer" is selected When a user selects "Customer" or "Partner", they skip straight to the next relevant question. ## How to Set Up Conditional Logic Navigate to your form and click "Edit" to open the form builder Click on any field (except the first one) to select it Scroll down in the field settings panel to find the "Logic" section with the branch icon Click "+ Add condition" to create your first rule Choose the action (Show, Hide, or Show + Require), the trigger field, an operator, and the value to match ## Combining Multiple Conditions You can add multiple conditions to a single field. Use the logic type dropdown to control how conditions are combined: All conditions must be true (AND logic). Field shows only when every condition matches. *Example: Show if role = "Developer" AND experience = "Senior"* At least one condition must be true (OR logic). Field shows when any condition matches. *Example: Show if role = "Developer" OR role = "Designer"* ## Available Operators | Operator | Description | | --------------------- | -------------------------------------------------------------------- | | **Equals** | Field value matches exactly (case-insensitive) | | **Does not equal** | Field value does not match | | **Contains** | Field value contains the specified text | | **Does not contain** | Field value does not contain the text | | **Is empty** | Field has no value or is blank | | **Is not empty** | Field has any value | | **Greater than** | Number is greater than value | | **Less than** | Number is less than value | | **Is selected** | Option is selected in multi-select fields | | **Is not selected** | Option is not selected in multi-select | | **Is free email** | Email is on a free provider (e.g., Gmail, Yahoo) — email fields only | | **Is business email** | Email is not on a free provider — email fields only | ## Smart Features ### Smart Value Selection When you reference a multiple choice, dropdown, or checkbox field, the value input becomes a dropdown showing all available options from that field. ### Dynamic Progress The progress bar and step counter automatically update based on visible fields. If conditional logic hides 3 fields, users see the correct "2 of 5" instead of "2 of 8". ### Instant Evaluation Conditions are evaluated in real-time as users answer. When selecting a choice option, the form immediately knows which field to show next. ## Best Practices * Only reference fields that appear BEFORE the conditional field * Test your form by going through all possible paths * Use clear, descriptive field labels to make conditions readable * Start simple with one condition, then add complexity as needed * Hidden fields are skipped — ensure required data has a path to collection * Avoid making the first field conditional (it has no previous fields to reference) *** ## Next Steps Learn more about conversational forms All available field types # Contacts & Tags Source: https://docs.orbitforms.ai/guides/contacts Organize, segment, and manage your form respondents with contacts and tags. ## Understanding Contacts Contacts are auto-created when someone submits a form with an email address. Each contact includes: * **Email address** — Unique identifier * **First and last name** * **Phone number and company** * **All form submissions** — Linked to the contact * **Tags** — For organization and segmentation * **Activity timeline** — Submissions, meetings, and sequence activity in one feed ## Working with Tags ### Adding Tags Add tags to contacts to categorize and segment them. Tags can be applied manually or automatically via workflows. ### Removing Tags Remove tags when a contact's status changes or they no longer fit a segment. ### Tag Examples | Tag | Use Case | | ---------- | ------------------------------- | | Lead | New prospect, not yet qualified | | Customer | Active paying customer | | VIP | High-value or key account | | Newsletter | Subscribed to email list | | Trial User | In free trial period | | Enterprise | Enterprise-tier customer | | Follow Up | Needs follow-up action | ## Editing Contacts Click on a contact from your contacts list. Use the edit button to modify contact details. Change any editable field values. Save your changes. ### Editable Fields * Email * First name / Last name * Phone * Company * Custom fields ## Searching & Filtering * **Search by Name or Email** — Find contacts quickly * **Filter by Tag** — View contacts with specific tags * **Filter by Activity** — Filter by submission count, form count, meeting count, or first meeting booked ## Creating & Managing Tags * **Color Coding** — Assign colors to tags for visual organization * **Descriptions** — Add descriptions to clarify tag purpose * **Contact Count** — See how many contacts have each tag Tag creation and management may be restricted by team permissions. Check your team settings for tag-related permissions. ## Contact Owners ### Manual Assignment Assign an owner to a contact manually for follow-up and accountability. ### Round-Robin via Workflows Use workflows to assign owners automatically: * **Least Recent** — Assign to the team member with the fewest recent assignments * **Random** — Randomly distribute new contacts * **Equal Distribution** — Balance load across team members Owner-based routing in workflows lets you route contacts to their assigned owner for personalized follow-up. ## Tags in Workflows Use tags in your workflows for automation: * **Tag Contact Node** — Add or remove tags based on workflow logic * **Tag by Source Form** — Automatically tag based on which form they submitted * **Tag by AI Qualification** — Use AI nodes to qualify and tag leads * **Tag by Enrichment Data** — Tag based on enriched contact data ## API Access Contacts and tags can be managed programmatically via the API. See the [API Reference](/developers/api/overview) for endpoints and authentication. ## Next Steps Track contact engagement and conversion Sync contacts with your CRM and marketing tools # Core Concepts Source: https://docs.orbitforms.ai/guides/core-concepts Understand the fundamental building blocks of OrbitForms to make the most of the platform. Understand the fundamental building blocks of OrbitForms to make the most of the platform. ## Forms A **Form** is the primary building block in OrbitForms. Each form contains a collection of fields that collect specific information from your users. Forms can be published with a unique URL or embedded on your website. Every form belongs to a **Team** and can be accessed and edited by all team members. Forms have their own settings for styling, notifications, and integrations. Use descriptive slugs for your forms. Instead of "form-1", use "contact-us" or "job-application" for better SEO and sharing. ## Form Types OrbitForms offers two distinct form experiences: ### Standard Forms Traditional forms where all fields are visible at once on a single page. Ideal for applications, registrations, and forms with many fields that users need to see together. Supports multi-column layouts. ### Orbit Flows Conversational forms that display one question at a time. Users navigate with keyboard (Enter to continue) or clicks. The form type is chosen when you create the form and each type has its own editor. Regardless of type, every form can also be viewed in the flow layout by adding `/flow` to its URL — handy for sharing a conversational version of any form. ## Fields **Fields** are the individual questions or inputs in your form. Each field has a type that determines what kind of data it collects (text, email, number, etc.) and how it's displayed to users. Fields can be configured with: * **Label** — The question or prompt shown to users * **Placeholder** — Example text shown in empty inputs * **Help Text** — Additional context or instructions * **Required** — Whether the field must be filled before submitting * **Validation** — Rules for acceptable input (min/max, patterns) ## Submissions A **Submission** is created each time a user completes and submits your form. It contains all the data they entered, along with metadata like submission time and source information. Submissions can be viewed in the dashboard, exported as CSV, or automatically sent to your connected integrations (CRMs, email tools, webhooks). Individual submissions can also be downloaded as JSON. ## Teams **Teams** are the organizational unit in OrbitForms. All forms, submissions, and settings belong to a team. When you sign up, a default team is created for you. You can invite team members to collaborate on forms, view submissions, and manage settings. Team members share access to all forms within the team. ## Integrations **Integrations** connect your OrbitForms forms to other tools in your stack. When a form is submitted, data can be automatically sent to: * CRMs like Salesforce, HubSpot, and Close * Marketing tools like Mailchimp and ActiveCampaign * Spreadsheets like Google Sheets and Airtable * Custom webhooks for any destination *** ## Continue Learning Build your first form Connect your tools # Creating Forms Source: https://docs.orbitforms.ai/guides/creating-forms Learn how to create, configure, and publish forms in OrbitForms. Learn how to create, configure, and publish forms in OrbitForms. ## Creating a New Form To create a new form, navigate to the **Forms** page in your dashboard and click the **Create Form** button. You'll be guided through the setup process. ### Step 1: Choose a Form Type Select between a **Standard** form or a **Flow** form: **Standard** All questions visible on one page. Best for detailed forms, applications, and when users need context from multiple fields at once. **Flow** One question at a time. Best for lead capture, surveys, and when you want higher completion rates with a conversational feel. The form type is set at creation and determines which editor you use. It can't be changed later, but any form — regardless of type — can be viewed in the flow layout by adding `/flow` to its public URL. ### Step 2: Name Your Form Give your form a name and optionally a custom slug. The slug determines your form's URL: ``` https://orbitforms.ai/r/{team-id}/your-form-slug ``` **Tip: Use Descriptive Slugs** Choose slugs that describe your form's purpose, like "contact-us" or "demo-request". This improves SEO and makes links more trustworthy. ## The Form Editor The form editor is where you build and customize your forms. Standard forms use tabs at the top of the editor: * **Build** — Add new fields to your form. Drag and drop to reorder. Click a field to edit its settings, including conditional logic. * **Design** — Customize colors, fonts, logo, background, and the submit button. * **After Submission** — Configure the thank-you page, redirects, and post-submit routing. Flow forms have their own editor with **Content**, **After Submission**, **Settings**, and **Share** tabs. Their After Submission tab also offers a **Scheduler** option that shows one of your [scheduling pages](/guides/scheduling) right on the thank-you screen — see [Orbit Flows](/guides/flow-forms#show-a-scheduler-after-submission). ## Saving and Publishing Field edits are saved automatically as you work; use the **Save** button (or ⌘S) for design and settings changes. To make the form accessible to users, you need to **publish** it: Click the Publish button in the top right corner of the editor Confirm that you're ready to make the form live Your form is now accessible at its public URL **Editing a Live Form** Saved changes to a published form go live immediately. To take a form offline, unpublish it from the Forms page — it stops accepting submissions until you publish it again. ## Form States Forms can be in different states: | State | Description | | ------------- | ------------------------------------------------------ | | **Draft** | Form is not published and not accessible to the public | | **Published** | Form is live and accepting submissions | *** ## Next Steps Learn about all field types Customize your form's look # Email & Calendar Setup Source: https://docs.orbitforms.ai/guides/email-calendar Connect your Google account for calendar scheduling and meeting integrations. Microsoft support is coming soon. ## Why Connect Your Calendar Sync your calendar, set availability, and generate Google Meet links for booked meetings. ## Connecting Google Go to **Settings → Calendar** in the dashboard. Select the Google option to start the OAuth flow. Sign in with your Google account and grant the requested permissions. Your Google account should appear in the connected accounts list. ### Google Permissions OrbitForms requests the following permissions: * **Calendar read** — Read your calendar list and free/busy status * **Calendar events (read/write)** — Create events and check availability * **User profile info** — Display your name and email in the app Sequence emails are sent through your verified sending domain, not through Gmail — no Gmail permissions are requested. Microsoft 365 and Outlook Calendar support is coming soon. Check the changelog for updates. ## Managing Connected Accounts * **Set Default Account** — If you have multiple accounts, choose which one to use for new scheduling links. * **Reconnect Expired Tokens** — If your connection expires, click "Reconnect" to refresh the authorization. * **Disconnect an Account** — Remove a connected account to revoke OrbitForms's access. ## Calendar Sync * **Automatic Sync** — Your calendar is synced periodically to reflect your availability. * **Availability Checking** — OrbitForms checks your free/busy status when someone books a meeting. * **Conflict Detection** — Prevents double-booking by blocking times when you're busy. * **Event Creation** — Creates calendar events with the correct title, time, and meeting link. ## Availability Schedules Configure when you're available for meetings — working hours and time zone — from the availability section on this same page. [Configure availability schedules →](/guides/scheduling/availability) Calendar data is encrypted in transit and at rest. OrbitForms only accesses the permissions you grant and does not share your data with third parties. ## Troubleshooting Ensure you're not blocking pop-ups. Try a different browser or incognito mode. Check that your Google account is in good standing. Click "Reconnect" in your connected accounts settings. Re-authorize with Google to refresh the token. Verify the connection is active. Check that you granted calendar permissions. Allow a few minutes for the initial sync to complete. Ensure you have write access to the calendar. Check that the calendar isn't read-only. Review the scheduling form configuration. ## Next Steps Set up scheduling and meeting types Configure your availability # Email Sending Domain Setup Source: https://docs.orbitforms.ai/guides/email-sending To send sequence emails from your own email address, you need to verify your domain. This is a one-time setup that takes about 5 minutes. ## How It Works When you send a sequence email from [matt@yourcompany.com](mailto:matt@yourcompany.com), we need to prove to email providers (Gmail, Outlook, etc.) that OrbitForms is authorized to send on behalf of your domain. This is done by adding DNS records to your domain (e.g., yourcompany.com). Without these records, emails may land in spam or be rejected entirely. The same **Settings → Sending** page also hosts **SMS Sending** (Salesmsg) when your plan includes SMS — separate from email DNS. See the [Salesmsg integration](/integrations/salesmsg) guide. **What you'll need:** * Access to your domain's DNS settings (Cloudflare, GoDaddy, Namecheap, Route 53, etc.) * About 5 minutes for initial setup * DNS changes may take up to 48 hours to propagate (usually much faster) ## Using a Subdomain (Optional) We recommend using your **root domain** (e.g., `yourcompany.com`) for the simplest setup. However, you can optionally use a subdomain if you want to keep your sending reputation separate from your primary business email. **When to consider a subdomain:** If you send high volumes of sequence emails or want to isolate your outreach reputation from your regular business email, a subdomain like `mail.yourcompany.com` can be helpful. Benefits of using a subdomain: * **Reputation isolation:** If sequence emails trigger spam filters, only the subdomain is affected — your primary domain's reputation stays clean for regular business email. * **Avoid SPF conflicts:** Your root domain may already have an SPF record for your regular email provider. A subdomain gets its own SPF record with no conflicts. * **Separate DKIM signing:** Keeps cryptographic signing separate from your primary email, so there's no interference with existing DKIM configurations. ## Step 1: Add Your Domain Navigate to **Settings** in the dashboard sidebar, then open the **Sending** tab. You can also [open Sending settings directly →](https://orbitforms.ai/settings/email-sending). Enter your root domain (e.g., yourcompany.com). You can also use a subdomain if you prefer to keep sending reputation separate. After adding the domain, the DNS setup wizard will appear showing all the records you need to add. ## SPF Record SPF (Sender Policy Framework) tells email providers which servers are allowed to send email from your domain. Add a **TXT** record to your domain's DNS: | Type | Name | Value | | ---- | --------------- | --------------------------------- | | TXT | yourcompany.com | `v=spf1 include:mailgun.org ~all` | Add this SPF record to the domain you configured. If your domain already has an SPF record, merge the include statement into it (e.g., `v=spf1 include:_spf.google.com include:mailgun.org ~all`). ## DKIM Record DKIM (DomainKeys Identified Mail) adds a cryptographic signature to each email, proving it hasn't been tampered with in transit. Add a **TXT record** with the name and value shown in the setup wizard: | Type | Name | Value | | ---- | ------------------------------------- | ------------------------------------------------------------- | | TXT | orbitmail.\_domainkey.yourcompany.com | `k=rsa; p=MIG...` (copy the full value from the setup wizard) | The DKIM value is a long public key unique to your domain. Always copy it from the setup wizard in **Settings → Sending** — do not type it manually. **Route 53 / AWS users:** Make sure to select **TXT** as the record type and wrap the value in double quotes (e.g., `"k=rsa; p=MIG..."`). Some providers add quotes automatically. ## Custom Tracking Domain The tracking domain is used for open and click tracking. Without it, tracking URLs would point to a third-party domain, which can hurt deliverability. Add a **CNAME** record: | Type | Name | Value | | ----- | --------------------- | ----------- | | CNAME | orbit.yourcompany.com | mailgun.org | **Why this matters:** Gmail and Outlook check whether links in an email match the sender's domain. A custom tracking domain keeps all URLs on your domain, significantly improving inbox placement. The exact record name will be shown in the setup wizard. ## DMARC Record (Recommended) DMARC (Domain-based Message Authentication) tells email providers what to do when SPF or DKIM checks fail. While not strictly required, having a DMARC record significantly improves deliverability, especially with Gmail. If your domain (e.g., yourcompany.com) already has a DMARC record, you're all set. If you don't have one yet, add it to your domain: | Type | Name | Value | | ---- | ----------------------- | ------------------- | | TXT | \_dmarc.yourcompany.com | `v=DMARC1; p=none;` | Add this to your domain. If you're using a subdomain for sending, it will automatically inherit this policy. The setup wizard will show a green check once detected. ## Verify Your Domain After adding all DNS records, click the **Verify** button next to your domain. Each record will show a green check when verified. SPF and DKIM must both be verified before you can send emails. | Requirement | Status | Notes | | ------------------------ | -------------------- | -------------------------------------------------------------------------- | | SPF + DKIM verified | Required | Your domain status changes to "Verified" and you can start sending emails. | | Tracking domain verified | Strongly recommended | Without it, open/click tracking may reduce deliverability. | | DMARC found | Recommended | Improves inbox placement, especially with Gmail. | ## DNS Propagation DNS changes don't take effect instantly. Here's what to expect: | Provider | Timeline | | ------------------------------------- | --------------------------------------------------------------------------------------------------------- | | Most providers (Cloudflare, Route 53) | Changes propagate within 1-5 minutes. You can verify almost immediately. | | Some registrars (GoDaddy, Namecheap) | May take 15-30 minutes. Wait a bit before clicking Verify. | | Worst case | DNS changes can take up to 48 hours to fully propagate worldwide. If verification fails, try again later. | ## Troubleshooting Make sure you added the SPF record to the exact domain you configured in settings. Only one SPF record is allowed per domain — if your domain already has one, merge the `include:mailgun.org` into the existing record instead of adding a second. Double-check that you copied the full DKIM value from the setup wizard. Some DNS providers truncate long TXT records. If your provider has a character limit, you may need to split the value into multiple strings. Ensure the CNAME record for orbit.yourdomain.com points to mailgun.org (not a URL with https\://). Some DNS providers add a trailing dot automatically — this is normal. If another team has already added this domain, you'll see an error. Contact support if you believe this is your domain. ## Next Steps Open domain setup in your dashboard Build your first email sequence Manage the contacts you enroll # Embed on Website Source: https://docs.orbitforms.ai/guides/embedding Add your OrbitForms forms directly to your website using our embed codes. Add your OrbitForms forms directly to your website using our embed codes. ### Getting Your Embed Code Open your form in the dashboard Go to the Share tab Select your embed type and copy the code ## Embed Types ### Standard Embed (iframe) **Recommended** — Pure HTML, no third-party script. Renders even when ad blockers, corporate firewalls, or strict CSPs would block scripts. The most reliable way to embed your form. Just paste the iframe where you want the form to appear and pick a fixed height that fits your form. ```html theme={null} ``` * Inline forms on landing/demo pages * Maximum reliability across browsers * Static sites, Webflow, WordPress * Fixed height (no auto-resize) * No popup / slider / sidetab modes ### JavaScript Embed Loads the form via our embed script. Required for popup, slider, and sidetab modes; adds auto-resize, event callbacks, and pre-fill support. Use this when you need those features; otherwise the iframe embed above is more reliable. ```html theme={null}
``` * Auto-resizing * Popup / slider / sidetab support * Event callbacks * Pre-fill support * `data-orbit-form`: form slug * `data-orbit-team`: team ID * `data-orbit-embed`: popup | slider * `data-orbit-height`: custom height ### Popup / Modal **Recommended** — Uses the native browser `` element with inline JavaScript. No third-party script, so it can't be blocked by ad blockers or strict CSPs. Open your form in a centered modal when a button is clicked. Add the generated trigger class to any button or link to wire it up. Use a unique class per form if you have multiple popup embeds on the same page. ```html theme={null} ``` The native `` element handles the backdrop, escape-to-close, focus trap, and ARIA roles automatically. #### Script-based popup (legacy) If you need auto-resize, event callbacks, or slider/sidetab/popover modes, use the script embed instead: ```html theme={null}
``` The `team` value is the first 8 characters of your team UUID, visible in the Share tab. For detailed setup instructions for Webflow, WordPress, Squarespace, and more — see the [Embed Script documentation](/developers/embed). ## Pre-filling Fields You can pre-fill form fields using URL parameters: ``` orbitforms.ai/r/{team-id}/contact?email=user@example.com&name=John ``` ## Form Events Listen to form events using CustomEvents to trigger custom actions: ```javascript theme={null} // Form submitted document.addEventListener('orbitFormSubmitted', function(e) { console.log('Form submitted:', e.detail.slug); // Track conversion, show message, etc. }); // Form loaded document.addEventListener('orbitFormLoaded', function(e) { console.log('Form loaded:', e.detail.slug); }); // Form resized (for layout adjustments) document.addEventListener('orbitFormResize', function(e) { console.log('New height:', e.detail.height); }); ``` ## Responsive Behavior Forms automatically adapt to fit their container. Here's what to know about field layouts: ### Half-Width Fields Fields set to "1/2" width will display side-by-side when the embed container is **510px or wider**. Below this width, all fields stack vertically for better mobile usability. * **≥ 510px:** Half-width fields appear side-by-side * **\< 510px:** All fields stack vertically ## Platform-Specific Guides * WordPress * Webflow * Squarespace * Shopify * React / Next.js *** ## Next Steps Full API reference, popup setup, and platform guides View and manage responses # Orbit Flows Source: https://docs.orbitforms.ai/guides/flow-forms Conversational forms that display one question at a time. Conversational forms that display one question at a time. ## What are Orbit Flows? Orbit Flows transform your forms into a conversational experience. Instead of showing all questions at once, users see one question at a time and progress through the form step by step. ## Why Use Orbit Flows? * **Higher Completion Rates** — By showing one question at a time, users feel less overwhelmed and are more likely to complete the form. * **Keyboard-First Navigation** — Users press Enter to submit an answer and move to the next question, and can use the arrow keys to navigate dropdown options. * **Engaging Experience** — The conversational format feels more personal and engaging, like a real conversation rather than filling out a boring form. ## Creating an Orbit Flow Go to Forms → Create Form Select **Flow** as the form type Add your fields — they'll automatically display one at a time **Sharing Any Form as a Flow** The form type is set at creation and can't be changed, but every form — even a Standard one — can be viewed in the flow layout by adding `/flow` to its public URL (e.g., `orbitforms.ai/r/{team-id}/your-form/flow`). This makes it easy to share a conversational version without rebuilding anything. ## Keyboard & Scroll Navigation Orbit Flows are designed for fast navigation: | Input | Action | | ------------------ | ----------------------------------------------- | | `Enter ↵` | Submit answer and go to next question | | `↑ ↓` | Navigate options in an open dropdown | | `Enter` or `Space` | Open a dropdown / select the highlighted option | | `Esc` | Close an open dropdown | | Mouse wheel | Scroll down for next question, up for previous | On **Long Text** fields, Enter inserts a new line instead of advancing — users click the **OK** button to move on. ## Show a Scheduler After Submission Flow forms can end with a meeting scheduler instead of a thank-you page or redirect. The scheduler appears right on the final screen of the flow — respondents pick a time without ever leaving the form. In the flow form editor, go to the **After Submission** tab Select **Scheduler** as what happens after submission Choose one of your scheduling pages from the dropdown Click **Preview thank you screen** to see the end of the flow exactly as respondents will Answers from your form's **Name** and **Email** contact fields are prefilled into the booking, so respondents never type them twice. Lead capture scheduling pages skip their lead form entirely — your flow form already captured that information — and go straight to the calendar (any extra custom fields on the page are asked once, in the booking step). **Good to know** * The scheduling page must be **published** for respondents to see it — otherwise the regular thank-you page is shown. Draft pages do appear in form previews so you can verify the setup first. * Showing a scheduler after submission is available on **paid plans**. Group and round robin page types additionally require **Business** or above. * If a conditional **routing rule** matches a submission, its redirect takes priority over the scheduler. * Works in embedded forms too, including popups — the embed stays open until the booking is complete. ## Best Practices * **Keep questions short and clear** — Each question should be easy to understand at a glance * **Start with easy questions** — Begin with simple questions like name and email to build momentum * **Limit total questions** — Aim for 5-10 questions maximum to maintain engagement * **Use helpful placeholders** — Show example answers to help users understand what's expected * **Show progress** — The progress indicator helps users know how far they are *** ## Next Steps Customize your flow's look Share your form with the world Set up the scheduling pages your flow can end with # Form Fields Source: https://docs.orbitforms.ai/guides/form-fields A complete guide to all available field types in OrbitForms forms. A complete guide to all available field types in OrbitForms forms. **Adding Fields** In the standard form editor, pick a field type from the **Add Fields** panel on the **Build** tab. In the flow editor, click the **+** button to open the field picker. The field is added to your form immediately. **Tip:** Drag and drop fields to reorder them. Click a field to edit its properties. ## Available Field Types ### Short Text Single-line text input for names, titles, and short answers. **Use Cases:** Company Name, Job Title, City ### Long Text Multi-line text input for longer responses. **Use Cases:** Message, Description, Feedback ### Email Email input with built-in format validation. **Use Cases:** Work Email, Personal Email ### First Name / Last Name / Full Name Pre-configured name fields that map cleanly to CRM contact properties in integrations. ### Phone Phone number input with country selection and format validation. **Use Cases:** Mobile Number, Work Phone ### Number Numeric input with optional min/max constraints. **Options:** Min value, Max value **Use Cases:** Age, Quantity, Budget ### Date Date picker for selecting dates. **Use Cases:** Birth Date, Preferred Date, Deadline ### Time Time picker for selecting a time of day. **Use Cases:** Preferred Call Time, Appointment Time ### Website URL URL input with format validation. **Use Cases:** Website, LinkedIn Profile, Portfolio ### File Upload File upload for documents, images, and attachments. **Options:** Accepted file types, Max file size **Use Cases:** Resume, Photo, Documents ### Dropdown Dropdown menu for selecting one option from a list. **Options:** Options list, Placeholder **Use Cases:** Country, Department, How did you hear about us? ### Multiple Choice Radio-style buttons for selecting one option from visible choices. **Options:** Options list **Use Cases:** Yes/No questions, Single-choice surveys ### Multi-select Checkboxes for selecting multiple options. Labeled **Checkboxes** in the flow editor. **Options:** Options list **Use Cases:** Interests, Multiple choices ### Rating Star rating for feedback and reviews. **Options:** Max rating (5 or 10 stars) **Use Cases:** Satisfaction, Experience, Recommendation ### Linear Scale Numbered scale with custom end labels. Labeled **Opinion Scale** in the flow editor. **Options:** Min, Max, Min label, Max label **Use Cases:** NPS, Likelihood scales, Agreement scales ### Hidden Field Invisible field that captures data with the submission without showing anything to the user. **Options:** Value source — static value, URL parameter, UTM source/medium/campaign, referrer, or country **Use Cases:** Tracking campaigns, capturing attribution data ### Layout Fields Not questions — these structure your form's content: * **Heading** — Section headings * **Paragraph** — Explanatory text * **Divider** — Visual separator ## Common Field Settings All question field types share these common configuration options: * **Label** — The question or prompt displayed above the field * **Required** — Whether the field must be filled before submitting * **Placeholder** — Example text shown when the field is empty * **Help Text** — Additional instructions shown below the field * **Width** — Full width or half width (half-width fields sit side-by-side on wider screens, standard forms only) * **Field Name (ID)** — Internal identifier used in submissions and integrations * **Logic** — Show or hide the field based on previous answers (see [Conditional Logic](/guides/conditional-logic)) *** ## Next Steps One question at a time Customize appearance # Keyboard Shortcuts Source: https://docs.orbitforms.ai/guides/keyboard-shortcuts Speed up your workflow with these keyboard shortcuts. Works in the form editor and dashboard. On Windows and Linux, replace **⌘** (Command) with **Ctrl**. ## Dashboard Shortcuts | Shortcut | Action | | -------- | -------------- | | ⌘B | Toggle sidebar | ## Form Editor Shortcuts These work in both the Standard and Flow form editors: | Shortcut | Action | | -------- | --------------------------------------- | | ⌘S | Save form | | ⌘Z | Undo | | ⌘⇧Z | Redo | | ⌘P | Open preview | | ⌘⇧P | Publish form | | ⌘E | Toggle the Share tab (Flow editor only) | | Esc | Close panel / deselect field | ## Field Shortcuts These only work when you're **not** focused on a text input. If a shortcut doesn't work, click outside any text field first. | Shortcut | Action | | -------- | ----------------------------- | | ⌘D | Duplicate selected field | | ⌘⌫ | Delete selected field | | ↑↓ | Move selection between fields | | ⌘↑ | Move field up | | ⌘↓ | Move field down | ## Field Type Shortcuts Add a field with a single key (Standard editor: on the **Build** tab. Flow editor: on the **Content** tab with the add-field modal closed): | Shortcut | Field Added | | -------- | ------------------------- | | T | Short Text | | E | Email | | N | Number | | S | Dropdown | | C | Multi-select (Checkboxes) | | D | Date | ## Flow Form Shortcuts (Respondents) When someone fills out a Flow form: | Shortcut | Action | | -------------- | ----------------------------------------------- | | Enter | Submit answer and go to next question | | ↑↓ | Navigate options in an open dropdown | | Enter or Space | Open a dropdown / select the highlighted option | | Esc | Close an open dropdown | # Notifications Source: https://docs.orbitforms.ai/guides/notifications Get notified instantly when someone submits your form via Slack, email, or webhooks. ## Notification Channels Pro Instant delivery, channel selection, rich formatting, and team collaboration. Multiple recipients, custom subject lines, dynamic variables, and reliable delivery via Resend. ## Setting Up Slack Notifications Go to the **Integrations** page in your dashboard and select Slack. Authorize OrbitForms to post to your Slack workspace. Choose the channel where you want to receive submission alerts. You can also add Slack as a destination node in a [workflow](/guides/workflows) for more control over when alerts fire. ## Setting Up Email Notifications Navigate to the form in your dashboard. Go to the form's **Notifications** tab and enable email notifications. Enter one or more email addresses to receive alerts. Use template variables to personalize the subject line. Customize the email body with dynamic content. Need conditional or multi-step notifications? Use an Email notification node in a [workflow](/guides/workflows) instead — workflows can branch on field values before sending. ## Template Variables Use these variables in your email subject lines and message body to insert dynamic content: | Variable | Description | | ------------------- | ----------------------------------------------- | | `{{form_name}}` | The name of your form | | `{{all_responses}}` | All form responses formatted as key-value pairs | | `{{field.email}}` | Value of the field with ID `email` | | `{{field.name}}` | Value of the field with ID `name` | | `{{field.phone}}` | Value of the field with ID `phone` | | `{{field.company}}` | Value of the field with ID `company` | Use `{{field.your_field_id}}` to reference any form field. Replace `your_field_id` with the actual field ID from your form. The submission ID and submission date are always included automatically in a details box at the bottom of the notification email, so there's no need to add them yourself. ## Example Email Here's how a notification email might look with template variables: ``` Subject: New submission from {{form_name}} - {{field.name}} A new form submission was received. Name: {{field.name}} Email: {{field.email}} Company: {{field.company}} Phone: {{field.phone}} All responses: {{all_responses}} ``` ## Troubleshooting Add OrbitForms's sending domain to your SPF/DKIM records, or use a custom domain. Check your spam folder and mark notifications as "Not spam" to train your email provider. Verify your email addresses are correct. Check that the workflow is enabled and the form is published. Review the workflow run history for errors. Ensure you're using the exact field IDs from your form. Variable names are case-sensitive. Use `{{all_responses}}` to debug and see all submitted values. Reconnect your Slack workspace. Verify the bot has permission to post in the selected channel. Check that the channel still exists and the workflow is enabled. ## Next Steps Connect to CRMs and other tools Send data to any endpoint # User Guides Source: https://docs.orbitforms.ai/guides/overview Learn how to use every feature of OrbitForms. From building your first form to analyzing submissions, these guides will help you get the most out of the platform. Learn how to use every feature of OrbitForms. From building your first form to analyzing submissions, these guides will help you get the most out of the platform. ## Building Forms Learn how to create new forms and configure basic settings. Explore all available field types and their configuration options. Customize colors, fonts, and branding to match your website. Create multi-step forms with one question per page. ## Sharing & Publishing Share via link, email, social media, or QR code Add forms to any website with our embed code ## Data & Analytics View and manage responses Track form performance Connect to other apps ## Team & Account Invite team members and manage permissions Configure your profile and preferences # Quick Start Guide Source: https://docs.orbitforms.ai/guides/quick-start Create your first form and start collecting responses in just a few minutes. Create your first form and start collecting responses in just a few minutes. **Before you begin** You have an OrbitForms account. [Sign up for free](https://orbitforms.ai/signup) if you don't. After signing in, navigate to the **Forms** page from the sidebar. Click the **Create Form** button to get started. ``` Forms → Create Form ``` You'll be prompted to choose between a **Standard** form (all fields visible at once) or a **Flow** form (one question at a time). The form type is set at creation, so pick the experience that fits your audience. In the form editor, add questions from the field panel. OrbitForms supports many field types: * Short Text & Long Text * Email * Phone * Number * Date & Time * Dropdown, Multiple Choice & Multi-select * Rating & Linear Scale * Website URL * File Upload Each field can be customized with labels, placeholders, help text, and validation rules. Toggle the **Required** switch to make a field mandatory. Use the **Design** tab in the editor to customize your form's appearance: * **Colors** — Change button, background, and text colors to match your brand * **Logo** — Upload your company logo * **Background** — Solid color, gradient, or transparent * **Font** — Choose from a selection of Google Fonts The **After Submission** tab controls what users see after submitting — a customizable thank-you page or a redirect to another URL. When you're happy with your form, click **Publish** in the top right corner. Your form will be live at its unique URL: ``` https://orbitforms.ai/r/{team-id}/your-form-slug ``` You can also embed the form on your website using the embed code from the **Share** tab. Congratulations! Your form is now live. As users submit responses, you'll see them in the **Submissions** tab on your form's dashboard. *** ## Next Steps Learn about all field types Build conversational forms # Remove Branding Source: https://docs.orbitforms.ai/guides/remove-branding Remove the "Powered by OrbitForms" badge from your forms for a fully white-label experience. Remove the "Powered by OrbitForms" badge from your forms for a fully white-label experience. ## The Branding Badge By default, all forms display a small "Powered by OrbitForms" badge at the bottom. This badge links back to OrbitForms and helps others discover the platform. This badge is displayed on all forms on the Free plan. ## Plan Requirements Branding removal is a premium feature available on our paid plans. Upgrade to unlock this feature along with other powerful capabilities. * Remove branding * Custom CSS * Advanced analytics * Unlimited team members * Everything in Pro * AI Agents * Unlimited workflows [View Pricing & Upgrade →](https://orbitforms.ai/pricing) ## How to Remove Branding Once you've upgraded to Pro or Business, you can remove the branding from any form. The toggle lives in the editor: ### Standard Forms Open your form in the editor Click the **Design** tab at the top of the editor Scroll down to the **Advanced** section Toggle **Remove Orbit branding** ON to hide the "Powered by OrbitForms" badge Save your form to apply changes ``` Form Editor → Design → Advanced → Remove Orbit branding ``` ### Flow Forms Open your flow form in the editor Click the **Settings** tab at the top of the editor In the **Remove Branding** section, toggle **Remove "Powered by OrbitForms"** ON Save your form to apply changes **Trialing?** Branding removal unlocks once your trial converts to a paid subscription. During the trial the toggle is visible but locked. ## Important Notes * **Per-form setting** — The branding setting is configured individually for each form. You'll need to enable it on each form where you want to hide the badge. * **Plan downgrade** — If you downgrade from Pro or Business to Free, the branding will automatically reappear on your forms even if the setting remains enabled. * **Embedded forms** — The branding setting applies to both standalone forms (shared via link) and embedded forms on your website. *** ## Next Steps Customize colors, fonts & more Manage your subscription # Reply Tracking Setup Source: https://docs.orbitforms.ai/guides/reply-tracking Set up email forwarding to automatically detect when contacts reply to your sequence emails. When a reply is detected, the contact is automatically unenrolled from the sequence. ## How It Works When you send sequence emails through OrbitForms, replies go directly to your regular inbox (Gmail, Outlook, etc.). To detect those replies automatically, you set up a forwarding rule that sends a copy of incoming emails to a unique OrbitForms address. This lets us match replies against sent sequence emails and unenroll contacts who respond. **Key points:** * Your contacts see your real email address — nothing changes for them * Replies still land in your inbox as normal * The forwarding is a copy — your original emails are not affected * Reply tracking is optional — sequences work without it, but contacts won't be auto-unenrolled on reply ## Setup Instructions ### Step 1: Find Your Forwarding Address 1. Go to **Settings → Calendar** in your OrbitForms dashboard 2. Scroll to the **Reply Tracking** section 3. You'll see a unique forwarding address for each connected email account 4. Click the copy button to copy the address ### Step 2: Add the Address in Gmail 1. Open **Gmail** and click the gear icon → **See all settings** 2. Go to the **Forwarding and POP/IMAP** tab 3. Click **Add a forwarding address** 4. Paste your OrbitForms forwarding address and click **Next** Gmail will send a confirmation email to your OrbitForms address. You don't need to find this email yourself — OrbitForms receives it automatically and the next step will appear in your settings. ### Step 3: Confirm Forwarding Once OrbitForms receives Gmail's confirmation email, the Reply Tracking section will update to **"Pending confirmation"** status with two steps: 1. Click the **Confirm Forwarding** button — this opens Gmail's confirmation page in a new tab where you approve the forwarding 2. Click the **Gmail Forwarding Settings** link to go back to Gmail's forwarding settings, then: * Select **"Forward a copy of incoming mail to"** your OrbitForms address * Choose **"keep Gmail's copy in the Inbox"** from the dropdown * Click **Save Changes** Make sure to select **"keep Gmail's copy in the Inbox"** so your emails are not deleted after forwarding. After completing these steps, the status will automatically update to **"Active"** once we receive the first forwarded email. This usually happens within a few minutes. You'll also see the status on the **Settings** tab of each sequence — a green "Active" badge appears next to "Reply tracking" when the sender's forwarding is configured. ### Alternative: Set Up Forwarding in Outlook 1. Open **Outlook** and go to **Settings** (gear icon) 2. Go to **Mail → Forwarding** 3. Check **Enable forwarding** 4. Paste your OrbitForms forwarding address 5. Make sure **Keep a copy of forwarded messages** is checked 6. Click **Save** ## Removing Reply Tracking To stop reply tracking for an email account: 1. Go to **Settings → Calendar** and scroll to **Reply Tracking** 2. Click the **Remove** button next to the account 3. Open your **Gmail forwarding settings** and remove the forwarding rule or set it back to **"Disable forwarding"** Removing reply tracking in OrbitForms does not automatically remove the forwarding rule in Gmail — make sure to disable it in both places. ## How Reply Detection Works When a contact replies to a sequence email: 1. The reply arrives in your inbox (e.g., Gmail) 2. Gmail forwards a copy to your OrbitForms forwarding address 3. OrbitForms reads the email's `In-Reply-To` and `References` headers — these are standard email headers that identify which message is being replied to 4. We match those header values against the Message-ID we stored when the sequence email was originally sent 5. We verify that the sender's email address matches the contact enrolled in the sequence 6. If both checks pass, the contact's step execution is marked as "replied" 7. If "Email reply received" is enabled in the sequence's exit criteria, the contact is automatically unenrolled Replies that don't match any sent sequence email — or where the sender doesn't match the enrolled contact — are silently discarded. ## Privacy & Security We take a strict approach to how forwarded emails are handled: * **No email content is stored.** We read the `In-Reply-To` and `References` headers and the sender's email address from forwarded emails. The email subject, body, and attachments are never saved to our database. * **Sender verification.** We check that the sender's email address matches the contact enrolled in the sequence. This prevents misattributed replies and ensures only genuine replies from your contacts are processed. * **Non-sequence emails are discarded immediately.** If a forwarded email doesn't match a sent sequence email, it's ignored — no logging, no storage. * **Your forwarding address is unique.** Each connected email account gets its own forwarding address, scoped to your user account. * **Team-scoped matching.** Reply matching is restricted to sequences within your team. Forwarded emails can never interact with data from other teams. ## FAQ No. Your contacts see your real email address (e.g., [buddy@cometly.com](mailto:buddy@cometly.com)) as the sender and reply-to address. The forwarding happens on your side and is invisible to them. Yes. Gmail/Outlook keeps a copy in your inbox. The forwarding only sends a copy to OrbitForms — it does not redirect or delete your emails. Sequences will still work normally — emails are sent, opened, and clicked as usual. The only difference is that contacts won't be automatically unenrolled when they reply. You can still manually unenroll them. We read two things: the email threading headers (`In-Reply-To` and `References`) to identify which message is being replied to, and the sender's email address to verify it matches the enrolled contact. We match the threading headers against the Message-IDs of emails we sent through your sequences. The email subject, body, and attachments are never stored. Yes. Each connected email account has its own unique forwarding address. Set up forwarding separately for each account you use to send sequences. # Scheduling Source: https://docs.orbitforms.ai/guides/scheduling Create booking pages that let people schedule meetings with you. Connect your calendar, set your availability, and share a link — it's that simple. ## What is Scheduling? Scheduling pages let people book meetings directly on your calendar. Instead of going back and forth over email to find a time, you share a booking link and let people pick a slot that works for both of you. OrbitForms automatically checks your calendar for conflicts, respects your availability rules, and sends confirmation emails to everyone involved. **Book meetings right after a form submission** Flow forms can show a scheduling page directly on their thank-you screen — respondents book without leaving the form, with their name and email prefilled from their answers. See [Show a Scheduler After Submission](/guides/flow-forms#show-a-scheduler-after-submission). ## Scheduling Page Types A single host with one booking calendar. Perfect for personal meetings, demos, and consultations. Multiple hosts visible on the page. Visitors can choose which person to meet with from the team. Automatically assigns each booking to a team member — either the one who's gone the longest without a meeting or a random available member. ## Prerequisites Before creating a scheduling page, make sure you've connected your email and calendar accounts. **Connect your calendar first** Scheduling requires a connected Google calendar to check availability and create events. Microsoft calendar support coming soon. Head to [Email & Calendar Setup](/guides/email-calendar) to connect your account. ## How It Works 1. **Create page** — Set up your scheduling page with meeting details 2. **Set availability** — Define when people can book with you 3. **Share link** — Send your booking URL or embed it on your site 4. **Meetings booked** — People pick a time and it's added to your calendar *** ## Learn More Step-by-step guide to building your first booking page Configure meeting durations, locations, and booking rules Set your available times and timezone preferences Categorize and color-code your meetings Configure confirmation, reminder, and cancellation emails Share your booking page and embed it on your website # Availability & Working Hours Source: https://docs.orbitforms.ai/guides/scheduling/availability Define when you're available for meetings. Set day-of-week rules, handle timezones, and override specific dates for holidays or time off. ## Creating Availability Schedules An availability schedule defines the windows of time when people can book meetings with you. You can create multiple schedules and assign different ones to different event types — for example, a "Business Hours" schedule for client calls and an "Extended Hours" schedule for internal meetings. Go to **Settings → Calendar** in the dashboard and scroll to your availability schedules. You can also edit your schedule from any scheduling page's **Availability** tab — both edit the same personal schedule. Click "New Schedule" and give it a descriptive name like "Business Hours" or "Afternoon Only". Toggle each day on or off and set a start and end time for each working day. Choose the timezone that your availability is based on. Visitors will see times converted to their own timezone. Link this schedule to one or more event types on your scheduling pages. Event types without a pinned schedule use your default schedule. ## Day-of-Week Rules Configure specific hours for each day of the week. Days can be enabled or disabled individually, and each working day has one continuous time window. **Example Schedule:** | Day | Hours | | --------- | ----------------- | | Monday | 9:00 AM - 5:00 PM | | Tuesday | 9:00 AM - 5:00 PM | | Wednesday | 9:00 AM - 5:00 PM | | Thursday | 9:00 AM - 5:00 PM | | Friday | 9:00 AM - 3:00 PM | | Saturday | Unavailable | | Sunday | Unavailable | Your availability is personal to you. On group and round-robin pages, slots are only offered when every host is free in their own working hours and connected calendar — each host edits their own schedule from their own dashboard. ## Timezone Handling Scheduling pages handle timezones automatically so both you and your visitors see the correct times. * **Your timezone** — Set your base timezone when creating the availability schedule. All rules are defined relative to this timezone. * **Visitor timezone** — Visitors see available times automatically converted to their local timezone. They can also manually select a different timezone from a dropdown. **Automatic detection** The booking page automatically detects the visitor's timezone using their browser. This means a visitor in London will see your 9 AM EST availability displayed as 2 PM GMT. ## Date Overrides Override your regular schedule for specific dates. Perfect for holidays, vacation days, or one-off schedule changes. Mark a specific date as unavailable. Useful for holidays, personal days, or company events where you won't be taking meetings. Set custom hours for a specific date that differ from your regular schedule. For example, being available on a Saturday for a special event. ## Multiple Schedules Create different schedules for different types of meetings. Each event type can reference a different availability schedule. * **Business Hours** — Mon-Fri 9am-5pm. Used for: Client calls, demos * **Extended Hours** — Mon-Fri 8am-7pm. Used for: Internal team meetings * **Afternoons Only** — Mon-Fri 1pm-5pm. Used for: Focus time in mornings **Default schedule** Event types use your default schedule unless you pin a specific one. You can change which schedule is the default in **Settings → Calendar**. *** ## Next Steps Configure durations and locations Set up email notifications # Creating Scheduling Pages Source: https://docs.orbitforms.ai/guides/scheduling/creating Build a booking page in minutes. Choose your page type, configure meeting details, add lead capture fields, and share your link. ## Building Your First Booking Page Navigate to Scheduling in the sidebar and click "New Scheduling Page". Select between a standard scheduling page or a lead capture scheduling page (which collects form data before booking). Select your meeting format: One-on-One (single host), Group (multiple hosts visible), or Round Robin (auto-distribute across team members). Set the page name, URL slug, default meeting duration, and location (Google Meet, Zoom, phone, in-person, or custom URL). Microsoft Teams coming soon. For lead capture pages, add custom form fields to collect information before the booking. Common fields include name, email, company, and "What would you like to discuss?" Click "Create Scheduling Page" to save your page. It starts as a draft — open it and click **Publish** to make it live, then copy the booking URL from the **Share** tab and share it via email, embed it on your website, or add it to your email signature. ## Page Types When creating a new scheduling page, you'll first choose the page type that determines how the booking flow works. A simple booking page where visitors pick a time and provide their name and email. Best for straightforward meeting scheduling without lead capture. **Available on all plans.** Combines a lead capture form with scheduling. Visitors fill out custom form fields first, then select a meeting time. Ideal for sales demos, consultations, and qualifying leads before booking. **Requires the Pro plan or higher.** ## Meeting Formats Each page type supports three meeting formats that control how hosts are assigned. * **One-on-One** — A single host's calendar is used. Visitors see available times for that specific person. *Available on all plans.* * **Group** — Multiple team members are shown on the page. The visitor selects which person they want to meet with. *Requires the Business plan or higher.* * **Round Robin** — Meetings are automatically assigned to a team member. Choose between assigning the member who has gone the longest without a meeting or selecting a member at random. *Requires the Business plan or higher.* **Plan requirement**: Lead Capture + Schedule is available on the Pro plan and above. Group and Round Robin scheduling are available on the Business and Advanced plans. If your plan doesn't include a mode, the create-page wizard will show an upgrade prompt when you select it, and existing pages on that mode will display an “upgrade required” message to visitors until you upgrade. **Round-robin distribution** Round-robin pages offer two assignment algorithms: assign the team member who has gone the longest without a meeting (least recent), or select a member at random. Both respect each member's availability and connected calendar. ## Configuration Details When setting up your scheduling page, you'll configure these key details. * **Page Name** — A display name shown to visitors at the top of the booking page. * **URL Slug** — The URL-friendly identifier for your page (e.g., "discovery-call" or "30-min-demo"). * **Duration** — Default meeting length. Presets range from 5 minutes to 4 hours (15, 30, 45, and 60 minutes are the most common), or set a custom duration. * **Location** — Where the meeting takes place: Google Meet, Zoom, phone call, in-person, or a custom URL. Microsoft Teams coming soon. * **Description** — An optional description shown to visitors explaining what the meeting is about. *** ## Next Steps Configure durations and locations Set your available times # Event Types Source: https://docs.orbitforms.ai/guides/scheduling/event-types Event types define the different meeting options available on your scheduling page. Configure durations, locations, buffer times, and booking rules. ## What are Event Types? Event types are the different meeting options within a scheduling page. For example, you might have a "15-minute intro call," a "30-minute demo," and a "60-minute deep dive" all on the same page. Each event type has its own duration, location, buffer times, and booking rules. ## Duration Options Set how long each meeting type lasts. You can use preset durations or define a custom length. | Duration | Note | | -------- | ---------------- | | 15 min | | | 30 min | Most popular | | 45 min | | | 60 min | | | Custom | Set any duration | ## Meeting Locations Choose where your meetings take place. Each event type can have a different location. Auto-generates a Meet link when booked Creates a Zoom meeting automatically Generates a Teams meeting link Display your phone number or ask for theirs Show your office address or meeting location Provide any video conferencing or meeting URL ## Buffer Times Add breathing room before and after meetings so you're never double-booked back-to-back. Block time before each meeting for preparation. Set 5, 10, 15, or 30 minutes of buffer before a meeting can be booked. Block time after each meeting for notes and follow-up. Prevents back-to-back scheduling fatigue. ## Booking Window Control how far in advance people can book meetings with you. * **Rolling Window** — Allow bookings within a rolling number of days from today (the default is 14). For example, "next 14 days" means visitors can only book within two weeks of the current date. * **Custom Date Range** — Set a specific start and end date for availability. Useful for limited-time events, seasonal scheduling, or campaigns. You can also set a **minimum notice** (how much lead time you need before a booking, from none to 48 hours) and a **start time increment** (the spacing between offered start times, e.g. every 15 or 30 minutes). ## Daily Limits Set a maximum number of meetings that can be booked per day. Once the limit is reached, remaining slots are hidden for that day. **Prevent meeting overload** Setting a daily limit of 4-6 meetings helps maintain energy and meeting quality throughout the day. You can always adjust this per event type. ## Booking Confirmation Choose whether meetings are automatically confirmed or require your approval before being added to the calendar. Meetings are instantly confirmed and added to both calendars. Best for open availability. You review and approve each booking before it's confirmed. The visitor receives a "pending" email until you accept. **Multiple event types** You can add multiple event types to the same scheduling page. Visitors will see a selection screen where they choose which type of meeting they want before picking a time slot. *** ## Next Steps Set when you're available Categorize your meetings # Meeting Types Source: https://docs.orbitforms.ai/guides/scheduling/meeting-types Create categories for your meetings with color coding. Organize meetings by purpose and track them in analytics. ## What are Meeting Types? Meeting types are categories you create to organize different kinds of meetings. For example, you might create types like "Discovery Call," "Product Demo," "Onboarding," and "Support." Each type gets a color so you can quickly identify meetings on your calendar and in scheduling analytics. ## Creating Meeting Types Set up your meeting type categories from the Settings page. Navigate to **Settings → Meetings** in the dashboard. Click "Add Meeting Type" and enter a name like "Discovery Call" or "Product Demo". Select from 10 preset colors to visually distinguish this type on your calendar and in analytics. ## Color Coding Each meeting type is assigned a color from 10 presets. Colors appear on calendar events, in the meetings list, and in analytics charts. **Available Colors:** Green, Blue, Purple, Red, Orange, Yellow, Pink, Teal, Indigo, Gray ## Default Meeting Type One meeting type is marked as the default (shown with a "Default" badge in Settings → Meetings). It is preselected when creating new event types. ## Usage in Analytics Meeting types power your scheduling analytics, helping you understand how your time is distributed. See how many meetings you've had per type over time. The color-coded charts make it easy to spot trends. Meeting type colors appear on calendar events, making it easy to visually scan your week and understand your meeting mix. **Quick access** You can manage meeting types from **Settings → Meetings** in the dashboard. The same page also manages meeting outcomes (e.g. Live Call, No Show), which can trigger workflows when set on a meeting. *** ## Next Steps Set when you're available Set up email notifications # Notifications & Reminders Source: https://docs.orbitforms.ai/guides/scheduling/notifications Keep everyone informed with automatic email notifications. Confirmations, reminders, cancellations, and reschedule notices are all handled for you. ## Confirmation Emails When a meeting is booked, both the host and the visitor automatically receive a confirmation email with all the meeting details. The event is also added directly to the host's connected calendar. **Confirmation email includes:** * Meeting title and type * Date and time (in each recipient's timezone) * Meeting location or video link * An "Add to Google Calendar" link * Links to reschedule or cancel **Sending domain required** Notification emails are sent from the host's email address through your team's verified sending domain. Set this up once in **Settings → Sending** (see the [Email Sending Domain Setup](/guides/email-sending) guide) — without a verified domain, notification emails can't be delivered. ## Reminder Emails Reduce no-shows by sending a reminder email before the meeting. Each scheduling page can send one reminder per meeting — choose the timing in the page's **Notifications** tab. **Timing options:** 15 minutes before, 30 minutes before, 1 hour before (default), or 24 hours before. **Fewer no-shows** A reminder the day before the meeting is one of the most effective ways to cut no-show rates, especially for sales demos and consultations. ## Cancellation Emails When a meeting is cancelled by either party (including cancellations made directly in the host's Google Calendar), an automatic notification is sent to everyone involved. Cancellation emails include the original meeting details and a link to rebook. The calendar event is automatically removed from the host's calendar. ## Reschedule Emails When a meeting is rescheduled, both parties receive an updated notification with the new date and time. Reschedule emails show the new meeting time and an updated "Add to Google Calendar" link, and the original calendar event is automatically updated. ## Custom Templates Customize the content of your notification emails in the scheduling page's **Notifications** tab. Each email type (confirmation, reminder, cancellation, reschedule) can be toggled on or off, sent to the host and/or the attendee, and customized with token variables that are replaced with actual meeting data. Use the token insert button in the editor to add tokens. **Available Token Variables:** | Token | Description | | --------------------------- | ---------------------------------- | | `{{attendee_name}}` | The visitor's full name | | `{{attendee_email}}` | The visitor's email address | | `{{company}}` | The visitor's company | | `{{host_name}}` | The meeting host's name | | `{{host_email}}` | The meeting host's email | | `{{meeting_title}}` | Title of the meeting | | `{{meeting_date}}` | Formatted date of the meeting | | `{{meeting_time}}` | Start time in recipient's timezone | | `{{meeting_duration}}` | Duration in minutes | | `{{meeting_link}}` | Location or video link | | `{{calendar_link}}` | "Add to Google Calendar" link | | `{{reschedule_link}}` | Link to reschedule | | `{{cancel_link}}` | Link to cancel | | `{{event_type}}` | The booked event type | | `{{scheduling_page_title}}` | The scheduling page's title | *** ## Next Steps Share your booking page Set your available times # Sharing & Embedding Scheduling Pages Source: https://docs.orbitforms.ai/guides/scheduling/sharing Share your booking page with a direct URL, embed it on your website, add tracking pixels, and use custom domains. ## Public Booking URL Every published scheduling page has a unique booking URL that you can share directly with anyone. ``` https://orbitforms.ai/s/{teamShortId}/{slug} ``` **URL Format:** * `/s/` — The scheduling page route prefix * `{teamShortId}` — First 8 characters of your team UUID * `{slug}` — The URL slug you set when creating the page (e.g., "demo-call") ## Embedding on Your Website Embed your scheduling page directly on your website so visitors can book without leaving your site. Copy the embed code from your scheduling page's "Share" tab and paste it into your website's HTML. The booking page renders inside a sandboxed iframe. ```html theme={null} ``` ## Tracking Pixels Add tracking pixels to measure conversions and attribute bookings to your marketing campaigns. Track Facebook and Instagram ad conversions from scheduling page bookings. Send booking events to GA4 for conversion tracking and audience building. Use GTM containers for flexible tag management and custom event triggers. Attribution tracking for ad platforms with server-side event forwarding. **How to add tracking** Open your scheduling page and go to the **Settings** tab, then scroll to the **Tracking & Analytics** section. Paste your pixel ID, measurement ID, or container ID into the corresponding field. Events are fired automatically when a booking is completed. ## Custom Domain Support Use your own domain for scheduling pages instead of the default orbitforms.ai URL. This keeps your branding consistent. Go to Settings > Custom Domains and enter your domain (e.g., book.yourcompany.com). Add a CNAME record pointing your domain to cname.vercel-dns.com. Click "Verify" once your DNS changes have propagated (usually within a few minutes). An SSL certificate is automatically provisioned for your custom domain. **DNS propagation** DNS changes typically propagate within minutes, but can take up to 48 hours in some cases. If verification fails, wait a few minutes and try again. *** ## Next Steps Build your first booking page Configure email notifications # SEO Settings Source: https://docs.orbitforms.ai/guides/seo Control how your forms appear in search engines and social media with custom page titles, descriptions, images, and more. Control how your forms appear in Google search results, social media previews, and link shares with SEO settings. ## What's Included SEO settings let you customize the metadata for your form's public page. This controls what people see when your form link is shared on social media, messaging apps, or appears in search results. | Feature | Availability | What it does | | -------------------- | ------------ | -------------------------------------------------------------------------------------------------------- | | **Page Title** | All plans | Sets the `` tag and Open Graph title shown in browser tabs and link previews | | **Meta Description** | All plans | Controls the description snippet shown in Google results and social previews | | **Social Image** | All plans | Sets the Open Graph image displayed when your link is shared on Twitter, LinkedIn, Facebook, Slack, etc. | | **Favicon** | All plans | Custom browser tab icon for your form page | | **Search Indexing** | **Pro+** | Toggle whether Google and other search engines can index your form page | <Note> Page title, meta description, social image, and favicon are available on **all plans** including Free. **Search engine indexing** (allowing Google to index your form) requires the **Pro plan** or above. [View pricing →](https://orbitforms.ai/pricing) </Note> ## Where to Find SEO Settings SEO settings are located on the **Share** tab of your form's detail page. <Steps> <Step title="Open your form"> Go to your dashboard and click on the form you want to configure </Step> <Step title="Go to the Share tab"> Click the **Share** tab in the top navigation </Step> <Step title="Scroll to SEO Settings"> Below the sharing link and embed code, you'll find the SEO Settings section </Step> <Step title="Configure and save"> Fill in your desired settings and click **Save SEO Settings** </Step> </Steps> ## Page Title The page title appears in browser tabs and as the headline in search results and social media previews. If left blank, your form's title is used as the default. **Best practices:** * Keep it under 60 characters so it doesn't get truncated * Include relevant keywords naturally * Make it descriptive and compelling ## Meta Description The meta description appears as the snippet below the title in Google search results and social link previews. Keep it under 160 characters. **Best practices:** * Summarize what the form is for in one or two sentences * Include a clear call to action (e.g., "Submit your application" or "Get a free quote") * Avoid duplicate descriptions across forms ## Social Image (Open Graph) The social image is displayed as the large preview image when your form link is shared on platforms like Twitter, LinkedIn, Facebook, Slack, and iMessage. **Recommended size:** 1200 x 630 pixels * Use a clear, branded image that represents your form * Avoid too much text in the image — platforms may crop it differently * Supported formats: JPG, PNG, WebP ## Favicon Upload a custom favicon (browser tab icon) for your form page. This replaces the default OrbitForms icon. **Recommended size:** 32 x 32 pixels ## Search Engine Indexing By default, form pages are **not indexed** by search engines. You can enable indexing to allow your form to appear in Google search results. When enabled, OrbitForms sets the appropriate meta tags to allow crawlers to index the page. When disabled, a `noindex` tag is added to prevent indexing. <Warning> Changes to search indexing can take days or weeks to be reflected in Google search results. Disabling indexing does not immediately remove a page from search results. </Warning> ## Live Preview As you edit your SEO settings, a live preview card shows how your form link will appear when shared. This preview reflects your current page title, description, social image, and favicon in real time. ## Plan Requirements Most SEO settings are available on all plans. The **search engine indexing** toggle requires Pro or above. | Feature | Free | Pro | Business | | --------------------------------------------------- | ---- | --- | -------- | | Page title, meta description, social image, favicon | Yes | Yes | Yes | | Search engine indexing toggle | No | Yes | Yes | Free plan users can fully customize how their form appears when shared on social media. To allow Google to index the form page, upgrade to Pro. [View Pricing & Upgrade →](https://orbitforms.ai/pricing) *** ## Next Steps <CardGroup> <Card title="Share Options" icon="share-nodes" href="/guides/sharing"> Learn all the ways to share your forms </Card> <Card title="Custom Domains" icon="globe" href="/guides/settings"> Serve forms from your own domain </Card> <Card title="Embedding" icon="code" href="/guides/embedding"> Add forms to your website </Card> <Card title="Billing & Plans" icon="credit-card" href="/guides/billing"> Manage your subscription </Card> </CardGroup> # Sequences Source: https://docs.orbitforms.ai/guides/sequences Create automated multi-step campaigns with email and optional SMS (Salesmsg). Send from your own email address, track engagement, and enroll contacts manually or from workflows. ## How Sequences Work Sequences let you send a series of timed messages to contacts who have opted in. Each sequence consists of **email** steps and, on the **Advanced** plan, optional **SMS** steps, with configurable delays between them. When a contact is enrolled, they automatically move through each step in order. <CardGroup> <Card title="Send from your email" icon="envelope"> Emails are sent from your own address (e.g., [matt@yourcompany.com](mailto:matt@yourcompany.com)). Replies go directly to your inbox. </Card> <Card title="Track engagement" icon="eye"> Monitor open rates, click rates, and bounces for each email step in your sequence. </Card> <Card title="Timed delivery" icon="clock"> Set delays between steps (minutes, hours, or days) and configure a sending window so emails arrive during business hours. </Card> <Card title="Manage enrollments" icon="users"> Enroll contacts manually, in bulk, or automatically via workflows when someone submits a form. </Card> <Card title="SMS via Salesmsg (Advanced)" icon="message"> Add SMS steps and choose a **Send from number** in sequence settings. Each teammate connects their own Salesmsg account in **Settings → Sending**. </Card> </CardGroup> ## Getting Started <Steps> <Step title="Set up your sending domain"> Go to **Settings → Sending** and add your domain ([open Sending settings →](https://orbitforms.ai/settings/email-sending)). You'll need to add a few DNS records (SPF, DKIM, and a tracking CNAME) to verify ownership. This is a one-time setup. </Step> <Step title="Create a sequence"> Go to the Sequences page and click "New Sequence". Add email steps with subjects and body content. Set delays between steps. </Step> <Step title="Configure sender identity"> In your sequence's Settings tab, enter the From Name and From Email you want to send from. The email domain must match your verified sending domain. </Step> <Step title="Activate and enroll contacts"> Click Activate to publish the sequence, then enroll contacts manually or automatically via a workflow trigger. </Step> </Steps> <Info> See the [Email Sending Domain Setup](/guides/email-sending) guide for detailed DNS configuration instructions. </Info> ## SMS steps (Salesmsg) On the **Advanced** plan, you can click **Add SMS step** in the sequence editor. SMS is delivered through **Salesmsg**; it is not a separate workflow node. 1. **Team setup:** At least one member connects Salesmsg under **Settings → Sending** → **SMS Sending**, chooses a **Message Inbox** and **Default Phone Number**, and clicks **Save Settings**. See the [Salesmsg integration](/integrations/salesmsg) guide. 2. **Per sequence:** Open the sequence **Settings** tab → **SMS** section and set **Send from number** (required to publish if the sequence includes any SMS step). That selects both the phone number and which teammate's Salesmsg connection sends the messages. 3. **Contacts:** Enrolled contacts must have a **phone** value suitable for SMS (E.164 format, e.g. +14155551234). ## Building a Sequence The sequence editor lets you build a multi-step flow with delays between each step. | Feature | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Email Steps** | Each email step has a subject line and body. Use the editor to write your email content, and insert variables like `{{ contact.first_name }}` to personalize each message. | | **SMS Steps** | SMS steps contain message text only; the sending number is chosen in **Settings → SMS** for the whole sequence. Use variables such as `{{ contact.first_name }}` in the message body. | | **Delays** | Set the wait time between steps. Choose minutes, hours, or days. The first step can run immediately (delay of 0) or after a configured wait. | | **Send Window** | Configure a sending window (e.g., 9am-5pm) and timezone to ensure emails arrive during business hours. Optionally restrict to business days only. | | **Threading** | Enable "Thread emails" in Settings to send follow-ups in the same email thread, so the recipient sees them as a conversation. | | **Variables** | Insert dynamic content with `{{ contact.first_name }}`, `{{ contact.email }}`, `{{ contact.company }}`, `{{ sender.first_name }}`, `{{ sender.meeting_link }}`, and more. | ## Sender Identity Each sequence has its own sender identity configured in the Settings tab: * **From Name:** The display name recipients see (e.g., "Matt Smith" or "Orbit Support"). This appears in the recipient's inbox. * **From Email:** The email address emails are sent from (e.g., [matt@yourcompany.com](mailto:matt@yourcompany.com)). The domain must be verified in **Settings → Sending**. Replies go directly to this address. <Warning> **Domain Must Be Verified:** You cannot activate a sequence until the From Email's domain is verified. If you enter [matt@yourcompany.com](mailto:matt@yourcompany.com), then yourcompany.com must be set up and verified in **Settings → Sending**. </Warning> ## Unsubscribe Handling OrbitForms includes built-in unsubscribe support for compliance and deliverability. You can configure the unsubscribe link style in each sequence's Settings tab: | Option | Description | | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **"Stop hearing from me"** | Adds a soft-worded footer: "If you'd prefer not to receive these emails, you can unsubscribe here." This is the default. | | **"Unsubscribe"** | Adds a simple "Unsubscribe" link at the bottom of each email. | | **"None"** | No unsubscribe link or List-Unsubscribe header is added to the email. Use this for transactional or one-to-one style emails where an unsubscribe link is not appropriate. | <Warning> **Your Responsibility When Removing the Unsubscribe Link:** If you choose "None", no unsubscribe link will be included in your emails. It is your responsibility to ensure your emails comply with applicable anti-spam laws such as CAN-SPAM, GDPR, and CASL. Many jurisdictions require a way for recipients to opt out of commercial emails. Only remove the unsubscribe link if you are confident the emails do not require one (e.g., transactional messages or existing one-to-one conversations). </Warning> ### Unsubscribe enforcement * **Always respected:** Regardless of your unsubscribe link setting, OrbitForms will never send to a contact who is on your unsubscribe list. If a contact has previously unsubscribed, they are blocked from receiving any sequence emails even if the sequence has the unsubscribe link set to "None". * **Automatic removal:** When a contact unsubscribes (via the link, email client button, or manually added to the list), they are immediately removed from all active sequences and cannot be re-enrolled. * **List-Unsubscribe header:** When using "Stop hearing from me" or "Unsubscribe", a machine-readable List-Unsubscribe header is included. This enables the "Unsubscribe" button in Gmail and Outlook, which improves deliverability. This header is not included when set to "None". ## Exit & Entry Criteria Each sequence's Settings tab lets you control when contacts leave a sequence (**Exit criteria**) and when they're prevented from enrolling (**Entry criteria**). ### Exit criteria When any enabled condition is met, the contact is removed from the sequence automatically: | Condition | Description | | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Email reply received** | Remove the contact when they reply to any email in the sequence (enabled by default) | | **SMS reply received** | Remove the contact when they reply to any SMS in the sequence | | **Meeting booked** | Remove the contact when they schedule a meeting through your scheduler | | **Removed from another sequence** | Remove the contact when they exit one or more selected sequences. Leave the selection empty to trigger on any sequence exit. | | **Added to another sequence** | Remove the contact when they are added to one or more selected sequences — perfect for handing contacts off from one campaign to the next. Leave the selection empty to trigger on enrollment into any sequence. | <Tip> **Chain sequences together:** Use "Added to another sequence" to build handoffs. For example, when a contact is added to your "Qualified Leads" sequence, they can automatically exit your "Top of Funnel" sequence. </Tip> ### Entry criteria * **Skip if meeting already booked:** Contacts who have already scheduled a meeting through your scheduler are not enrolled. Configure the look-back period (in days) to control how far back the check goes — set it to 0 to check all time. Cancelled meetings are ignored by both the entry check and the "Meeting booked" exit condition, so a cancelled booking never affects a contact's enrollment. ## Analytics & Tracking Each sequence has an Analytics tab showing overall and per-step performance: | Metric | Description | | --------------- | ----------------------------------------------------------- | | **Open Rate** | Percentage of delivered emails that were opened | | **Click Rate** | Percentage of delivered emails with at least one link click | | **Bounce Rate** | Percentage of emails that bounced | | **Enrollments** | Total contacts enrolled, active, completed, and exited | ## Next Steps <CardGroup> <Card title="Email Sending Setup" icon="globe" href="/guides/email-sending"> Verify your sending domain </Card> <Card title="Salesmsg (SMS)" icon="message" href="/integrations/salesmsg"> Connect Salesmsg and configure inbox & numbers </Card> <Card title="Workflows" icon="workflow" href="/guides/workflows"> Auto-enroll contacts from forms </Card> </CardGroup> # Account Settings Source: https://docs.orbitforms.ai/guides/settings Manage your personal account, notifications, and security settings. ## Profile Update your personal information from the **Profile** page: * **Display Name** — How your name appears to team members and in notifications. * **Email Address** — Your login email. You can change it from the **Change Email** section. * **Avatar** — Profile picture for your account. ## Email Preferences Control which emails you receive from the **Email Preferences** section of your Profile page: | Setting | Description | | --------------- | ------------------------------------- | | Weekly Summary | A weekly digest of your form activity | | Product Updates | New features and improvements | ## Security * **Change Password** — Update your password from the Security section. Use a strong, unique password. * **Two-Factor Authentication** — Add an extra layer of security with TOTP (e.g., Google Authenticator). * **Active Sessions** — View and revoke sessions on other devices. * **Session Timeout** — Sessions expire after 30 minutes of inactivity. You'll receive a 2-minute warning before logout. ## Billing * **Current Plan** — View your plan tier and usage. * **Payment Methods** — Add or update credit cards for subscription billing. * **Invoices** — Download past invoices and receipts. ## Privacy & Consent OrbitForms may use the following types of tracking: | Type | Examples | Purpose | | ---------- | ---------- | -------------------------------------------- | | Analytics | GTM, GA4 | Understand product usage and improve the app | | Marketing | Meta Pixel | Measure ad performance and attribution | | Functional | Chat | In-app support and messaging | <Note title="Consent storage"> Your consent preferences are stored in a cookie for up to 1 year. You can update or withdraw consent at any time from the cookie banner on our website. </Note> ## Danger Zone ### Delete Account Permanently delete your account and all associated data. This action is **irreversible**. Team owners should transfer ownership or delete the team first. ### Export Your Data Under GDPR Article 20, you have the right to receive your personal data in a portable format. OrbitForms provides a JSON download of your account data. Export is limited to once per 24 hours. ## Related Topics <CardGroup> <Card title="Team Management" icon="users" href="/guides/team"> Invite members and manage roles </Card> <Card title="Back to Docs" icon="book" href="/"> Return to documentation home </Card> </CardGroup> # Share Options Source: https://docs.orbitforms.ai/guides/sharing Learn the different ways to share your forms with your audience. Learn the different ways to share your forms with your audience. ## Direct Link Every published form has a unique URL that you can share directly. Find your form's link in the **Share** tab of the form editor. ``` https://orbitforms.ai/r/{team-id}/your-form-slug ``` ### Custom Slugs You can customize your form's URL slug in the Share tab to make it more memorable and professional: * ✗ `orbitforms.ai/r/a1b2c3d4/form-abc123` * ✓ `orbitforms.ai/r/a1b2c3d4/contact-us` ## Form View Options Every form can be shared in either layout, regardless of the type chosen at creation: **Standard View** ``` orbitforms.ai/r/{team-id}/your-form ``` The default URL. Shows the form in the layout matching its type (all fields at once for Standard forms). **Flow View** ``` orbitforms.ai/r/{team-id}/your-form/flow ``` Adding `/flow` renders any form one question at a time. ## SEO Settings Customize how your form link appears in search engines and social media previews. On the **Pro plan** and above, the Share tab includes SEO settings where you can configure: * **Page title** — Controls the headline shown in Google results and link previews * **Meta description** — The snippet shown below the title in search results * **Social image** — The preview image displayed when sharing on Twitter, LinkedIn, Facebook, etc. * **Favicon** — Custom browser tab icon * **Search indexing** — Control whether Google can index your form page <Card title="SEO Settings Guide" icon="magnifying-glass" href="/guides/seo"> Learn how to configure SEO settings for your forms → </Card> ## Tracking Parameters Add UTM parameters to your form links to track where submissions come from: ``` orbitforms.ai/r/{team-id}/contact?utm_source=twitter&utm_campaign=launch ``` UTM parameters are captured with each submission and visible in your analytics. *** ## Next Steps <CardGroup> <Card title="SEO Settings" icon="magnifying-glass" href="/guides/seo"> Optimize search & social previews </Card> <Card title="Embedding" icon="code" href="/guides/embedding"> Add forms to your website </Card> <Card title="Analytics" icon="chart-bar" href="/guides/analytics"> Track form performance </Card> <Card title="Billing & Plans" icon="credit-card" href="/guides/billing"> View plan features </Card> </CardGroup> # Spam Protection Source: https://docs.orbitforms.ai/guides/spam-protection How OrbitForms protects your forms from bots and spam submissions with multiple layers of defense. OrbitForms protects every form with multiple layers of defense that work automatically — no setup required. ## Protection Layers <CardGroup> <Card title="Google reCAPTCHA v3" icon="shield-check"> Invisible behavioral scoring that flags bot traffic with no friction for real users. </Card> <Card title="Honeypot Fields" icon="bug"> Invisible traps that catch simple bots without affecting humans. </Card> <Card title="Rate Limiting" icon="gauge"> Per-IP limits backed by Redis that block abusive submission bursts. </Card> </CardGroup> ## How It Works When a user submits your form, OrbitForms applies protection layers in sequence: 1. **Rate limiting** — Obvious spam bursts are rejected before any database work happens. If the same IP exceeds the limit within the time window, the submission is blocked. 2. **Honeypot** — Honeypot fields are invisible to humans but bots often auto-fill every field. When a honeypot is filled, the submission is silently discarded — the bot gets a fake success response so it never learns it was caught, and no submission is stored. 3. **reCAPTCHA v3** — Google scores the user's behavior; low-scoring submissions are rejected. Submissions that pass all checks are processed normally. ## Publish-Time Abuse Checks Spam protection extends beyond individual submissions. When you publish a form, OrbitForms runs an abuse pipeline: * **Field-label denylist** — Blocks forms impersonating well-known brands or requesting credentials * **Heuristic scoring** — Flags phishing-shaped forms before they go live * **AI review** — An asynchronous review that can automatically unpublish forms flagged as phishing This keeps the `orbitforms.ai` domain trustworthy for everyone and protects your form links from being flagged by browsers and email providers. ## Best Practices * **Use email verification (Pro)** — Verify email addresses at entry to keep fake leads out of your CRM. See the form's **Integrate** tab for providers like ZeroBounce, Emailable, and NeverBounce. * **Watch your analytics** — Sudden submission spikes with low conversion often indicate bot traffic. * **Test after changes** — Submit a test entry after publishing to make sure real users can still submit successfully. ## Next Steps <CardGroup> <Card title="Account Settings" icon="settings" href="/guides/settings"> Manage your account and security </Card> <Card title="Analytics" icon="bar-chart-3" href="/guides/analytics"> Monitor form performance </Card> </CardGroup> # Styling & Branding Source: https://docs.orbitforms.ai/guides/styling Customize your forms to match your brand identity with colors, logos, and fonts. Customize your forms to match your brand identity with colors, logos, and fonts. ## Accessing Style Settings To customize a Standard form's appearance, open the form editor and click the **Design** tab. Flow forms have their design options in the editor's customize panel. ``` Form Editor → Design ``` ## Colors Set the colors used throughout your form — buttons, background, text, focus states, and accents. Choose colors that match your brand. You can enter any hex color code or use the color picker to select your brand color. ## Logo Upload your company logo to display at the top of your form. This helps build trust and reinforces your brand identity. You can adjust the logo's size, corner radius, and spacing. ### Logo Requirements * **Format:** PNG, JPG, GIF, or WebP * **Size:** Maximum 5MB file size * **Tip:** Use a transparent PNG for best results ## Background Customize the page background behind your form. ### Background Options * **Solid** — Simple single-color background * **Gradient** — Smooth two-color transition with a configurable angle * **Transparent** — No background, ideal for embedding on a colored page ## Typography Choose from a selection of Google Fonts (Inter, Roboto, DM Sans, Poppins, and more) to match your brand's typography. Standard forms support separate fonts for headings and body text, plus individual font sizes for the title, subtitle, labels, and inputs. ## Submit Button Customize the submit button text to match your form's purpose. Common options include: * Submit * Send * Get Started * Subscribe ## Thank You Page Use the **After Submission** tab to customize what users see after submitting your form: * **Thank-you page** — A customizable page built from blocks (heading, text, button, and more) * **Redirect** — Optionally send users straight to another URL after submitting (Pro plan and above) * **Scheduler** (flow forms) — Show one of your [scheduling pages](/guides/scheduling) right on the thank-you screen so respondents can book a meeting without leaving the form (paid plans; see [Orbit Flows](/guides/flow-forms#show-a-scheduler-after-submission)) *** ## Next Steps <CardGroup> <Card title="Sharing" icon="share-nodes" href="/guides/sharing"> Share your styled form </Card> <Card title="Embedding" icon="code" href="/guides/embedding"> Add forms to your website </Card> </CardGroup> # Submissions Source: https://docs.orbitforms.ai/guides/submissions View, manage, and export your form submissions. ## Viewing Submissions <Steps> <Step title="Go to Forms"> Navigate to **Forms** in your dashboard. </Step> <Step title="Click on a form"> Select the form whose submissions you want to view. </Step> <Step title="Navigate to Submissions tab"> Click the **Submissions** tab to see all responses. </Step> </Steps> Each submission includes: * All form field responses * Submission timestamp * Source/referrer information * UTM parameters (if present) ## Search & Filter * **Search** — Search across all field values to find specific submissions * **Filter by field values** — Build filters on any field with operators like equals, contains, starts with, ends with, is empty, and more. Filters also apply to CSV exports. ## Exporting Data ### CSV Export Export your submissions as a CSV file for use in spreadsheets, reporting tools, or data analysis. The export includes all submissions that match your current search and filters. ### JSON Download Open any individual submission to download it as a JSON file for programmatic use or debugging. ## Email Notifications Configure how you're notified about new submissions on your form's **Notifications** tab: | Option | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------- | | **Notification Email** | Receive an email when a new submission arrives | | **Multiple Recipients** | Add multiple email addresses to receive notifications | | **Custom Subject & Message** | Personalize the notification with template variables like `{{form_name}}` and `{{all_responses}}` | See the [Notifications guide](/guides/notifications) for setup details. ## Deleting Submissions You can delete individual submissions when needed. Deleted submissions are permanently removed and cannot be recovered. <Warning> **Irreversible** — Deleting a submission is permanent. Make sure to export or backup any data you need before deleting. </Warning> ## Next Steps <CardGroup> <Card title="Analytics" icon="trending-up" href="/guides/analytics"> Track form performance and conversion rates </Card> <Card title="Integrations" icon="plug" href="/guides/integrations"> Send submissions to your CRM, email tools, and more </Card> </CardGroup> # Team Management Source: https://docs.orbitforms.ai/guides/team Collaborate with your team by inviting members and managing permissions. ## Team Structure <CardGroup> <Card title="Unlimited Team Members" icon="users"> Invite as many teammates as you need on paid plans. </Card> <Card title="Role-Based Access" icon="shield"> Assign roles to control what each member can do. </Card> </CardGroup> ## Inviting Team Members <Steps> <Step title="Open team settings"> Go to **Settings → Team** in your dashboard. </Step> <Step title="Send invitation"> Enter the email address and select a role. An invitation email will be sent. </Step> <Step title="Member accepts"> The invitee clicks the link in the email to join your team. </Step> </Steps> <Note title="Pending invitations"> Invitations expire after 7 days. If an invitation expires, you can resend it from the team settings. </Note> ## Team Roles | Role | Permissions | Blocked | | ---------- | -------------------------------------------- | ----------------------------------------- | | **Owner** | Full access, billing, delete team | — | | **Admin** | Manage forms, members, settings, and billing | Delete team | | **Editor** | Create and edit forms, view submissions | Team settings, member management, billing | | **Viewer** | Read-only access to forms and submissions | Create, edit, delete, team settings | ### Owner * Full access to all team features * Manage billing and subscription * Can delete the team ### Admin * Manage forms and workflows * Invite and remove members * Change member roles * Manage billing and subscription * Cannot delete the team ### Editor * Create and edit forms * View submissions * Cannot manage team members or settings ### Viewer * View forms and submissions only * Cannot create, edit, or delete anything ## Managing Members * **Change Role** — Click the member's role dropdown and select a new role. * **Remove Member** — Click remove and confirm. The member loses access immediately. ## Team Profile * **Team Name** — Display name for your team (visible to members). * **Team Icon** — Optional avatar or logo for your team. * **Team ID** — Unique identifier used for the API and integrations. The first 8 characters appear in your form URLs (`/r/{team-id}/{slug}`). ## Next Steps <CardGroup> <Card title="Account Settings" icon="settings" href="/guides/settings"> Manage your personal account </Card> <Card title="Creating Forms" icon="file-text" href="/guides/creating-forms"> Build your first form </Card> </CardGroup> # Troubleshooting Source: https://docs.orbitforms.ai/guides/troubleshooting Common issues and how to resolve them. Can't find your answer? Contact support. ## Quick Fixes to Try First Before diving into specific issues, try these steps: 1. **Clear browser cache** — Stale cache can cause loading or display issues 2. **Try a different browser** — Rule out browser-specific problems 3. **Disable extensions** — Ad blockers or privacy extensions may interfere 4. **Check internet connection** — Ensure you have a stable connection 5. **Sign out and back in** — Refreshes your session and tokens ## Form Not Loading ### Form shows blank page * Verify the form is published * Check that the form URL is correct * Try opening the form in an incognito/private window * Ensure JavaScript is enabled in your browser ### Form loads slowly * Check your internet speed * Try reducing the number of images or large file upload fields * Disable browser extensions that might slow down the page ### Embed not showing * Confirm the embed code was pasted correctly * Check that the parent page allows iframes (some sites block embeds) * Verify there are no conflicting CSS rules hiding the iframe ## Submissions ### Not receiving submissions * Check your spam/junk folder * Verify the notification email in form settings * Ensure the form's workflow or email notification is configured * Look for failed workflow runs in the workflow run history ### Submissions showing as spam * Review [Spam Protection](/guides/spam-protection) settings * Check if reCAPTCHA or similar is enabled * Adjust spam sensitivity if legitimate submissions are being filtered ### Missing fields in submission data * Ensure all fields are included in the form schema * Check that conditional logic isn't hiding required fields * Verify the integration or webhook is mapping the correct field IDs ## Integrations ### Webhook not triggering * Verify the webhook URL is correct and publicly accessible * Check that your endpoint returns a 2xx status code * Review webhook retry logs for error details * Ensure the webhook is configured on the correct form ### Integration disconnected * Reconnect the integration from the **Integrations** page in your dashboard * Check if the third-party service has revoked access * For OAuth integrations, re-authorize when tokens expire ### Data not syncing to CRM * Confirm field mapping in the workflow or integration settings * Check for validation errors (e.g., required CRM fields not mapped) * Review the workflow run history for failed steps ## Account & Billing ### Can't access forms * Verify you're signed in with the correct account * Check that you have access to the team that owns the form * Ensure your subscription is active (no payment failures) ### Reached response limit * Each plan includes a per-billing-period response cap (50/mo Free, 1,000/mo Pro, 10,000/mo Business, 100,000/mo Advanced; annual plans get 12× the monthly cap as a single yearly bucket) * Once you hit 100%, your forms swap in an "upgrade required" message for visitors and stop saving new submissions until your billing period resets or you upgrade * We email the team owner at 50%, 90%, and 100% of the cap so there are no surprises * See your **Billing** page for current usage and to upgrade * For workflow run / AI credit limits, check your plan's specific limits separately ### Can't invite team members * Ensure you're on a plan that supports multiple team members (Pro and above) * Verify you have Owner or Admin role * Check that the invite email isn't going to spam ## Still Need Help? <CardGroup> <Card title="Email Support" icon="envelope"> Contact us at **[support@orbitforms.ai](mailto:support@orbitforms.ai)** with your team ID and a description of the issue. </Card> <Card title="Help Center" icon="book"> Browse articles and guides for more solutions. </Card> </CardGroup> ## Related Resources * [FAQ](/support/faq) * [Spam Protection](/guides/spam-protection) # Webhooks Source: https://docs.orbitforms.ai/guides/webhooks Send form submission data to any URL in real-time. Perfect for custom backends, internal tools, or services without native integrations. <Note> Webhooks require the **Pro** plan or higher. </Note> ## What are Webhooks? Webhooks are HTTP callbacks that send data to a URL you specify when events occur—such as a form submission. OrbitForms webhooks let you: * **Real-time** — Data is sent immediately when a submission is received * **Flexible** — Works with any service that accepts HTTP POST requests * **Secure** — Verify requests using HMAC-SHA256 signatures * **Retries** — Automatic retries if your endpoint fails ## Setting Up a Webhook Webhooks are configured per team and fire on form submissions. Because the payload contains your form's field names, create your form first so you know exactly which keys to expect. <Steps> <Step title="Create and publish your form"> Build your form in the editor and publish it. The keys in the webhook payload's `submission_data` object are your form's field names — so decide on final field names (e.g. `email`, `first_name`, `company`) before wiring up your endpoint, and make sure your endpoint reads the same names. </Step> <Step title="Open the Webhooks integration"> In the dashboard, go to **Integrations** and open the **Webhooks** card. </Step> <Step title="Click Add Webhook"> Click **Add Webhook** to open the configuration dialog. </Step> <Step title="Enter your endpoint URL"> Enter the full endpoint URL (e.g., `https://your-server.com/webhook`). HTTPS is required, the URL can't contain credentials, and private/internal addresses are blocked. </Step> <Step title="Select events and scope"> Choose which events to send (the dashboard offers **Form Submitted**; additional event types like `submission.updated` and `submission.deleted` are available via the API). Then choose whether the webhook applies to **Global (All forms)** or one specific form. </Step> <Step title="Set a signing secret"> Leave the signing secret blank to auto-generate one, or paste your own. The secret is shown **only once** when the webhook is created — copy it and store it somewhere safe. </Step> <Step title="Configure optional settings"> Add custom headers (names must start with an approved prefix such as `X-Custom-`), and adjust the advanced delivery settings if needed: retry count (0–5, default 3), retry delay (10–300 seconds, default 60), and timeout (5–60 seconds, default 30). </Step> <Step title="Save and test"> Click **Create Webhook**, then submit a test submission through your form. You can inspect every delivery attempt — status code, response body, and failures — in the **Delivery Logs** section of the same page. </Step> </Steps> ## Payload Format Each webhook request is sent as a JSON payload with the following structure: ```json theme={null} { "event": "submission.created", "timestamp": "2025-03-07T12:00:00.000Z", "data": { "form_id": "a1b2c3d4-...", "form_title": "Contact Form", "form_slug": "contact-form", "submission_id": "e5f6g7h8-...", "submission_data": { "email": "user@example.com", "name": "Jane Doe", "message": "Hello, I'd like to learn more." }, "submitted_at": "2025-03-07T12:00:00.000Z", "metadata": { "referrer": "https://google.com", "user_agent": "Mozilla/5.0 ...", "device_type": "desktop", "country": "US", "utm_source": "newsletter", "utm_medium": "email", "utm_campaign": "spring-launch" } } } ``` | Field | Description | | ---------------------- | -------------------------------------------------------------------------------- | | `event` | The event type (e.g., `submission.created`) | | `timestamp` | ISO 8601 timestamp of delivery | | `data.form_id` | Unique form identifier | | `data.form_title` | Display name of the form | | `data.form_slug` | URL slug of the form | | `data.submission_id` | Unique submission identifier | | `data.submission_data` | Form field values, keyed by the field names you set in the form builder | | `data.submitted_at` | When the submission was received | | `data.metadata` | Optional context: referrer, user agent, device type, country, and UTM parameters | ## Security & Verification OrbitForms signs each webhook request with HMAC-SHA256. Verify the signature before processing. ### Signature Header The signature is sent in the `X-Orbit-Signature` header in the format `sha256=<hex digest>`. Each request also includes `X-Orbit-Event` (the event type), `X-Orbit-Delivery-ID` (a unique delivery ID), and `X-Orbit-Timestamp`. ### Verification Steps 1. **Get the raw request body** — Use the raw bytes as received (do not parse and re-serialize JSON) 2. **Compute HMAC-SHA256** — Using your webhook signing secret as the key 3. **Compare with the header** — Prefix your computed hex digest with `sha256=` and compare it to the header value using a timing-safe comparison 4. **Reject if mismatched** — Do not process requests with invalid signatures Example (Node.js): ```javascript theme={null} const crypto = require('crypto'); function verifyWebhook(rawBody, signatureHeader, secret) { const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(rawBody, 'utf8') .digest('hex'); const a = Buffer.from(signatureHeader); const b = Buffer.from(expected); return a.length === b.length && crypto.timingSafeEqual(a, b); } ``` ## Error Handling & Retries ### Success Response Your endpoint should return a **2xx** status code (e.g., 200, 201, 204) to indicate successful processing. ### Automatic Retries If your endpoint returns a 5xx status, a 429, or times out, OrbitForms retries with exponential backoff and jitter — up to your configured retry count (default **3 retries**). The `Retry-After` header is honored for 429 responses. Other 4xx errors (like 400 or 404) are treated as permanent and are not retried. ### Timeout Requests time out after **30 seconds** by default (configurable from 5 to 60 seconds). Ensure your endpoint responds within this window. ## Next Steps <CardGroup> <Card title="Integrations" icon="plug" href="/guides/integrations"> Connect to CRMs, Slack, and more </Card> <Card title="API Reference" icon="zap" href="/guides/api-reference"> Programmatic access to forms and submissions </Card> </CardGroup> # Workflows Source: https://docs.orbitforms.ai/guides/workflows Automate your form data processing with powerful workflows. Enrich submissions, qualify leads with AI, and send data to your favorite tools. ## What are Workflows? Workflows let you automate what happens after someone submits your form. Instead of manually processing each submission, you can set up a sequence of actions that run automatically—like enriching contact data, qualifying leads with AI, and syncing to your CRM. **Example workflow:** 1. **Form submitted** — A new submission triggers the workflow 2. **Enrich with Clay** — Company data is added automatically 3. **Qualify with AI** — The SDR Agent classifies the lead 4. **Send to HubSpot** — The enriched, qualified lead is synced to your CRM ## Key Capabilities <CardGroup> <Card title="Form Triggers" icon="file-text"> Automatically run workflows when forms are submitted </Card> <Card title="Inbound Webhooks" icon="arrow-right-to-bracket" href="/developers/webhooks/inbound-trigger"> Send data from external systems into a workflow via signed webhook </Card> <Card title="Data Enrichment" icon="sparkles"> Enrich contacts with company data from Clay </Card> <Card title="AI Processing" icon="user-check"> Classify and qualify leads with AI agents </Card> <Card title="Smart Routing" icon="git-branch"> Filter and route data based on conditions </Card> </CardGroup> <Card title="15+ Destinations" icon="send"> Send data to HubSpot, Salesforce, Slack, Google Sheets, Airtable, Notion, and more </Card> ## Plan Availability Workflow features vary by plan. | Plan | Workflows | Features | | -------- | ----------- | --------------------------------------- | | Free | 1 workflow | Email notifications only | | Pro | 3 workflows | + CRM integrations, enrichment, routing | | Business | Unlimited | + AI agents, 100 AI credits/month | *** ## Learn More <CardGroup> <Card title="Creating Workflows" icon="file-text" href="/guides/workflows/creating"> Step-by-step guide to building your first workflow </Card> <Card title="Node Types" icon="layers" href="/guides/workflows/nodes"> All available triggers, actions, and integrations </Card> <Card title="Email Notifications" icon="bell" href="/guides/workflows/email-notifications"> Send email alerts with dynamic content </Card> <Card title="Run History" icon="bar-chart-3" href="/guides/workflows/run-history"> Monitor and debug your workflow runs </Card> </CardGroup> # Creating Workflows Source: https://docs.orbitforms.ai/guides/workflows/creating Learn how to build, configure, and activate your first workflow step by step. ## Building Your First Workflow <Steps> <Step title="Go to Workflows"> From your dashboard, click "Workflows" in the left sidebar to open the workflows page. </Step> <Step title="Create a new workflow"> Click the "New Workflow" button in the top right corner. This creates a blank workflow in draft mode. </Step> <Step title="Add a trigger"> Click "Add Node" in the top left of the canvas and select "Form Submission" under Triggers. Click on the trigger node to select which form should start this workflow. </Step> <Step title="Add action nodes"> Click "Add Node" again to add more nodes. Choose from destinations (Slack, HubSpot, etc.), AI agents, enrichment (Clay), or logic nodes (Filter, Router). </Step> <Step title="Connect the nodes"> Hover over a node to see connection handles. Click and drag from the output handle (bottom) to the input handle (top) of another node to connect them. </Step> <Step title="Configure each node"> Click on any node to open its configuration panel on the right. Set up the required options like selecting a Slack channel or mapping form fields to CRM properties. </Step> <Step title="Activate your workflow"> When your workflow is ready, click "Activate" in the toolbar. Your workflow will now run automatically when the connected form receives submissions! </Step> </Steps> ## Workflow Statuses Workflows have three possible statuses that control whether they run automatically. * **Draft** — The workflow is being built and hasn't been activated yet. Form submissions will not trigger it. This is the default state when you create a new workflow. * **Active** — The workflow is live and running. Every time the connected form receives a submission, the workflow will automatically execute all configured actions. * **Paused** — The workflow is temporarily stopped. Submissions are queued and can be processed when you resume. A workflow may be paused manually, or automatically after repeated execution errors (for example, when an integration disconnects). ## Connecting Nodes Nodes are connected by drawing edges between them. The order of connections determines the flow of data. <Steps> <Step title="See connection handles"> Hover over a node to see its connection handles (small circles on the edges). </Step> <Step title="Start dragging"> Click and drag from an output handle (usually on the bottom or right). </Step> <Step title="Drop on target"> Drop the connection onto an input handle (usually on the top or left) of another node. </Step> <Step title="Connection created"> The connection will be shown as an animated purple line with an arrow. </Step> </Steps> <Tip> **Delete connections** To delete a connection, hover over the line and click the × button that appears. You can also select a node and press Delete to remove it along with all its connections. </Tip> ## Activating & Publishing Changes Workflows use a draft/publish model to let you make changes safely without affecting the live version. 1. **Draft state** — New workflows start as drafts. You can build and test without affecting anything. 2. **First activation** — Click "Activate" to make the workflow live. Your current design becomes the "published" version. 3. **Making changes** — After activation, any edits create "unpublished changes". The live workflow keeps running the published version. 4. **Publishing changes** — Click "Publish Changes" to update the live workflow with your edits. 5. **Discarding changes** — Click "Discard Changes" to throw away unpublished edits and revert to the published version. ## Workflow Settings Click the gear icon in the workflow toolbar to access settings. * **Name** — Give your workflow a descriptive name so you can easily identify it in the list. * **Description** — Add an optional description to document what the workflow does and any important notes. ## Activation Requirements Before you can activate a workflow, it must meet these requirements: * Has a trigger node with a form selected * Has at least one action node (destination, AI agent, or enrichment) * All nodes are properly connected * Required integrations are connected (shown with a warning if not) * Required configuration is complete for each node If any requirements are missing, you'll see validation errors in the toolbar when you try to activate. *** ## Next Steps <CardGroup> <Card title="Node Types" icon="layers" href="/guides/workflows/nodes"> Explore all available nodes </Card> <Card title="Email Notifications" icon="envelope" href="/guides/workflows/email-notifications"> Set up email alerts </Card> </CardGroup> # Email Notifications Source: https://docs.orbitforms.ai/guides/workflows/email-notifications Send customized email alerts when form submissions flow through your workflow. ## Recipients Configure recipients directly on the Email Notification node. Recipients are selected from your team's members — for security, only email addresses belonging to current team members can receive notifications. If a recipient later leaves the team, they are automatically skipped at send time. You can add multiple recipients to a single node, and different workflows (or different branches of the same workflow) can notify different people — for example, routing enterprise leads to your sales team and everything else to a general inbox. ## Template Variables Use these variables in your email subject and message. They'll be replaced with actual data when the email is sent. ### Form & Submission | Variable | Description | | --------------------- | --------------------------------------- | | `{{form_name}}` | The name/title of the form | | `{{submission_id}}` | Unique ID of the submission | | `{{submission_date}}` | Formatted date and time of submission | | `{{all_responses}}` | All form responses, formatted as a list | ### Form Fields Access specific form field values by their field name. | Variable | Description | | ----------------------- | ---------------------------- | | `{{field.email}}` | Value of the "email" field | | `{{field.name}}` | Value of the "name" field | | `{{field.phone}}` | Value of the "phone" field | | `{{field.company}}` | Value of the "company" field | | `{{field.<fieldName>}}` | Any form field by its name | ### Enrichment Data Access data from enrichment nodes (like Clay) that ran before this email node. | Variable | Description | | ------------------------------- | ------------------------- | | `{{enrichment.company}}` | Enriched company name | | `{{enrichment.industry}}` | Company industry | | `{{enrichment.employee_count}}` | Number of employees | | `{{enrichment.<field>}}` | Any enrichment data field | ### AI Agent Outputs Access outputs from AI agent nodes (SDR Agent, Summarizer) that ran before this email node. | Variable | Description | | ------------------------------ | -------------------------------------------------- | | `{{agent.summary}}` | AI-generated summary | | `{{agent.bucket}}` | Qualification bucket (e.g., High-Intent ICP Match) | | `{{agent.primary_reasons}}` | Human-readable reasons for the classification | | `{{agent.recommended_action}}` | Recommended next action for the lead | | `{{agent.confidence}}` | AI confidence score (0.0-1.0) | | `{{agent.<field>}}` | Any AI agent output field | ## Example Templates ### Basic Notification **Subject:** ``` New submission: {{form_name}} ``` **Message:** ``` You have received a new form submission. {{all_responses}} Submission ID: {{submission_id}} Submitted: {{submission_date}} ``` ### Sales Alert with AI Qualification **Subject:** ``` 🔥 Qualified Lead: {{field.company}} ``` **Message:** ``` A new lead has been classified by AI! Contact: {{field.name}} Email: {{field.email}} Company: {{field.company}} Classification: {{agent.bucket}} Confidence: {{agent.confidence}} Recommended Action: {{agent.recommended_action}} Reasons: {{agent.primary_reasons}} Enriched Company Info: - Industry: {{enrichment.industry}} - Company Size: {{enrichment.employee_count}} ``` ## Troubleshooting ### Email not sending * Check that at least one recipient is added to the node, and that they're still a member of your team * Verify the workflow is active, not paused or draft * Check run history for any errors ### Variables not replacing * Check the variable syntax is correct: `{{variable_name}}` * Field names are case-sensitive * Enrichment/agent data requires those nodes to run before the email node * Check that upstream nodes completed successfully *** ## Next Steps <CardGroup> <Card title="Run History" icon="bar-chart-3" href="/guides/workflows/run-history"> Monitor and debug workflow runs </Card> <Card title="Node Types" icon="layers" href="/guides/workflows/nodes"> Explore all available nodes </Card> </CardGroup> # Node Types Source: https://docs.orbitforms.ai/guides/workflows/nodes Explore all available nodes you can use to build powerful workflows. ## Triggers Events that start your workflow. Every workflow needs exactly one trigger. ### Form Submission Triggers the workflow when a form is submitted. Select which form to connect. **Configuration:** Select the form that should trigger this workflow. Only one trigger is allowed per workflow. ### Form Abandoned Triggers the workflow when a form is abandoned after an email address was captured. Use this to run partial-submission follow-up, like sending a reminder email or notifying sales. *Business plan only.* **Configuration:** Select the form to watch. The partial data entered before abandonment is available to downstream nodes. ### Meeting Booked Triggers the workflow when a meeting is booked through a scheduling page. Use this to automate post-booking actions like CRM syncing, notifications, or lead qualification. *Pro plan or higher.* **Configuration:** No additional configuration needed — the trigger fires for all meeting bookings on your team. **Available fields:** | Field | Description | | ------------------ | -------------------------------------------------------------------------------- | | Attendee name | Name of the person who booked the meeting | | Attendee email | Email of the person who booked the meeting | | Meeting type | The meeting type (e.g. Product Demo, Customer Help) | | Meeting link | Video conferencing link (Zoom, Google Meet, etc.) | | Start time | Meeting start time (ISO 8601) | | End time | Meeting end time (ISO 8601) | | Timezone | The attendee's timezone | | Scheduling page ID | The ID of the scheduling page (find this in your scheduling page's Settings tab) | | Event type ID | The event type ID | | Host name | The name of the meeting host | | Meeting ID | Unique meeting identifier | | Contact ID | The associated contact record ID | <Tip> Use the **Scheduling Page ID** field with a Filter node to trigger workflows only for specific scheduling pages. You can find the page ID on the **Settings** tab of your scheduling page. </Tip> ### Meeting Outcome Triggers the workflow when a meeting outcome is set on a meeting (e.g. Live Call, No Show). Outcomes are managed in Settings → Meetings. *Pro plan or higher.* **Configuration:** No additional configuration needed — the trigger fires whenever an outcome is recorded for a meeting on your team. **Available fields:** | Field | Description | | -------------------- | -------------------------------------------------- | | Meeting ID | Unique meeting identifier | | Attendee name | Name of the meeting attendee | | Attendee email | Email of the meeting attendee | | Contact ID | The associated contact record ID | | Outcome name | The outcome that was set (e.g. Live Call, No Show) | | Outcome set at | When the outcome was recorded | | Meeting status | Current meeting status | | Duration (minutes) | Meeting duration in minutes | | Notes | Meeting notes | | Host name | The name of the meeting host | | Host email | The host's email address | | Scheduling page name | The scheduling page the meeting came from | | Event type name | The event type that was booked | *** ## Logic & Flow Control how data flows through your workflow based on conditions. ### Filter Continue only if conditions match. Use this to process only certain submissions. **Configuration:** Set conditions using form field values, enrichment data, or AI outputs. Submissions that don't match are stopped. ### Router Split data into different paths based on conditions. Each path can lead to different destinations. **Configuration:** Create multiple routes with their own conditions. Connect each route output to different destination nodes. ### Delay Wait a specified amount of time before continuing. Useful for follow-up sequences. **Configuration:** Set the delay duration in minutes, hours, or days. ### Lead Scoring Calculate numeric lead scores using rule-based criteria. No AI credits consumed. **Configuration:** Define scoring rules that award points when conditions are met (e.g., "If Company Size > 100, add 20 points"). Set an optional qualification threshold — leads scoring at or above it are marked as qualified. Results are available to downstream nodes as `lead_score` and `score_qualified`, and in email templates as `{{enrichment.lead_score}}` and `{{enrichment.score_qualified}}`. Business plan only. <Note> Lead Scoring is available on the **Business** plan only. </Note> *** ## Enrich Data Add company and contact information to your submissions. ### Clay Enrich submissions with company data, firmographics, and contact information from Clay. *Requires connection.* **Configuration:** Connect your Clay account. The enrichment data will be available to downstream nodes via `{{enrichment.fieldName}}` variables. *** ## AI Processing Use AI to analyze, qualify, and process your submissions. ### SDR Agent Classify leads into qualification buckets with AI. Get human-readable reasoning and recommended next actions. **Configuration:** Define your ICP description, customize the qualification buckets (Qualified and Not Qualified by default, with optional templates like High-Intent ICP Match and Potential Future Fit), and add optional field-based auto-disqualify rules that skip AI processing for obvious non-fits. Access results via `{{agent.bucket}}`, `{{agent.primary_reasons}}`, `{{agent.recommended_action}}`. Note: Add an enrichment step before this node if you want company data. ### Summarizer Generate AI summaries of form submissions. Great for long-form responses. **Configuration:** Customize the summary prompt and length. Access the summary via `{{agent.summary}}`. *** ## Automations Manage contacts and enrollments directly from the workflow. ### Set Contact Owner Assign an owner to the contact, either a specific teammate or via round robin across a group of teammates. **Configuration:** Choose the assignment mode (specific user or round robin) and the teammates to assign from. Round robin can assign the member who has gone the longest without a lead, at random, or by equal distribution. ### Tag Contact Add or remove tags on the contact. *Requires the Pro plan or higher.* **Configuration:** Choose whether to add or remove, then select one or more tags. ### Update Contact Set contact fields (name, phone, company, job title, status) manually or from prior workflow steps. See the [Update Contact](/guides/workflows/update-contact) guide for details. ### Add to Sequence Enroll the contact in an email sequence for automated outreach. **Configuration:** Select the sequence and the sender email account, or send as the contact's owner with a fallback account. *** ## Destinations Send your form data to external tools and services. ### Email Notification Send email alerts to your team when forms are submitted. **Configuration:** Configure recipients, subject, and message. Use template variables like `{{field.email}}` and `{{agent.summary}}`. ### Webhook Send form data to any URL via HTTP request. Perfect for custom integrations. **Configuration:** Enter the webhook URL and optionally choose the HTTP method (POST by default), add custom headers, and choose between sending all fields or only selected fields. ### Slack Send notifications to Slack channels when forms are submitted. *Requires connection.* **Configuration:** Connect Slack and select a channel. Choose whether to include all submission fields or only selected fields in the message, and whether to include a link to the submission. ### HubSpot Create or update contacts in HubSpot CRM. *Requires connection.* **Configuration:** Connect HubSpot and map form fields to contact properties. Optionally create notes, sync companies, and sync the Orbit contact owner to the HubSpot contact owner. ### Salesforce *(Coming Soon)* Salesforce CRM sync is in development and not yet available to add to workflows. ### Close CRM Create leads and contacts in Close CRM. *Requires connection.* **Configuration:** Connect Close and configure lead creation settings. ### ActiveCampaign Add contacts to ActiveCampaign and trigger automations. *Requires connection.* **Configuration:** Connect ActiveCampaign, select lists, and apply tags. ### Mailchimp Add subscribers to Mailchimp audiences. *Requires connection.* **Configuration:** Connect Mailchimp, select an audience, and configure merge fields. ### Google Sheets Add rows to a Google Sheets spreadsheet. *Requires connection.* **Configuration:** Connect Google and select a spreadsheet. Map form fields to columns. ### Airtable Add records to an Airtable base. *Requires connection.* **Configuration:** Connect Airtable and select a base/table. Map form fields to columns. ### Notion Add pages to a Notion database. *Requires connection.* **Configuration:** Connect Notion and select a database. Map form fields to properties. ### Pipedrive *(Coming Soon)* Pipedrive CRM sync is in development and not yet available to add to workflows. ### Attio Sync contacts and companies to Attio CRM. *Requires connection.* **Configuration:** Connect Attio and map form fields to attributes. ### Cometly Track conversions and attribution data in Cometly. *Requires connection.* **Configuration:** Connect Cometly and configure conversion event settings. ### Instantly Update the lead in Instantly (set interest status such as Meeting Booked or No Show, write custom variables) or add them to a campaign. Works with form, meeting booked, and meeting outcome triggers. *Requires connection.* **Configuration:** Connect Instantly, choose **Update lead** or **Add to campaign**, map the Email field, and optionally map other lead fields or custom variables. See the [Instantly integration guide](/integrations/instantly). ### Instantly Lookup (enrichment) Looks up the lead's email in your Instantly workspace and adds `instantly_*` fields — whether they were found, which campaign, interest status, and whether they opened, clicked, or replied — for Filters, Routers, and later steps. It also checks the lead's company domain, so `instantly_domain_found` is `true` when a colleague is in a campaign even if this person isn't. *Requires connection.* *** <Info> **Connecting Integrations** Nodes marked "Requires connection" need you to connect the integration first. Go to [Settings → Integrations](/integrations) to connect your accounts. The workflow will show a warning if a required integration isn't connected. </Info> ## Next Steps <CardGroup> <Card title="Email Notifications" icon="envelope" href="/guides/workflows/email-notifications"> Set up email alerts with variables </Card> <Card title="Integration Guides" icon="plug" href="https://orbitforms.ai/integration-guides"> Connect your CRMs and tools </Card> </CardGroup> # Run History Source: https://docs.orbitforms.ai/guides/workflows/run-history Monitor your workflow runs and debug issues when things don't work as expected. ## Viewing Run History <Steps> <Step title="Open your workflow"> Open your workflow from the Workflows list. </Step> <Step title="Click Runs"> Click the "Runs" button in the toolbar (shows run count). </Step> <Step title="Browse runs"> The run history panel opens on the right side. Browse runs by date with their status (completed, failed, running). </Step> <Step title="View details"> Click on any run to see detailed logs for each node. </Step> </Steps> ## Run Statuses Each workflow run has a status indicating whether it completed successfully. ### Completed All nodes in the workflow executed successfully. Data was sent to all configured destinations. ### Failed One or more nodes encountered an error. Click on the run to see which node failed and the error message. ### Running The workflow is currently executing. This is usually brief unless there are delays or long-running AI operations. ### Cancelled The run was stopped before completing — for example, when a workflow is paused while a run is in progress. While a workflow is paused, new submissions are queued (rather than started as runs) and can be processed when you resume. ## Run Details Click on any run to see detailed information about what happened. * **Trigger data** — The form submission that started the workflow, including all field values * **Node execution order** — Which nodes ran and in what order * **Node outputs** — The data produced by each node (enrichment results, AI outputs, etc.) * **Error messages** — If a node failed, the specific error message for that node * **Timing** — When each node started and how long it took to execute ## Troubleshooting Common Issues ### Workflow not triggering * Make sure the workflow is Active, not Draft or Paused * Verify the correct form is selected in the trigger node * Check that you're submitting the connected form, not a different one * Form must be published for submissions to trigger workflows ### Data not appearing in destination * Check run history for errors on the destination node * Verify the integration is still connected (token may have expired) * Check field mappings are configured correctly * Look for filter nodes that might be blocking the submission * Verify API rate limits haven't been exceeded on the destination ### Workflow paused unexpectedly * An integration may have disconnected — re-authenticate it * Repeated errors can cause auto-pause to prevent data loss * Check the pause reason shown in the workflow toolbar * Fix the issue, then resume and choose whether to process queued runs ### AI agent errors * Check if you have remaining AI credits (Business plan required) * Review the prompt for any issues or missing variables * Very long form responses may hit token limits — use summarization * Check the error message for specific details ## Handling Paused Workflows When a workflow is paused, new submissions are queued instead of being processed immediately. <Steps> <Step title="Open the paused workflow"> Open the paused workflow to see the pause reason. </Step> <Step title="Fix the issue"> Fix the underlying issue (reconnect integration, fix configuration, etc.). </Step> <Step title="Resume the workflow"> Click "Resume" in the toolbar. </Step> <Step title="Handle queued submissions"> Choose what to do with queued submissions: * **Process all:** Run the workflow for all queued submissions * **Skip queue:** Discard queued submissions and start fresh * **Don't process:** Keep queued submissions but don't run them automatically </Step> </Steps> *** ## Next Steps <CardGroup> <Card title="Creating Workflows" icon="plus" href="/guides/workflows/creating"> Build your first workflow </Card> <Card title="Node Types" icon="layers" href="/guides/workflows/nodes"> Explore all available nodes </Card> </CardGroup> # Update Contact Source: https://docs.orbitforms.ai/guides/workflows/update-contact Automatically set or overwrite Orbit contact fields as part of a workflow. Use static values you define, or pull data dynamically from prior steps like form submissions, enrichment, or AI nodes. ## Overview The **Update Contact** node lives in the **Automations** category of the workflow editor. When a workflow runs, this node finds the contact by email and updates the fields you configure. This is useful when you want to enrich your contact records with data that flows through the workflow — for example, setting a company name from a Clay enrichment step, updating a job title from a form field, or marking a status based on AI qualification results. <Info> **Plan requirement** The Update Contact node is available on **Pro** plans and above. </Info> ## Adding the Node 1. Open a workflow in the editor and click the **+ Add Node** button. 2. Find the **Automations** category. 3. Click **Update Contact** to add it to the canvas. 4. Connect it to the node that should run before it (e.g., a trigger, filter, or enrichment node). ## Available Contact Fields Each mapping targets one of these Orbit contact fields. You can add multiple mappings in a single node — one per field. | Field | Key | Description | | ---------- | ------------ | ------------------------------------------ | | First Name | `first_name` | The contact's first name | | Last Name | `last_name` | The contact's last name | | Phone | `phone` | Phone number | | Company | `company` | Company or organization name | | Job Title | `job_title` | The contact's role or title | | Status | `status` | Contact status label (e.g. Lead, Customer) | ## Configuring Field Mappings Click the Update Contact node on the canvas to open the configuration panel. For each field you want to set, add a mapping with three parts: <Steps> <Step title="Pick a Contact Field"> Select which Orbit contact field to update (e.g., First Name, Company, Status). Each field can only be mapped once per node. </Step> <Step title="Choose a Value Source"> Decide where the value comes from: * **Static Value** — type a fixed string (e.g., "Lead" or "Acme Corp"). * **From Prior Step** — pick a field from an upstream node (form field, enrichment data, AI output). </Step> <Step title="Set the Value"> Enter a static string, or select a field from the dropdown. The dropdown lists every field available from nodes upstream of this step. </Step> </Steps> Click **+ Add Field Mapping** to add more mappings to the same node, then click **Save**. ## Example Use Cases ### Set company name from Clay enrichment After a Clay enrichment step, map the enriched company name to the contact's Company field. ``` Contact Field: Company Source: From Prior Step → Company Name (from Clay) ``` ### Update status after AI qualification After an SDR Qualifying agent runs, set the contact's status to the AI bucket name. ``` Contact Field: Status Source: From Prior Step → Qualification Bucket (from SDR Agent) ``` ### Set a static status for all contacts from a specific form Tag every contact from a demo request form with a fixed status value. ``` Contact Field: Status Source: Static Value → Demo Request ``` ### Populate name and phone from a form submission Pull the first name, last name, and phone fields from the form trigger into the contact record. ``` Contact Field: First Name ← first_name (form field) Contact Field: Last Name ← last_name (form field) Contact Field: Phone ← phone (form field) ``` ## How It Works at Runtime 1. The workflow identifies the contact by the **email address** in the submission data. 2. For each mapping, the node resolves the value — either from the static string or by looking up the referenced field in the workflow's combined data. 3. If the resolved value differs from the current contact value, the field is updated. 4. Every change is logged in the contact's **edit history** with a "workflow" source so you can trace what changed and why. 5. If no values changed (e.g., all fields already match), the node succeeds with zero updates. ## Tips <Tip> * Place the Update Contact node **after** enrichment or AI nodes so their output fields are available in the "From Prior Step" dropdown. * You can combine static and dynamic values in the same node — for example, set Status to a fixed string and Company from enrichment. * Use the [Run History](/guides/workflows/run-history) panel to verify which fields were updated after a workflow run. * Incomplete field mappings are automatically removed on save, so only fully configured mappings are persisted. </Tip> *** ## Next Steps <CardGroup> <Card title="Node Types" icon="layers" href="/guides/workflows/nodes"> Explore all workflow node types </Card> <Card title="Contacts & Tags" icon="users" href="/guides/contacts"> Manage your contact records </Card> </CardGroup> # ActiveCampaign Integration Source: https://docs.orbitforms.ai/integrations/activecampaign Email marketing automation & CRM <img alt="ActiveCampaign" /> [Visit ActiveCampaign](https://www.activecampaign.com) Connect your OrbitForms forms to ActiveCampaign and automatically add contacts to your lists, apply tags, and trigger powerful email automation sequences. OrbitForms offers two ways to integrate: the **Integration Page** for simple form-to-list syncing, or **Workflows** for advanced routing with AI qualification and enrichment. ## Key Features <CardGroup> <Card title="Automatic Contact Sync" icon="envelope"> Create or update contacts instantly when forms are submitted </Card> <Card title="List Management" icon="list-check"> Add contacts to one or multiple lists automatically </Card> <Card title="Tag Automation" icon="tag"> Apply tags that trigger your automation sequences </Card> <Card title="Workflow Integration" icon="code-branch"> Use with AI qualification and enrichment </Card> </CardGroup> ## Integration Page vs. Workflows Choose between two methods based on your needs: **Integration Page** — Use the Integration page when you want to send **all form submissions** directly to ActiveCampaign without any filtering. * Simple 1:1 form-to-list mapping * No need for lead qualification first * Fastest setup for basic syncing **Workflows** — Use Workflows when you need **filtering, enrichment, or AI qualification** before syncing to ActiveCampaign. * Filter by lead score or qualification * Enrich leads before sending (Clay, etc.) * Use AI SDR qualification first * Route leads to different lists based on logic ## Step 1: Get Your API Credentials First, you'll need to get your API URL and API Key from ActiveCampaign. These are required to connect OrbitForms to your account. <Steps> <Step title="Log in to ActiveCampaign"> Go to activecampaign.com and sign in to your account. </Step> <Step title="Open Settings"> Click the gear icon in the bottom left corner of the sidebar. </Step> <Step title="Go to Developer settings"> In the Settings menu, find and click on "Developer". </Step> <Step title="Copy your API URL"> Your API URL looks like [https://yourname.api-us1.com](https://yourname.api-us1.com). Copy the full URL. </Step> <Step title="Copy your API Key"> Copy the long API Key string. This is your secret key—keep it secure. </Step> </Steps> <Info> Need help finding your API credentials? See the [ActiveCampaign API Documentation](https://help.activecampaign.com/hc/en-us/articles/207317590-Getting-started-with-the-API). </Info> ## Step 2: Connect via Integration Page Connect ActiveCampaign from your form's Integrations tab for quick, direct syncing of all form submissions. <Steps> <Step title="Open your form in OrbitForms"> Go to your dashboard and click on the form you want to connect. </Step> <Step title="Click the "Integrate" tab"> In the form editor, find and click the "Integrate" tab at the top. </Step> <Step title="Find ActiveCampaign"> Scroll down to find "ActiveCampaign" under the Email Marketing section. </Step> <Step title="Enter your API credentials"> Paste your API URL and API Key from Step 1 into the corresponding fields. </Step> <Step title="Click Connect"> Click the "Connect ActiveCampaign" button. You should see a success message. </Step> </Steps> ## Step 3: Configure Lists, Tags & Field Mapping After connecting, configure which lists to add contacts to, which tags to apply, and map your form fields. <Steps> <Step title="Select your lists"> Choose which ActiveCampaign lists to add contacts to. You can select multiple lists. </Step> <Step title="Configure tags"> Select tags to apply to new contacts. Tags can trigger your automation sequences in ActiveCampaign. </Step> <Step title="Map the Email field (required)"> Find a form field that contains an email address and map it to "Email". This is required. </Step> <Step title="Map additional fields"> Map other form fields to ActiveCampaign contact properties like First Name, Last Name, Phone, etc. </Step> <Step title="Save your configuration"> Click "Save" to save your configuration. The integration is now active. </Step> </Steps> ### Available Field Mappings | Field | Description | | ------------- | ------------------------------------------- | | Email | Required - the contact's email address | | First Name | Contact first name | | Last Name | Contact last name | | Phone | Contact phone number | | Custom Fields | Any custom fields defined in ActiveCampaign | ## Triggering Automations with Tags Tags are the key to triggering automation sequences in ActiveCampaign. Here's how to set them up: <Steps> <Step title="Create an automation in ActiveCampaign"> In ActiveCampaign, go to Automations → Create an Automation. Choose "Tag is added" as the trigger. </Step> <Step title="Build your automation sequence"> Add your email sequence, wait steps, conditions, and other actions. </Step> <Step title="Select the same tag in OrbitForms"> When configuring your form integration, select the same tag you used as the automation trigger. </Step> <Step title="Submit a form to trigger the automation"> When someone submits your form, the tag is applied and your automation runs automatically. </Step> </Steps> <Tip> **Pro Tip** — Use descriptive tag names like "Lead - Website Form" or "Lead - Demo Request" to easily identify the source of contacts in your automations. </Tip> ## Using ActiveCampaign with Workflows For advanced use cases, add ActiveCampaign as a destination in your workflows. This gives you more control over which submissions get synced. ### Use workflows when you need to: * Only add qualified leads after AI agent qualification * Include enriched data from Clay, Clearbit, etc. * Route different leads to different lists based on answers * Apply different tags based on lead score or qualification * Use AI SDR to classify leads before adding to ActiveCampaign ### Adding ActiveCampaign to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to sync. </Step> <Step title="Add any intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. </Step> <Step title="Add ActiveCampaign destination"> Click the + button and select ActiveCampaign from the destinations list. </Step> <Step title="Configure the ActiveCampaign node"> Select lists, tags, and map your fields. You can use enriched data from previous nodes. </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Contacts will now flow through your workflow. </Step> </Steps> ### Example: Qualified Leads Only A common workflow that only adds qualified leads to ActiveCampaign: **Form Submission** → **AI Agent (Qualify)** → **Filter (Score > 70)** → **ActiveCampaign** ## Verifying Your Integration After setting up the integration, verify that contacts are being synced to ActiveCampaign: <Steps> <Step title="Submit a test form"> Fill out and submit your form with a real email address. </Step> <Step title="Go to ActiveCampaign Contacts"> In ActiveCampaign, navigate to Contacts → All Contacts. </Step> <Step title="Search for your test contact"> Search for the email address you used. The contact should appear with the correct list(s) and tag(s). </Step> <Step title="Verify tags and list membership"> Click on the contact to verify they have the correct tags and are on the right lists. </Step> </Steps> ## Troubleshooting <Warning> **Contact not syncing to ActiveCampaign?** — Ensure the email field is mapped and contains a valid email address. ActiveCampaign requires an email to create or update contacts. </Warning> <Warning> **API key not working?** — Verify you're using the correct API URL and key from your ActiveCampaign account. Make sure the API URL includes the full domain (e.g., [https://yourname.api-us1.com](https://yourname.api-us1.com)). Go to Settings → Developer to check your credentials. </Warning> <Warning> **Tags not being applied?** — Make sure tag names match exactly (case-sensitive). If you create a new tag in OrbitForms, it will be automatically created in ActiveCampaign when the first contact is synced. </Warning> <Warning> **Custom fields not saving?** — Ensure custom fields exist in ActiveCampaign before mapping them. Go to Contacts → Manage Fields in ActiveCampaign to create custom fields first. </Warning> <Warning> **Automation not triggering?** — Make sure your automation is set to "Active" in ActiveCampaign and the trigger tag matches exactly with the tag you configured in OrbitForms. </Warning> <Warning> **Duplicate contacts in ActiveCampaign?** — If you're seeing duplicate contacts, you may have both the Integration Page and a Workflow configured for the same form. Choose one method and disable the other to avoid duplicates. </Warning> ## Resources * [Getting Started with the API](https://help.activecampaign.com/hc/en-us/articles/207317590-Getting-started-with-the-API) * [Getting Started with Automations](https://help.activecampaign.com/hc/en-us/articles/207317790-Getting-started-with-automations) * [Working with Tags](https://help.activecampaign.com/hc/en-us/articles/360000084920-How-to-add-tags-to-contacts) * [How to Create Lists](https://help.activecampaign.com/hc/en-us/articles/220356227-How-to-create-a-list) * [ActiveCampaign Website](https://www.activecampaign.com) # Airtable Integration Source: https://docs.orbitforms.ai/integrations/airtable Sync form submissions to your Airtable bases <img alt="Airtable" /> [Visit Airtable](https://www.airtable.com) Connect your OrbitForms forms to Airtable and automatically add form submissions as new records in your bases. Perfect for tracking leads, managing projects, or building custom databases. The integration uses OAuth for secure authentication—no API keys to manage. ## Key Features <CardGroup> <Card title="Real-time Sync" icon="arrows-rotate"> Form submissions are instantly added to your Airtable base </Card> <Card title="Field Mapping" icon="columns"> Map form fields to any column in your Airtable table </Card> <Card title="Auto-create Records" icon="table"> Each submission creates a new row automatically </Card> <Card title="Trigger Automations" icon="bolt"> Works with Airtable automations for advanced workflows </Card> </CardGroup> ## Before You Begin <Note> Before setting up the Airtable integration, make sure you have: * An Airtable account (free or paid) * A base with at least one table already created * Columns in your table that match the data you want to sync (e.g., Name, Email, Phone) </Note> <Info> Need to create a base first? See the [Airtable Getting Started Guide](https://support.airtable.com/docs/getting-started-with-airtable). </Info> ## Choose Your Integration Method Airtable can be set up in two ways. Choose based on your needs: ### Integration Page vs. Workflows: Which Should You Use? **Integration Page** — Use the Integration page when you want to send **all form submissions** directly to Airtable without any filtering. * Simple 1:1 form-to-Airtable mapping * No need for lead qualification first * Fastest setup for basic data sync **Workflows** — Use Workflows when you need **filtering, enrichment, or AI qualification** before sending to Airtable. * Filter by lead score or qualification * Enrich leads before sending (Clay, etc.) * Use AI SDR qualification first * Route different leads to different tables ## Setup Guide ### Step 1: Connect Your Airtable Account The Airtable integration uses OAuth for secure authentication. You'll authorize OrbitForms to access your Airtable workspace without sharing your password. <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. </Step> <Step title="Find Airtable"> Scroll down or search for "Airtable" in the integrations list. </Step> <Step title="Click to configure"> Click on the Airtable card to open the configuration panel. </Step> <Step title="Click "Connect Airtable""> You'll be redirected to Airtable to authorize the connection. </Step> <Step title="Authorize OrbitForms"> On Airtable's authorization page, select the workspace you want to connect and click "Grant access". </Step> <Step title="Return to OrbitForms"> You'll be automatically redirected back to OrbitForms. You should see "Connected to Airtable" with your email displayed. </Step> </Steps> ### Step 2: Configure a Form Mapping <Steps> <Step title="Select a form to configure"> After connecting, you'll see a list of your forms. Click on the form you want to send data from. </Step> <Step title="Select a Base"> Choose which Airtable base to send data to from the dropdown. All bases in your connected workspace will appear. </Step> <Step title="Select a Table"> Choose which table within the base to add records to. </Step> <Step title="Map your form fields"> For each form field, select the corresponding Airtable column. Column names are case-sensitive. </Step> <Step title="Click Save Mapping"> Click "Save Mapping" to save your configuration. The form will now send data to Airtable. </Step> </Steps> ## Field Mapping Map your form fields to Airtable columns. Make sure your Airtable column types match the data you're sending. | Form Field | Airtable Column | Recommended Type | | ------------------ | --------------- | ---------------- | | Name | Name | Single line text | | Email | Email | Email | | Phone Number | Phone | Phone number | | Message | Notes | Long text | | Company | Company | Single line text | | Dropdown Selection | Status | Single select | <Warning> **Important: Column Names are Case-Sensitive** — "Email" is different from "email". Make sure your Airtable column names exactly match what you select in the mapping. </Warning> ## Using Airtable with Workflows For advanced use cases, add Airtable as a destination in your workflows. This gives you more control over which submissions get sent to Airtable. ### Use workflows when you need to: * Send records only for qualified leads (after AI agent qualification) * Include enriched data in your Airtable records (from Clay, Clearbit, etc.) * Route different form submissions to different tables or bases * Use AI SDR to classify leads before adding to Airtable * Combine with other destinations like your CRM in a single flow ### Adding Airtable to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to sync. </Step> <Step title="Add any intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. </Step> <Step title="Add Airtable destination"> Click the + button and select Airtable from the destinations list. </Step> <Step title="Configure the Airtable node"> Select your base, table, and map your fields. You can use enriched data from previous nodes. </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Records will now flow through your workflow. </Step> </Steps> ### Example: Qualified Leads Only A common workflow that only adds qualified leads to Airtable: **Form Submission** → **AI Agent (Qualify)** → **Filter (Score > 70)** → **Airtable** ## Verifying Your Data After setting up the integration, verify that records are being created in Airtable: <Steps> <Step title="Submit a test form"> Fill out and submit your form with test data to create a record. </Step> <Step title="Open your Airtable base"> Go to the base and table you configured in the integration. </Step> <Step title="Verify the record"> Check that a new row appears with your form data. Records typically appear within a few seconds. </Step> </Steps> ## Troubleshooting <Warning> **Records not appearing in Airtable?** — Check that your column names exactly match the mapping (case-sensitive). Also verify that the column types in Airtable are compatible with the data you're sending. For example, sending text to a Date column will fail. </Warning> <Warning> **"No bases found" after connecting?** — Make sure you granted access to at least one workspace when authorizing the connection. You may need to disconnect and reconnect, making sure to select the workspace that contains your bases. </Warning> <Warning> **Connection expired or disconnected?** — OAuth connections can occasionally expire. Click "Reconnect" in the integration settings to re-authorize. Your existing form mappings will be preserved. </Warning> <Warning> **Duplicate records in Airtable?** — If you're seeing duplicate records, you may have both the Integration Page and a Workflow configured for the same form. Choose one method and disable the other to avoid duplicates. </Warning> <Warning> **Field type mismatch errors?** — Make sure the Airtable column type matches your data. Email addresses should go to an Email type column, phone numbers to a Phone type column, etc. For multi-select fields, ensure you're sending valid option values. </Warning> ## Resources * [Airtable Getting Started Guide](https://support.airtable.com/docs/getting-started-with-airtable) * [Airtable API Documentation](https://airtable.com/developers/web/api/introduction) * [Airtable Automations Overview](https://support.airtable.com/docs/airtable-automations-overview) * [Airtable Website](https://www.airtable.com) # Attio Integration Source: https://docs.orbitforms.ai/integrations/attio Sync form submissions to your Attio CRM <img alt="Attio" /> <Note>This integration requires a **Pro** plan.</Note> [Visit Attio](https://www.attio.com) ## Overview Connect OrbitForms to Attio to automatically create and update people and companies when forms are submitted. Our OAuth-based integration keeps your CRM data in sync with minimal effort, supporting field mapping, duplicate handling, and optional notes on each record. <CardGroup> <Card title="Create People" icon="users"> Automatically add new contacts to Attio. </Card> <Card title="Create Companies" icon="building"> Build your company database from submissions. </Card> <Card title="Smart Duplicate Handling" icon="arrows-rotate"> Update, skip, or create new records. </Card> <Card title="Attach Notes" icon="message"> Add submission details as notes on records. </Card> </CardGroup> ## Choose Your Integration Method Attio can be set up in two ways. Choose based on your needs: <CardGroup> <Card title="Integration Page" icon="link"> Connect Attio globally and configure it for each form. All submissions sync directly to your CRM. **Best for:** * Simple 1:1 form-to-CRM sync * Capturing all leads without filtering * Quick setup with OAuth connection [Set up via Integration Page](#integration-page-setup) </Card> <Card title="Workflows" icon="code-branch"> Add Attio as a destination in your workflows for advanced control over which submissions sync to your CRM. **Best for:** * Filtering by lead score or qualification * Including enriched data (from Clay, etc.) * Multi-step automations with other tools [Set up via Workflows](#using-attio-with-workflows) </Card> </CardGroup> ## Integration Page Setup Connect your Attio workspace to OrbitForms using OAuth. This secure connection gives OrbitForms permission to create and update records on your behalf. ### Step 1: Connect Your Attio Account <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. `Dashboard → Integrations (left sidebar)` </Step> <Step title="Find Attio"> Scroll down to find "Attio" under the CRM section, or use the search bar. `Search or scroll to find Attio` </Step> <Step title="Click Connect"> Click the "Connect" button on the Attio card to start the OAuth flow. `Click "Connect" button` </Step> <Step title="Log in to Attio"> You'll be redirected to Attio. Log in with your Attio credentials if prompted. `Log in to your Attio account` </Step> <Step title="Authorize OrbitForms"> Review the permissions and click "Allow" to grant OrbitForms access to your workspace. `Click "Allow" to authorize` </Step> <Step title="Connection confirmed"> You'll be redirected back to OrbitForms. The Attio card will now show "Connected" status. `Verify "Connected" status` </Step> </Steps> ### Step 2: Configure a Form <Steps> <Step title="Click on the Attio card"> After connecting, click on the Attio integration card to open the configuration panel. `Click on connected Attio card` </Step> <Step title="Select a form"> You'll see a list of your forms. Click on the form you want to configure. `Click on a form from the list` </Step> <Step title="Choose record type"> Select whether to create "People" or "Companies" records in Attio. `Select: People or Companies` </Step> <Step title="Set duplicate handling"> Choose what happens when a matching record exists: Update the existing record, Skip (don't create), or Create New. `Select duplicate behavior` </Step> <Step title="Map your form fields"> Match your form fields to Attio attributes. Email is required for People; Domain or Name for Companies. `Map form fields → Attio attributes` </Step> <Step title="Enable notes (optional)"> Toggle "Create Note" to attach the full form submission as a note on the record. `Toggle "Create Note" if desired` </Step> <Step title="Save your configuration"> Click "Save" to apply your settings. The form will now sync submissions to Attio. `Click "Save" button` </Step> </Steps> ### Field Mapping Tips <Tip> * **People:** Email is required. Also map Name, Phone, Job Title, and any custom attributes. * **Companies:** Domain or Name is required. Map fields like Industry, Employee Count, etc. * **Custom Attributes:** Any custom attributes you've created in Attio will appear in the dropdown. </Tip> ## Using Attio with Workflows For advanced use cases, add Attio as a destination in your workflows. This gives you control over which submissions get synced, and lets you enrich or qualify leads first. <Info> **Before you begin** You'll need to connect your Attio account first via the Integration Page. Complete Step 1 above before using Attio in workflows. </Info> ### Use workflows when you need to: * Filter leads by score or qualification before syncing to Attio * Include enriched data from Clay, Clearbit, or other enrichment tools * Use AI SDR to qualify leads before adding to your CRM * Route different lead types to different Attio record configurations * Combine with other destinations like Slack notifications or email ### Adding Attio to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. `Dashboard → Workflows → Create/Edit` </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to sync. `Add Trigger → Form Submission` </Step> <Step title="Add intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. `Add AI Agent, Enrichment, or Filter nodes` </Step> <Step title="Add Attio destination"> Click the + button and select Attio from the destinations list. `+ Add Destination → Attio` </Step> <Step title="Configure the Attio node"> Select record type (People/Companies), duplicate handling, and map your fields. Enriched data from previous nodes is available. `Configure record type → Map fields` </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Submissions will now flow through your workflow to Attio. `Save → Toggle Active` </Step> </Steps> ### Example: Qualified Leads to CRM A common workflow that only syncs qualified leads to Attio: **Form Submission** → **AI Agent (Qualify)** → **Filter (Score > 70)** → **Attio** ## Duplicate Handling Attio integration supports three behaviors when a matching record already exists: ### Update (Recommended) When a matching record is found (by email for People, domain for Companies), the existing record is updated with the new data. This keeps your CRM current with the latest information. ### Skip When a matching record is found, the submission is skipped entirely. No record is created or updated. Use this when you only want to capture new leads. ### Create New Attempts to create a new record even if a match exists. If Attio rejects the duplicate (e.g., unique email constraint), the existing record will be updated as a fallback. ## Troubleshooting <Warning> **Records not syncing to Attio?** First, check that your OAuth connection is still active. Go to Integrations → Attio and verify the "Connected" status. If it shows disconnected, click "Reconnect" to re-authorize. Also ensure the specific form has Attio enabled in its configuration. </Warning> <Warning> **Duplicate records being created?** Check your duplicate handling setting. If set to "Create New", Attio may create duplicates if the unique constraints allow it. Switch to "Update" to merge data into existing records, or "Skip" to ignore repeat submissions. </Warning> <Warning> **Field mapping not working?** Ensure your form field types match the expected Attio attribute types. For example, phone numbers should include country codes, and email fields must contain valid email addresses. Custom attributes in Attio will automatically appear in the mapping dropdown. </Warning> <Warning> **"Email is required" error for People?** When creating People records, an email address is required for Attio to match and manage contacts. Make sure you've mapped a form field to the "Email" Attio attribute. </Warning> <Warning> **Notes not appearing on records?** Check that the "Create Note" toggle is enabled in your form's Attio configuration. Notes are attached after the record is created or updated, so if the record sync fails, the note won't be created. </Warning> ## Common Use Cases * Capture leads from landing page forms directly into your sales pipeline * Create support requests from contact forms with full submission details * Update existing customer records with new information from repeat submissions * Trigger Attio automations when new people or companies are added * Sync event registrations and attendee data to your CRM * Build a company database from form submissions that include company info ## Resources * [Attio Developer Documentation](https://developers.attio.com/docs) * [Attio Help Center](https://attio.com/help) * [Attio Website](https://www.attio.com) *** ## Ready to Connect Your CRM? Set up the Attio integration in minutes and start syncing your form submissions automatically. [Get Started](https://orbitforms.ai/signin) ## Next Steps <CardGroup> <Card title="All Integrations" href="/integrations/overview" icon="grid"> Explore other integrations </Card> <Card title="HubSpot Integration" href="/integrations/hubspot" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/HubSpot.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=1fdf3aa6d2c9545d9ce8348dfc8ed927"> Another popular CRM </Card> </CardGroup> # Clay Integration Source: https://docs.orbitforms.ai/integrations/clay Enrich form data with company and contact info <img alt="Clay" /> <Note>This integration requires a **Pro** plan.</Note> ## Start Here OrbitForms can send form submissions to Clay for enrichment, so you can automatically look up company data, verify contacts, and score leads. This guide shows you how to create a Clay table, connect it to Orbit, and use enriched data in your workflows. ### Overview Here's the idea in plain terms: * You create a **Clay table** with a webhook source, which generates a unique URL. * When someone submits a form, Orbit sends the data to Clay via that webhook URL. * Clay enriches the data (company info, LinkedIn profiles, etc.) using its 75+ data providers. * Optionally, Clay can send the enriched data **back to Orbit** so you can use it in later workflow steps. ### Why This Matters Clay enrichment transforms basic form submissions into complete lead profiles. Instead of just getting an email address, you get company size, funding status, industry, tech stack, and more—all automatically, without any manual research. *** ## Step 1: Create a Clay Table First, set up a Clay table to receive form submissions from Orbit. [Clay Getting Started Guide](https://www.clay.com) **What to do:** * Log in to Clay and click **New Table**. * Add columns for the data you want to collect (e.g., Email, Company, First Name, Last Name). **What this does:** * Creates a destination for your form data. * You can later add enrichment columns to look up company data, LinkedIn profiles, etc. *** ## Step 2: Add Monitor Webhook Source Now you'll add a webhook source so Clay can receive data from Orbit. **What to do in Clay:** <Steps> <Step title="Open Actions menu"> In your Clay table, click **Actions** in the top menu. </Step> <Step title="Select Import → Monitor Webhook"> Select **Import** → **Monitor Webhook**. </Step> <Step title="Copy the Webhook URL"> Clay will generate a unique **Webhook URL**. </Step> <Step title="Disable auth token"> Make sure "Require Auth Token" is **OFF**. </Step> <Step title="Copy the URL"> Click **Copy** to copy the webhook URL. </Step> </Steps> <Warning> The webhook must NOT require an auth token. Orbit sends data directly without authentication headers. </Warning> *** ## Step 3: Connect Clay to Orbit You are going to tell Orbit where to send form data when a submission happens. **What to do in Orbit:** <Steps> <Step title="Navigate to Integrations"> In Orbit, navigate to **Integrations**. </Step> <Step title="Find Clay"> Find **Clay** and click to open settings. </Step> <Step title="Paste your webhook URL"> Paste your **Clay Webhook URL**. </Step> <Step title="Save"> Click **Save**. </Step> </Steps> *** ## Step 4: Add Clay to a Workflow Now add a Clay enrichment node to your workflow so form submissions flow to Clay. [Workflow Creation Guide](/guides/workflows) **What to do:** <Steps> <Step title="Create or open a workflow"> Create a new workflow or open an existing one. </Step> <Step title="Add a Form Trigger"> Add a **Form Trigger** as your starting node. </Step> <Step title="Add Clay enrichment node"> Click **+** to add a new node → choose **Enrichment** → **Clay**. </Step> <Step title="Save your workflow"> Save your workflow. </Step> </Steps> **What this does:** * Every form submission triggers the workflow. * The Clay node sends submission data to your Clay table. * The workflow continues immediately (fire-and-forget mode). <Tip> By default, Orbit sends data and continues immediately. If you need enriched data in later steps, see the "Advanced: Two-Way Data Flow" section below. </Tip> *** ## Step 5: Test the Connection Do a real test so you know Orbit is sending data and Clay is receiving it. **Test checklist:** <Steps> <Step title="Open your form"> Open your form in a browser. </Step> <Step title="Submit a test entry"> Submit a test entry with real-looking data. </Step> <Step title="Check Clay"> In Clay, check your table for a new row with the submitted data. </Step> <Step title="Check Orbit"> In Orbit, check the workflow run history to confirm it executed. </Step> </Steps> <Note> **That's it!** Data will flow from Orbit to Clay on every form submission. Use Clay's native integrations (HubSpot, Salesforce, etc.) to push enriched data to your CRM, or continue reading to send enriched data back to Orbit. </Note> *** ## Advanced: Two-Way Data Flow Need enriched data back in your Orbit workflow? Enable two-way mode and Clay will send enriched data back before the workflow continues. ### How It Works Here's the idea in plain terms: * Orbit sends form data to Clay and **waits** for a response. * Clay enriches the data and uses an **HTTP API column** to send it back. * Orbit receives the enriched data and **continues the workflow** with the new fields. The flow looks like: Form Submission → Send to Clay → Clay Enriches → Return to Orbit → Continue Workflow *** ### Step A: Enable Wait Mode in Orbit First, tell Orbit to wait for Clay's response instead of continuing immediately. **What to do:** <Steps> <Step title="Open the Clay node"> Open your workflow and click on the **Clay node**. </Step> <Step title="Toggle wait mode"> Toggle on **"Wait for enriched data"**. </Step> <Step title="Generate API Key"> In the **Advanced** section of Clay integration settings, click **Generate API Key**. </Step> <Step title="Copy the API key"> Copy the API key - you'll need it in Clay. </Step> </Steps> *** ### Step B: Send a Test from Orbit Send test data so Clay creates the necessary columns, including the correlation ID. **What to do:** <Steps> <Step title="Send Test"> In the Clay node settings, click **Send Test**. </Step> <Step title="Check Clay table"> Check your Clay table - you should see a new row with columns including `_correlation_id`. </Step> </Steps> <Tip> Clay may name the column "Correlation Id" instead of "\_correlation\_id". Note the exact name - you'll need it in the next step. </Tip> *** ### Step C: Configure Clay's HTTP API Add an HTTP API column in Clay to send enriched data back to Orbit. **What to do in Clay:** <Steps> <Step title="Add a new column"> Click **+** to add a new column. </Step> <Step title="Select HTTP API"> Select **Enrich Data** → **HTTP API**. </Step> <Step title="Configure the HTTP API"> Configure the HTTP API with the settings below. </Step> </Steps> **Required settings:** **Endpoint URL:** ``` https://orbitforms.ai/api/webhooks/clay/return ``` **Method:** `POST` **Headers:** | Key | Value | | ----------------- | ------------------------- | | `X-Orbit-API-Key` | `your_api_key_from_orbit` | **Body (JSON):** ```json theme={null} { "_correlation_id": "/Correlation Id", "company_size": "/Company Size", "industry": "/Industry", "linkedin_url": "/LinkedIn URL", "annual_revenue": "/Annual Revenue" } ``` <Warning> The `_correlation_id` field is REQUIRED. Without it, Orbit cannot match the enriched data back to your workflow. </Warning> *** ### Step D: Map Enriched Fields in Orbit Once Clay sends data back, map the fields to your contact records. **What to do:** <Steps> <Step title="Run the HTTP API column"> Run your Clay HTTP API column to send data back. </Step> <Step title="View returned fields"> In Orbit, the field mapper will display the fields Clay returned. </Step> <Step title="Map Clay fields"> Map Clay fields to contact fields (name, email, company) or create custom fields. </Step> <Step title="Save your workflow"> Save your workflow. </Step> </Steps> <Tip> Custom fields are stored in a flexible format, so you can map any data Clay returns - company size, funding, technologies, and more. </Tip> *** ## Common Issues and Fixes <AccordionGroup> <Accordion title="Can't find _correlation_id column"> * Send a test from Orbit first - Clay auto-creates columns from incoming data. * Look for a column named "Correlation Id" or "\_correlation\_id". </Accordion> <Accordion title="Invalid or missing correlation ID error"> * Reference the correct Clay column using `/Column Name` format. * Check the exact column name in your Clay table - it might be "Correlation Id" not "\_correlation\_id". </Accordion> <Accordion title="Missing X-Orbit-API-Key error"> * Add a header in Clay's HTTP API settings. * Key: `X-Orbit-API-Key` * Value: Your API key from Orbit's Clay integration settings. </Accordion> <Accordion title="Workflow times out"> * Default timeout is 5 minutes. * Make sure your Clay HTTP API column is configured to run automatically when rows are added, not manually. </Accordion> <Accordion title="Monitor Webhook errors"> * The inbound webhook (Monitor Webhook) must NOT require auth. * Only the return HTTP API needs the X-Orbit-API-Key header. </Accordion> <Accordion title="Data not appearing in Clay"> * Check that the webhook URL in Orbit exactly matches Clay's webhook URL. * Verify the workflow is active and the form trigger is correctly configured. * Check the workflow run history in Orbit for any errors. </Accordion> </AccordionGroup> *** ## Related Articles <CardGroup> <Card title="Creating Workflows" icon="diagram-project" href="/guides/workflows"> Learn how to build workflows </Card> <Card title="HubSpot Integration" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/HubSpot.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=1fdf3aa6d2c9545d9ce8348dfc8ed927" href="/integrations/hubspot"> Connect to HubSpot CRM </Card> <Card title="Salesforce Integration" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/salesforce.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=a67c88cb0f606e2be17eab30ebf0b3b5" href="/integrations/salesforce"> Connect to Salesforce </Card> <Card title="Workflow Features" icon="bolt" href="/guides/workflows"> Explore workflow capabilities </Card> </CardGroup> *** [Visit Clay](https://www.clay.com) · [All Integrations](/integrations/overview) · [Documentation](/) # Close Integration Source: https://docs.orbitforms.ai/integrations/close Sales CRM built for closing deals <img alt="Close" /> <Note>This integration requires a **Pro** plan.</Note> [Visit Close](https://www.close.com) Connect your OrbitForms forms to Close CRM and automatically create Leads and Contacts when forms are submitted. Close's built-in calling, SMS, and email features make it perfect for high-velocity sales teams that need to act fast on new leads. ## Key Features <CardGroup> <Card title="Create Leads & Contacts" icon="users"> Automatically create new Leads with Contacts from submissions </Card> <Card title="Smart Duplicate Handling" icon="arrows-rotate"> Update existing leads or skip duplicates based on email </Card> <Card title="Built-in Calling & SMS" icon="phone"> Leads sync with Close's calling and SMS features </Card> <Card title="Email Sequences" icon="envelope"> Trigger automated follow-up sequences </Card> </CardGroup> ## Choose Your Integration Method Close can be set up in two ways depending on your needs: <CardGroup> <Card title="Integration Page" icon="gear"> Connect Close from the Integrations page for a quick setup. All form submissions will be sent directly to Close. **Best for:** * Quick setup with OAuth authorization * Simple 1:1 form-to-CRM syncing * Send all submissions without filtering </Card> <Card title="Workflows" icon="code-branch"> Add Close as a destination in your workflows for advanced control over which submissions get sent. **Best for:** * Filtering by lead score or qualification * Enriching leads before sending to Close * AI qualification before CRM sync </Card> </CardGroup> ### Integration Page vs. Workflows: Which Should You Use? **Integration Page** — Use the Integration page when you want to send **all form submissions** directly to Close without any filtering. * Simple 1:1 form-to-Close mapping * No need for lead qualification first * Fastest setup for basic CRM syncing **Workflows** — Use Workflows when you need **filtering, enrichment, or AI qualification** before sending to Close. * Filter by lead score or qualification * Enrich leads before sending (Clay, etc.) * Use AI SDR qualification first * Route different leads to different statuses ## Before You Begin <Note> Before setting up the Close integration, make sure you have: * A Close account (Starter plan or higher) * Admin or user permissions to authorize integrations * A form in OrbitForms with fields to map (e.g., Email, Name, Company) </Note> ## Setup Guide Connect Close CRM to OrbitForms using OAuth. This secure authorization method gives OrbitForms permission to create and update records in your Close account. ### Step 1: Connect Close CRM <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. </Step> <Step title="Find Close"> Scroll to find "Close CRM" in the CRM section, or use the search bar. </Step> <Step title="Click Connect"> Click on the Close card, then click the "Connect Close" button to start OAuth authorization. </Step> <Step title="Authorize in Close"> You'll be redirected to Close. Log in if needed, then click "Authorize" to grant OrbitForms access. </Step> <Step title="Connection complete"> You'll be redirected back to OrbitForms. You should see a success message confirming the connection. </Step> </Steps> ### Step 2: Configure Form Mapping <Steps> <Step title="Select a form to configure"> After connecting, you'll see a list of your forms. Click on the form you want to sync with Close. </Step> <Step title="Choose record type"> Select whether to create a "Lead" (with Contact) or just a "Contact" when the form is submitted. </Step> <Step title="Configure duplicate handling"> Choose what happens if a lead with the same email already exists: Update it, skip it, or create a new one. </Step> <Step title="Map your fields"> Match each form field to the corresponding Close property. Company Name (Lead Name) is typically required. </Step> <Step title="Enable the integration"> Toggle the integration on for this form and click Save. </Step> </Steps> ## Field Mapping Map your form fields to Close properties. Below are the common mappings: | Form Field | Close Property | Notes | | ---------------------- | ----------------- | ---------------------------- | | Company | Lead/Company Name | Required for Lead creation | | Email | Contact Email | Used for duplicate detection | | First Name + Last Name | Contact Name | Can combine fields | | Phone | Contact Phone | Office or mobile | | Job Title | Contact Title | Optional | | Website | Lead URL | Company website | | Message/Notes | Lead Description | Or add as activity note | <Tip> **Using Custom Fields** — You can map form fields to any custom field in Close. Custom fields are automatically loaded from your Close account and appear in the field mapping dropdown. Custom field IDs look like `lcf_abc123`. You can find these in Close under Settings → Custom Fields. </Tip> ## Using Close with Workflows For advanced use cases, add Close as a destination in your workflows. This gives you more control over which submissions get sent to Close. ### Use workflows when you need to: * Send leads only after AI agent qualification * Include enriched data from Clay, Clearbit, etc. * Route different lead types to different statuses * Combine with other destinations like Slack or email * Use AI SDR to classify leads before syncing ### Adding Close to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to sync to Close. </Step> <Step title="Add intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. </Step> <Step title="Add Close destination"> Click the + button and select Close from the CRM destinations list. </Step> <Step title="Configure the Close node"> Select record type, configure duplicate handling, and map your fields. You can use enriched data from previous nodes. </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Leads will now flow through your workflow. </Step> </Steps> ### Example: Qualified Leads Only A common workflow that only sends qualified leads to Close: **Form Submission** → **AI Agent (Qualify)** → **Filter (Score > 70)** → **Close CRM** ## Understanding Close's Data Model <Info> **Leads and Contacts** — In Close, a **Lead** represents a company or organization. Each Lead can have multiple **Contacts** (people at that company). When you create a Lead from a form submission, a Contact is automatically created within it. </Info> <CardGroup> <Card title="Lead Fields"> * Company Name (required) * Website URL * Description * Status * Custom Fields </Card> <Card title="Contact Fields"> * Name * Title / Job Role * Email (multiple supported) * Phone (multiple supported) * URLs / Social profiles </Card> </CardGroup> ### Activity Timeline Notes When a form is submitted, OrbitForms can add a branded note to the Lead's activity timeline with all submission details. This gives your sales team full context about when and what the lead submitted, right within Close. ## Troubleshooting <Warning> **Lead not created in Close** — Close requires a Lead Name (company name) for every lead. Make sure you have this field mapped. If no company name is provided, consider mapping the email domain as a fallback. </Warning> <Warning> **OAuth connection expired** — If you see authentication errors, try disconnecting and reconnecting Close from the Integrations page. This will refresh the OAuth tokens. </Warning> <Warning> **Duplicate leads being created** — Check your duplicate handling settings. Set it to "Update existing" to update leads with the same email, or "Skip" to ignore submissions from existing leads. </Warning> <Warning> **Custom fields not syncing** — Custom fields use special IDs like `lcf_abc123`. Make sure you're mapping to the correct field ID, which you can find in Close under Settings → Custom Fields. </Warning> <Warning> **Leads from both Integration and Workflow?** — If you're seeing duplicate leads, you may have both the Integration Page and a Workflow configured for the same form. Choose one method and disable the other to avoid duplicates. </Warning> ## Resources * [Close API Key Documentation](https://developer.close.com/resources/api-keys/) * [Leads API Reference](https://developer.close.com/resources/leads/) * [Custom Fields Guide](https://help.close.com/docs/custom-fields) * [Close Website](https://www.close.com) ## Tips for Success <Tip> * Close organizes data as Leads with Contacts — each lead (company) can have multiple contacts (people) * If no company name is provided, consider using the contact's email domain as the lead name * Use Close's Smart Views to filter and prioritize form-submitted leads * Set up workflows in Close to automatically assign leads to team members * Use the activity timeline to track the full history of interactions with each lead </Tip> # Cometly Integration Source: https://docs.orbitforms.ai/integrations/cometly First-party attribution for accurate lead tracking <img alt="Cometly" /> <Note>This integration requires a **Pro** plan.</Note> [Visit Cometly](https://www.cometly.com/?comet_custom=orbitai) ## Overview Cometly provides first-party attribution tracking that helps you accurately measure which ads and campaigns are driving your form submissions. OrbitForms offers two ways to integrate with Cometly: **Pixel Tracking** for client-side attribution and **Server-Side Integration** for sending conversion events directly to Cometly's API. <CardGroup> <Card title="First-Party Attribution" icon="bullseye"> Accurate tracking that bypasses ad blockers </Card> <Card title="Campaign Insights" icon="chart-bar"> See which ads drive form submissions </Card> <Card title="Real-Time Syncing" icon="bolt"> Instant attribution data on form submit </Card> <Card title="Workflow Integration" icon="code-branch"> Use with AI qualification and enrichment </Card> </CardGroup> ## Choose Your Integration Method Cometly can be set up in two ways. Choose based on your needs: <CardGroup> <Card title="Pixel Tracking" icon="desktop"> Add the Cometly pixel to your forms for client-side tracking. The pixel loads when your form is viewed and captures attribution data. **Best for:** * Quick setup with minimal configuration * Capturing page views and form interactions * First-party domain tracking setup [Set up Pixel Tracking](#pixel-tracking-setup) </Card> <Card title="Send Form Data to Cometly" icon="server"> Send form submissions as events to Cometly. Track the source of every lead and feed conversion data back to your ad platforms. **Best for:** * Bypassing ad blockers completely * Custom field mapping to Cometly properties * Advanced workflows with filtering/enrichment [Set up Form Data Tracking](#send-form-data-to-cometly) </Card> </CardGroup> ### Integration Page vs. Workflows: Which Should You Use? <CardGroup> <Card title="Integration Page" icon="gear"> Use the Integration page when you want to send **all form submissions** directly to Cometly without any filtering. * Simple 1:1 form-to-Cometly mapping * No need for lead qualification first * Fastest setup for basic tracking </Card> <Card title="Workflows" icon="code-branch"> Use Workflows when you need **filtering, enrichment, or AI qualification** before sending to Cometly. * Filter by lead score or qualification * Enrich leads before sending (Clay, etc.) * Use AI SDR qualification first * Route different leads to different events [Learn more about Workflows](#using-cometly-with-workflows) </Card> </CardGroup> ## Pixel Tracking Setup Add the Cometly tracking pixel to your forms to capture attribution data when visitors view and submit your forms. ### Step 1: Get Your Pixel Code from Cometly <Steps> <Step title="Log in to Cometly"> Go to cometly.com and sign in to your account. Navigate to your Cometly dashboard. </Step> <Step title="Go to Space Setup"> Click on "Space Setup" in the left sidebar menu. This is where your tracking pixel lives. </Step> <Step title="Find "Tracking Pixel""> Look for the Tracking Pixel section and click to expand it. You'll see your unique pixel code here. </Step> <Step title="Copy the pixel code"> Copy the full script tag. It should look like: ```html theme={null} <script src="https://t.cometlytrack.com/e?uid=YOUR_ID"></script> ``` </Step> </Steps> <Info> For detailed screenshots from Cometly: [Install & Verify Cometly Pixel →](https://help.cometly.com/en/articles/10340439-install-verify-cometly-pixel) </Info> ### Step 2: Add the Pixel to Your Form in OrbitForms <Steps> <Step title="Open your form in OrbitForms"> Go to your dashboard and click on the form you want to track. </Step> <Step title="Click the 'Integrate' tab"> In the form editor, find and click the "Integrate" tab at the top. </Step> <Step title="Find the Cometly section"> Scroll down to find "Cometly" under the Tracking & Analytics section. </Step> <Step title="Paste your pixel code"> Paste the complete script tag you copied from Cometly into the "Cometly Pixel Code" field. </Step> <Step title="Save your form"> Click the Save button. The pixel will now load whenever your form is viewed. </Step> </Steps> <Warning> **Important:** Paste the complete script tag, not just the URL. The code must start with `<script` and end with `</script>`. </Warning> ## Send Form Data to Cometly Send your form submission data directly to Cometly as events. This allows you to track the exact source of every form submission—which ads, campaigns, keywords, and channels are driving your leads—and feed back accurate conversion data to your ad platforms' conversion APIs (Meta CAPI, Google Ads, TikTok, etc.) for better optimization and attribution. <Info> **Before you begin:** You'll need to create and configure events in Cometly first. See Cometly's guide: [Creating & Configuring Events in Cometly →](https://help.cometly.com/en/articles/8950752-creating-configuring-events) </Info> ### Step 1: Get Your Cometly API Key <Steps> <Step title="Log in to Cometly"> Go to cometly.com and sign in to your account. </Step> <Step title="Go to Integrations"> Click "Integrations" in the left sidebar menu. </Step> <Step title="Open API settings"> Click on "API" to open the API configuration page. </Step> <Step title="Create a new API key"> Click "Create API Key" and name it "OrbitForms" for easy identification. </Step> <Step title="Copy your API key"> Copy the generated API key. You'll need this in the next step. </Step> </Steps> ### Step 2: Connect Cometly in OrbitForms <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. </Step> <Step title="Find Cometly"> Scroll down or search for "Cometly" in the integrations list. </Step> <Step title="Click to configure"> Click on the Cometly card to open the configuration panel. </Step> <Step title="Paste your API key"> Paste the API key you copied from Cometly into the "API Key" field. </Step> <Step title="Click Connect"> Click the "Connect Cometly" button. You should see a success message. </Step> </Steps> ### Step 3: Configure a Form Mapping <Steps> <Step title="Select a form to configure"> After connecting, you'll see a list of your forms. Click on the form you want to send events for. </Step> <Step title="Select the event type"> Choose which Cometly event to trigger when the form is submitted. Options include Lead Generated, Sign Up, Purchase, or custom events. </Step> <Step title="Map the Email field (required)"> Find a form field that contains an email address and map it to "Email". This is required for Cometly attribution. </Step> <Step title="Map additional fields (optional)"> Map other form fields to Cometly properties like Full Name, Phone, Amount, etc. </Step> <Step title="Click Save Mapping"> Click "Save Mapping" to save your configuration. The form will now send events to Cometly. </Step> </Steps> ### Using Custom Events <Warning> **Important: New Custom Events** If you just created a new custom event in Cometly, it needs to have **at least one event tracked** before it will appear in the "Custom Events" dropdown in OrbitForms. Until then, you can select it from the "Custom Event Slots" section using its event number (e.g., `custom_event_3`). To find your custom event number in Cometly, look at the event number shown next to your custom event name (e.g., `custom_event_27`). Select this from the "Custom Event Slots" dropdown in OrbitForms. </Warning> ## Using Cometly with Workflows For advanced use cases, add Cometly as a destination in your workflows. This gives you more control over which submissions get sent to Cometly. Use workflows when you need to: * Send events only for qualified leads (after AI agent qualification) * Include enriched data in your Cometly events (from Clay, Clearbit, etc.) * Route different form submissions to different Cometly events * Combine with other destinations like your CRM in a single flow * Use AI SDR to classify leads before sending to Cometly ### Adding Cometly to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to track. </Step> <Step title="Add any intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. </Step> <Step title="Add Cometly destination"> Click the + button and select Cometly from the destinations list. </Step> <Step title="Configure the Cometly node"> Select the event type and map your fields. You can use enriched data from previous nodes. </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Events will now flow through your workflow. </Step> </Steps> <Tip> **Example: Qualified Leads Only** — A common workflow that only sends qualified leads to Cometly: Form Submission → AI Agent (Qualify) → Filter (Score > 70) → Cometly </Tip> ## Verifying Your Events After setting up either integration method, verify that events are being received in Cometly: <Steps> <Step title="Submit a test form"> Fill out and submit your form with test data to trigger an event. </Step> <Step title="Go to Cometly Events Log"> In Cometly, navigate to Events → Events Log to see incoming events. </Step> <Step title="Verify the event data"> Check that your event appears with the correct event name and field data. Events typically appear within a few seconds. </Step> </Steps> ## Troubleshooting <AccordionGroup> <Accordion title="Pixel not firing?"> Make sure you pasted the complete script tag including the opening and closing script tags. The URL must use HTTPS. If you're using first-party domain tracking, ensure your domain is properly configured in Cometly. </Accordion> <Accordion title="Custom event not appearing in dropdown?"> New custom events need at least one tracked event before appearing in the "Custom Events" section. Use the "Custom Event Slots" section to select the event by its number (e.g., custom\_event\_3) instead. </Accordion> <Accordion title="Events not showing in Cometly?"> There may be a short delay before events appear. If events still don't show after a few minutes, check that your API key is correct and that you've mapped the required Email field. </Accordion> <Accordion title=""Email field required" error?"> Cometly requires an email address for attribution matching. Make sure you map one of your form fields to the Email property before saving. </Accordion> <Accordion title="Duplicate events in Cometly?"> If you're seeing duplicate events, you may have both the Integration Page and a Workflow configured for the same form. Choose one method and disable the other to avoid duplicates. </Accordion> </AccordionGroup> ## Resources <CardGroup> <Card title="Creating & Configuring Events" icon="gear" href="https://help.cometly.com/en/articles/8950752-creating-configuring-events"> Cometly event setup guide </Card> <Card title="Install & Verify Cometly Pixel" icon="check" href="https://help.cometly.com/en/articles/10340439-install-verify-cometly-pixel"> Pixel installation guide </Card> <Card title="Cometly API Documentation" icon="code" href="https://docs.cometly.com/api-reference/endpoint/create-event"> API reference </Card> <Card title="Cometly Website" icon="globe" href="https://www.cometly.com/?comet_custom=orbitai"> Visit Cometly </Card> </CardGroup> *** ### Track the Source of Every Form Submission <img alt="Cometly" /> See exactly where every lead comes from: ads, campaigns, keywords, and channels. No manual setup or guesswork. * Automatically capture UTM parameters, referrers, and ad IDs on every submission * Connect form fills to the full customer journey, not just the last click * Attribute leads and revenue back to the exact ad or channel that drove them * Works across paid ads, organic, email, and direct traffic * First-party tracking built for accuracy, privacy, and reliability [Start Tracking With Cometly](https://www.cometly.com/?comet_custom=orbitai) *OrbitForms integrates seamlessly with Cometly* *** **Ready to Track Your Forms?** Set up Cometly in minutes and start measuring your form conversions with first-party attribution. [Get Started](https://orbitforms.ai/signin) # Custom JavaScript Source: https://docs.orbitforms.ai/integrations/custom-javascript Add custom tracking scripts, events, or any code to your forms <Note> Custom JavaScript is available on all plans, including **Free**. </Note> ## Start Here ### Overview The Custom JavaScript feature allows you to add JavaScript code to your forms. Use it for custom analytics beacons, loading third-party scripts, or any other functionality that requires JavaScript. <Warning> **Sandboxed execution** — For security, your code runs in an isolated sandbox. It cannot access the parent page, its DOM, its cookies, or globals defined by other scripts (such as `fbq` or `gtag` from the built-in Meta Pixel / Google Analytics integrations). To fire Meta Pixel or GA4 events, use the built-in [Meta Pixel](/integrations/meta-pixel) and [Google Analytics](/integrations/google-analytics) fields instead—they already fire page view and submission events for you. </Warning> ### Why This Matters Sometimes you need tracking or functionality that's specific to your stack. Custom JavaScript lets you add code to your forms—send conversion beacons to your own endpoint, or load third-party scripts inside the sandbox—without touching OrbitForms' built-in tracking. ## Use Cases <CardGroup> <Card title="Analytics Beacons" icon="bullseye"> Send custom events to your own tracking endpoint </Card> <Card title="Third-Party Scripts" icon="bolt"> Load external scripts inside the sandbox </Card> <Card title="Custom Logic" icon="gear"> Run code when the form loads </Card> <Card title="Built-in Tracking" icon="shield"> Use the Meta Pixel, GA4, GTM, and Cometly fields for standard events </Card> </CardGroup> ## Setup Guide <Steps> <Step title="Open your form settings"> Go to your form in the dashboard and click on the "Integrate" tab. `Forms → Select form → Integrate tab` </Step> <Step title="Find Custom JavaScript"> Scroll down to the Custom JavaScript section under Tracking & Analytics. `Scroll to "Custom JavaScript" section` </Step> <Step title="Enter your code"> Paste your JavaScript code into the text area. The code will execute when the form loads. `Paste code into text area` </Step> <Step title="Save your changes"> Click Save. Your custom JavaScript will now run on your form. `Click "Save" button` </Step> </Steps> ## Code Examples ### Form Slug Variable Your code has access to a `formSlug` variable containing the current form's slug: ```javascript theme={null} // Use the injected formSlug variable console.log('Form slug:', formSlug); ``` ### Send a Beacon to Your Own Endpoint Send form-load events to your own tracking endpoint: ```javascript theme={null} // Notify your own analytics endpoint when the form loads fetch('https://your-endpoint.example.com/track', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ event: 'form_loaded', form_slug: formSlug, timestamp: new Date().toISOString() }) }).catch(function(err) { console.warn('Beacon failed:', err); }); ``` ### Debug Logging Log when the form loads (for testing): ```javascript theme={null} // Debug: Log form load console.log('Orbit form loaded at:', new Date().toISOString()); console.log('Form slug:', formSlug); ``` ### Load Third-Party Script Dynamically load an external script (it loads inside the sandbox): ```javascript theme={null} // Load a third-party script (function() { var script = document.createElement('script'); script.src = 'https://example.com/widget.js'; script.async = true; document.head.appendChild(script); })(); ``` ## What the Sandbox Blocks To protect your respondents, certain code is rejected before it ever runs. The following patterns are blocked: * `eval()`, `new Function()`, `setTimeout('...')` / `setInterval('...')` with string arguments * `import` statements and dynamic `import()` * `<script>` tag injection, `innerHTML` / `outerHTML` assignment, `document.write()` * Inline event handlers (`onclick=`, etc.) and `javascript:` / `vbscript:` URLs * Accessing `document.cookie` or `globalThis` * Redirecting the page (`location.href = ...`, `window.location = ...`) * `atob()`, `String.fromCharCode`, Web Workers, `URL.createObjectURL` * Code longer than 50 KB Code containing any of these patterns is silently skipped—nothing runs. ## Important Notes <Warning> **Avoid duplicate tracking** — If you're tracking page views or submissions, use the built-in Meta Pixel, GA4, GTM, or Cometly fields rather than duplicating that logic in Custom JavaScript. This will cause duplicate events. </Warning> <Info> **When code runs** — Custom JavaScript executes once when the form page loads, inside the sandbox. If you need to run code on form submission, consider using webhooks or workflows instead. </Info> <Warning> **Security** — Only add JavaScript from sources you trust. Malicious code could affect your form's functionality or compromise user data. </Warning> ## Troubleshooting <AccordionGroup> <Accordion title="Code not running?"> Open browser developer tools (F12) and check the Console tab for errors. Syntax errors will prevent your code from executing. </Accordion> <Accordion title="Third-party function not defined?"> Globals from other scripts on the page (like `fbq` or `gtag`) are not available inside the sandbox, even if the corresponding integration is enabled. To fire Meta Pixel or GA4 events, use the built-in integration fields on the same Integrate tab instead of Custom JavaScript. </Accordion> <Accordion title="Debugging tips"> Use `console.log()` statements to verify your code is running and inspect variable values in the browser console. </Accordion> </AccordionGroup> ## Best Practices * Always test your code on a test form before applying to production * Use try/catch blocks to prevent errors from breaking your form * Check if third-party functions exist before calling them * Keep your code minimal - complex scripts may slow down form loading * Document your code with comments for future reference *** ## Ready to Add Custom Tracking? Add custom JavaScript to your forms and unlock unlimited tracking possibilities. [Get Started →](https://orbitforms.ai/signin) # Email Notifications Source: https://docs.orbitforms.ai/integrations/email-notifications Instant email alerts for form submissions ## Overview Email Notifications send you an email every time someone submits your form. Add multiple team members as recipients, customize the subject line and message with dynamic variables, and never miss a lead again. <CardGroup> <Card title="Multiple Recipients" icon="users"> Send notifications to your entire team. </Card> <Card title="Custom Templates" icon="file-lines"> Personalize subject lines and message content. </Card> <Card title="Instant Delivery" icon="bell"> Get notified the moment a form is submitted. </Card> <Card title="Workflow Integration" icon="code-branch"> Use with AI qualification and conditional logic. </Card> </CardGroup> ## Choose Your Setup Method Email notifications can be configured in two ways. Choose based on your needs: <CardGroup> <Card title="Integrations Page" icon="gear"> Create email notifications from the Integrations page in your dashboard. Best for quick setup and managing all notifications in one place. **Best for:** * Quick setup for all forms or specific forms * Managing multiple notification rules * Simple recipient and template management [Set up via Integrations](#setting-up-email-notifications) </Card> <Card title="Workflows" icon="code-branch"> Add email notifications as a destination in your workflows. Best for conditional sending and advanced automation. **Best for:** * Sending only for qualified leads * Including enriched data in emails * Conditional routing to different recipients [Set up via Workflows](#using-email-with-workflows) </Card> </CardGroup> ## Setting Up Email Notifications Follow these steps to create email notifications from the Integrations page in your dashboard. ### Step 1: Go to Integrations <Steps> <Step title="Open your dashboard"> Sign in to OrbitForms and go to your dashboard. `orbitforms.ai → Sign In` </Step> <Step title="Click "Integrations" in the sidebar"> Find and click "Integrations" in the left navigation menu. `Left sidebar → Integrations` </Step> <Step title="Find Email Notifications"> Scroll down or look for "Email Notifications" in the integrations list. `Click on Email Notifications card` </Step> </Steps> ### Step 2: Create a New Notification <Steps> <Step title="Click "Add Notification""> Click the "Add Notification" button to open the configuration modal. `Click "Add Notification" button` </Step> <Step title="Give it a name"> Enter a descriptive name like "Sales Team Alerts" or "Support Inquiries". `Type in the Name field` </Step> <Step title="Choose which forms to apply to"> Select "Global (All forms)" to notify on all submissions, or choose a specific form. `Click dropdown → Select form or Global` </Step> </Steps> <Info> **Global vs. Form-Specific** **Global** notifications fire for every form submission in your workspace. **Form-specific** notifications only fire for the selected form. </Info> ### Step 3: Add Recipients <Steps> <Step title="Click "Add team member...""> Click the dropdown to see available team members. `Click the recipients dropdown` </Step> <Step title="Select team members"> Click on each team member you want to receive notifications. You can add multiple recipients. `Click on team member names` </Step> <Step title="Review your recipients"> Selected recipients appear as tags above the dropdown. Click the X on any tag to remove them. `Review recipient tags` </Step> </Steps> <Warning> **Security:** For security reasons, only team members can receive email notifications. Need to add someone? Invite them to your team first. </Warning> ### Step 4: Customize Your Email Template <Steps> <Step title="Edit the subject line"> Customize the email subject. The default is "New submission: \{\{form\_name}}". `Edit the Subject Line field` </Step> <Step title="Customize the message"> Edit the email body. Use \{\{all\_responses}} to include all form fields. `Edit the Email Message field` </Step> <Step title="Insert variables"> Click any variable button to insert it at your cursor position. `Click variable buttons like {{form_name}}` </Step> </Steps> ### Step 5: Save and Activate <Steps> <Step title="Ensure notification is active"> Make sure the "Notification is active" toggle is enabled. `Toggle should be on (active)` </Step> <Step title="Click "Create Notification""> Click the button to save your notification. It will start working immediately. `Click "Create Notification" button` </Step> </Steps> <Tip> **Done!** Your email notification is now active. Submit a test form to verify it's working. </Tip> ## Template Variables Use these variables in your subject line and message to include dynamic content from form submissions: | Variable | Description | | ------------------- | ------------------------------------ | | `{{form_name}}` | The name of the submitted form | | `{{all_responses}}` | All field values formatted as a list | | `{{field.email}}` | Value of the email field | | `{{field.name}}` | Value of the name field | | `{{field.company}}` | Value of the company field | | `{{field.message}}` | Value of the message field | <Tip> Use `{{field.field_name}}` to reference any form field. Replace `field_name` with the field label (lowercase, spaces as underscores). </Tip> ## Using Email with Workflows For advanced use cases, add Email Notifications as a destination in your workflows. This gives you conditional control over which submissions trigger emails. ### Use workflows when you need to: * Send emails only for qualified leads (after AI agent classification) * Include enriched data in your emails (from Clay, Clearbit, etc.) * Route different submissions to different recipients * Use AI SDR analysis results in the email content * Combine with other destinations like your CRM ### Adding Email to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. `Dashboard → Workflows → Create/Edit` </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to send emails for. `Add Trigger → Form Submission` </Step> <Step title="Add filtering or enrichment (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. `Add AI Agent, Enrichment, or Filter nodes` </Step> <Step title="Add Email destination"> Click the + button and select "Email" from the destinations list. `+ Add Destination → Email` </Step> <Step title="Configure the Email node"> Add recipients, customize subject and message. You can use enriched data from previous nodes. `Configure email settings` </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Emails will now flow through your workflow. `Save → Toggle Active` </Step> </Steps> ### Example: Alert Sales for Hot Leads Only A workflow that only emails your sales team for high-quality leads: **Form Submission** → **AI Agent (Score)** → **Filter (Score > 80)** → **Email (Sales Team)** ## Testing Your Notifications After setting up email notifications, verify they're working correctly: <Steps> <Step title="Submit a test form"> Fill out and submit your form with test data. </Step> <Step title="Check your inbox"> Look for the notification email in your inbox. It should arrive within seconds. </Step> <Step title="Check spam folder"> If you don't see it, check your spam/junk folder. Add [noreply@notifications.orbitforms.ai](mailto:noreply@notifications.orbitforms.ai) to your contacts. </Step> </Steps> ## Troubleshooting <Warning> **Not receiving emails?** Check your spam folder and add `noreply@notifications.orbitforms.ai` to your contacts. Verify the recipient email is correct and the notification is set to "Active". </Warning> <Warning> **Variables not working?** Make sure variable names match exactly. Use lowercase and underscores for field names. For example, "Full Name" becomes `{{field.full_name}}`. </Warning> <Warning> **Can't add a recipient?** Only team members can receive notifications. Invite them to your team first, then they'll appear in the recipient dropdown. </Warning> <Warning> **Duplicate emails?** Check if you have both an Integration-based notification AND a Workflow email node for the same form. Use one method or the other to avoid duplicates. </Warning> <Warning> **Want different recipients per form?** Create form-specific notifications. When adding a notification, select the specific form instead of "Global (All forms)". You can create multiple notifications for different forms with different recipients. </Warning> *** ## Ready to Get Started? Set up email notifications in minutes and never miss another form submission. [Go to Integrations](https://orbitforms.ai/integrations) # Google Analytics 4 Integration Source: https://docs.orbitforms.ai/integrations/google-analytics Track form views and submissions with GA4 <img alt="Google Analytics" /> [Visit Google Analytics](https://analytics.google.com) <Warning> **Already using Google Tag Manager?** If you already have GA4 configured inside Google Tag Manager, **do not** also add your Measurement ID here. This will cause duplicate events and skew your analytics data. **Choose one method:** * **Direct GA4:** Add your Measurement ID here for simple, quick setup * **Via GTM:** Manage GA4 through Google Tag Manager for centralized control of all your tags [Learn about Google Tag Manager integration →](/integrations/google-tag-manager) </Warning> ## Overview Google Analytics 4 (GA4) integration allows you to track form views, submissions, and user behavior directly in your Google Analytics dashboard. Monitor your form performance alongside your other website analytics for a complete picture of user engagement. <CardGroup> <Card title="Form Views" icon="eye"> Track when visitors land on your form </Card> <Card title="Form Submissions" icon="paper-plane"> Measure conversions when forms are submitted </Card> <Card title="User Behavior" icon="chart-bar"> See how users interact with your forms </Card> <Card title="Traffic Sources" icon="chart-pie"> Understand where your form visitors come from </Card> </CardGroup> ## What Gets Tracked When you add your GA4 Measurement ID to a form, OrbitForms automatically sends the following events to Google Analytics: | Event Name | When It Fires | | ------------- | ------------------------------------------------------- | | `page_view` | When a visitor loads your form (automatic GA4 behavior) | | `form_submit` | When a user successfully submits the form | <Tip> You can mark `form_submit` as a conversion in GA4 to track form submissions as goals and measure conversion rates. </Tip> ## Step 1: Get Your GA4 Measurement ID Your GA4 Measurement ID starts with "G-" and can be found in your Google Analytics account. Follow these steps to find it: <Steps> <Step title="Go to Google Analytics"> Visit analytics.google.com and sign in with your Google account. </Step> <Step title="Open Admin settings"> Click on the gear icon (Admin) in the bottom left corner of the screen. </Step> <Step title="Select your property"> In the Property column (middle column), make sure the correct GA4 property is selected. </Step> <Step title="Click Data Streams"> Under the Property column, click on "Data Streams" to view your configured streams. </Step> <Step title="Select your web stream"> Click on your web data stream. If you don't have one, you'll need to create one first. </Step> <Step title="Copy the Measurement ID"> Your Measurement ID is displayed at the top right of the stream details panel. It starts with "G-" followed by 10 characters. </Step> </Steps> <Info> **Don't have a GA4 property yet?** You'll need to create a GA4 property in Google Analytics first. See Google's guide: [Set up Analytics for a website (GA4) →](https://support.google.com/analytics/answer/9304153) </Info> ## Step 2: Add GA4 to Your Form in OrbitForms Once you have your Measurement ID, add it to your form in OrbitForms to start tracking events. <Steps> <Step title="Open your form in OrbitForms"> Go to your dashboard and click on the form you want to track. </Step> <Step title="Click the 'Integrate' tab"> In the form editor, find and click the "Integrate" tab at the top. </Step> <Step title="Find Google Analytics 4"> Scroll down to find "Google Analytics 4" under the Tracking & Analytics section. </Step> <Step title="Enter your Measurement ID"> Paste the Measurement ID you copied from Google Analytics (e.g., G-XXXXXXXXXX). </Step> <Step title="Save your form"> Click the Save button. GA4 tracking is now active on your form. </Step> </Steps> <Warning> **Important:** Enter only the Measurement ID (e.g., `G-XXXXXXXXXX`), not the full tracking script. Universal Analytics IDs starting with `UA-` are not supported. </Warning> ## Step 3: Verify Your Setup After adding your Measurement ID, verify that events are being received in Google Analytics using the Realtime report. <Steps> <Step title="Open your form"> In a new browser tab, open your form by clicking "View Form" in OrbitForms or navigating to your form URL. </Step> <Step title="Go to Google Analytics Realtime"> In Google Analytics, click on Reports → Realtime in the left sidebar. </Step> <Step title="Check for page_view"> You should see your form page appear in the Realtime overview. Look for the page\_view event. </Step> <Step title="Submit a test form"> Fill out and submit your form with test data to trigger a form\_submit event. </Step> <Step title="Verify form_submit event"> In the Realtime report, click on "Event count by Event name" and look for the form\_submit event. </Step> </Steps> ## Setting Up Conversions (Optional) Mark form submissions as conversions to track them as goals, see conversion rates, and use them for Google Ads optimization. <Steps> <Step title="Go to Admin"> In Google Analytics, click the gear icon (Admin) in the bottom left. </Step> <Step title="Click Events"> Under the Property column, click on "Events" to see all tracked events. </Step> <Step title="Find form_submit"> Look for the form\_submit event in the list. If it's not there yet, you may need to wait for a submission. </Step> <Step title="Mark as conversion"> Toggle the switch in the "Mark as conversion" column to turn it on for form\_submit. </Step> </Steps> Benefits of marking as conversion: * See conversion rates in your reports * Track goal completion over time * Import conversions to Google Ads for optimization * Set up conversion alerts and reports ## Viewing Your Data Once set up, you can view your form data in several places within Google Analytics: * **Realtime Report** — See live form views and submissions as they happen * **Reports → Engagement → Events** — View form\_submit event totals and trends * **Reports → Engagement → Conversions** — Track form submissions as conversions (if enabled) * **Explore** — Create custom reports to analyze form performance by traffic source, device, etc. <Info> **Note:** While Realtime reports show data immediately, standard reports can take 24-48 hours to fully process. Use the Realtime report to verify your setup is working correctly. </Info> ## Troubleshooting <AccordionGroup> <Accordion title="Events not showing up in Realtime?"> Make sure you entered the Measurement ID correctly (starts with "G-"). Also check that you're looking at the correct GA4 property and that the form has been saved. </Accordion> <Accordion title="Invalid Measurement ID error?"> Make sure your ID starts with "G-" followed by 10 characters (e.g., G-XXXXXXXXXX). Universal Analytics IDs (UA-XXXXXX) are not supported—you need a GA4 property. </Accordion> <Accordion title="form_submit event not appearing?"> The event only fires when the form is successfully submitted. Make sure you complete and submit the form with valid data. Also check if you have an ad blocker or privacy extension that might be blocking the GA4 script. </Accordion> <Accordion title="Numbers don't match form submissions?"> Browser-based tracking can be blocked by ad blockers and privacy extensions, leading to undercounting. For more accurate tracking that bypasses blockers, consider using [Cometly's server-side integration](/integrations/cometly). </Accordion> <Accordion title="Events delayed in standard reports?"> GA4 standard reports can take 24-48 hours to process data. This is normal behavior. Use the Realtime report to verify events are being received immediately. </Accordion> </AccordionGroup> ## Resources <CardGroup> <Card title="Google Analytics Dashboard" icon="link" href="https://analytics.google.com"> Access your analytics </Card> <Card title="Set up Analytics for a website" icon="book" href="https://support.google.com/analytics/answer/9304153"> Google's setup guide </Card> <Card title="Find your Measurement ID" icon="magnifying-glass" href="https://support.google.com/analytics/answer/9267568"> Google's guide </Card> <Card title="Set up conversion events" icon="bullseye" href="https://support.google.com/analytics/answer/9143382"> Google's conversion guide </Card> </CardGroup> *** **Ready to Track Your Forms?** Set up Google Analytics 4 in minutes and start measuring your form performance. [Get Started](https://orbitforms.ai/signin) # Google Calendar Source: https://docs.orbitforms.ai/integrations/google-email-calendar Google Calendar & Google Meet integration <img alt="Google" /> Connect your Google account to sync your calendar for scheduling and auto-generate Google Meet links for booked meetings. One connection covers Google Calendar and Google Meet. <CardGroup> <Card title="Calendar Sync" icon="calendar"> Real-time calendar sync for availability checking and conflict detection </Card> <Card title="Google Meet" icon="video"> Auto-generate Meet links when someone books a meeting with you </Card> <Card title="Auto-Refresh" icon="arrows-rotate"> OAuth tokens refresh automatically — no manual reconnection needed </Card> </CardGroup> ## Prerequisites You'll need: * A Google account (personal or Google Workspace) * Member or admin access to your OrbitForms team ## Setup Guide <Steps> <Step title="Open Email & Calendar Settings"> Navigate to **Settings → Email & Calendar** in your OrbitForms dashboard. </Step> <Step title="Click "Connect Google""> Click the **Connect Google** button to begin the OAuth authorization flow. You'll be redirected to Google's consent screen. </Step> <Step title="Authorize Permissions"> Review and accept the requested permissions on Google's consent screen. Make sure to grant all requested scopes for full functionality. You'll be redirected back to OrbitForms automatically. </Step> <Step title="Verify Connection"> Once redirected back, you'll see your Google account listed as connected. Your calendars will be automatically discovered and synced. </Step> </Steps> ## Permissions OrbitForms requests the following Google OAuth scopes to power its features: <CardGroup> <Card title="Calendar Read/Write" icon="calendar"> Read your calendars for availability and create events for booked meetings </Card> <Card title="Google Meet" icon="video"> Generate Google Meet conference links for scheduling bookings </Card> </CardGroup> <Info> **Privacy Note** — OrbitForms only accesses the minimum data needed — calendar availability and event creation. We don't read your emails or access any data beyond what's required for scheduling. </Info> ## Calendar Sync Once connected, your Google Calendars are automatically discovered and synced. OrbitForms uses your calendar data for availability checking when people book meetings through your scheduling pages, and for conflict detection to prevent double-bookings. ### How Calendar Sync Works * All calendars from your Google account are automatically discovered * Select which calendars to check for conflicts in your scheduling settings * New bookings are created as events on your primary calendar * Calendar data syncs in real-time — changes are reflected immediately ## Google Meet When someone books a meeting through your scheduling page, OrbitForms can automatically generate a Google Meet link and include it in the calendar event and confirmation email. Set Google Meet as the location type in your scheduling page settings. <Tip> **Automatic Meet Links** — Meet links are generated at booking time and attached to the calendar event. Both you and the booker will receive the link in your confirmation emails. </Tip> ## Troubleshooting <AccordionGroup> <Accordion title="Token expired or connection lost"> If your Google token expires and cannot be auto-refreshed, go to Settings → Email & Calendar and click "Reconnect" next to your Google account. This will re-authorize and restore the connection. </Accordion> <Accordion title="Missing calendars"> Only calendars you have access to in Google will appear. If a calendar is missing, verify it's visible in your Google Calendar settings. Shared calendars may require the owner to grant you access. </Accordion> <Accordion title="Permission errors during authorization"> Make sure to accept all requested permissions on Google's consent screen. If you skipped a scope, disconnect and reconnect to re-authorize with full permissions. </Accordion> </AccordionGroup> <Note> **Still need help?** Reach out to our support team at [support@orbitforms.ai](mailto:support@orbitforms.ai) or visit our [Help Center](/support). </Note> *** ## Ready to connect Google? Connect your Google account to start syncing your calendar and generating Meet links. [Connect Google →](https://orbitforms.ai/settings/email-calendar) # Google Sheets Integration Source: https://docs.orbitforms.ai/integrations/google-sheets Sync form submissions to Google Sheets in real-time <img alt="Google Sheets" /> [Visit Google Sheets](https://sheets.google.com) Connect your OrbitForms forms to Google Sheets and automatically add form submissions as new rows in your spreadsheets. Perfect for creating databases, tracking responses, and sharing data with your team. Use the **Integration Page** for simple 1:1 form syncing, or **Workflows** for advanced routing and data processing. ## Key Features <CardGroup> <Card title="Real-Time Sync" icon="arrows-rotate"> Submissions automatically added as new rows </Card> <Card title="Field Mapping" icon="columns"> Map form fields to any spreadsheet column </Card> <Card title="Multiple Sheets" icon="file-spreadsheet"> Choose any spreadsheet and tab from your Drive </Card> <Card title="Workflow Integration" icon="bolt"> Combine with AI workflows and enrichment </Card> </CardGroup> ## Before You Begin <Note> Before setting up the Google Sheets integration, make sure you have: * A Google account with access to Google Sheets * A spreadsheet created with column headers in the first row * An OrbitForms account with at least one form </Note> ## Choose Your Integration Method Google Sheets can be connected in two ways. Choose based on your needs: ### Integration Page vs. Workflows: Which Should You Use? **Integration Page** — Use the Integration page when you want to send **all form submissions** directly to a spreadsheet without any filtering. * Simple 1:1 form-to-spreadsheet mapping * No need for lead qualification first * Fastest setup for basic syncing **Workflows** — Use Workflows when you need **filtering, enrichment, or AI processing** before sending to your spreadsheet. * Filter by lead score or qualification * Enrich leads before syncing (Clay, etc.) * Use AI SDR to score leads first * Route to different sheets by lead type ## Integration Page Setup The simplest way to connect Google Sheets. Follow these steps to sync all form submissions directly to your spreadsheet. ### Step 1: Prepare Your Spreadsheet <Steps> <Step title="Create or open a spreadsheet"> Go to Google Sheets and create a new spreadsheet or open an existing one. </Step> <Step title="Add column headers in row 1"> Add column names in the first row that match the data you want to collect (e.g., Name, Email, Phone, Message). </Step> <Step title="Note the sheet name"> Check the tab name at the bottom of the spreadsheet. The default is "Sheet1" but you can rename it. </Step> </Steps> <Warning> **Important:** Column headers are required in row 1. The integration uses these headers to map form fields to columns. </Warning> ### Step 2: Connect Your Google Account <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. </Step> <Step title="Find Google Sheets"> Scroll down or search for "Google Sheets" in the integrations list. </Step> <Step title="Click Connect Google Account"> Click the "Connect Google Account" button to start the authorization process. </Step> <Step title="Authorize OrbitForms"> Sign in to your Google account and allow OrbitForms to access your Google Sheets. Review the permissions and click "Allow". </Step> <Step title="Confirm connection"> You should see a success message and your Google account name will appear. You're now connected! </Step> </Steps> ### Step 3: Configure a Form Mapping <Steps> <Step title="Select a form to configure"> After connecting, you'll see a list of your forms. Click on the form you want to sync to Google Sheets. </Step> <Step title="Select your spreadsheet"> Click "Select Spreadsheet" and choose the spreadsheet in the Google Picker that opens. Selecting a file grants OrbitForms access to that specific spreadsheet. </Step> <Step title="Select the sheet (tab)"> Choose which sheet (tab) within the spreadsheet should receive the form data. </Step> <Step title="Map your form fields"> For each form field, select which spreadsheet column it should map to. The dropdown shows your column headers from row 1. </Step> <Step title="Save your mapping"> Click "Save" to save your configuration. Form submissions will now automatically appear as new rows in your spreadsheet. </Step> </Steps> ## Field Mapping Reference Map your form fields to spreadsheet columns. Here's an example of a typical mapping: | Form Field | Spreadsheet Column | Description | | ------------ | ------------------ | --------------------------- | | Name | A: Name | Full name of the person | | Email | B: Email | Email address | | Phone Number | C: Phone | Phone number | | Company | D: Company | Company or organization | | Message | E: Notes | Form message or notes | | Submitted At | F: Timestamp | Date and time of submission | <Tip> You can also map system fields like `Submitted At`, `Submission ID`, and `Form Name` to track metadata. </Tip> ## Using Google Sheets with Workflows For advanced use cases, add Google Sheets as a destination in your workflows. This gives you more control over which submissions get synced and allows you to process data before it reaches your spreadsheet. ### Use workflows when you need to: * Only sync qualified leads (after AI agent classifies them) * Enrich data before syncing (from Clay, Clearbit, etc.) * Add AI-generated fields like summaries or categories * Route different submissions to different spreadsheets * Combine with other destinations (CRM, Slack, etc.) ### Adding Google Sheets to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to sync. </Step> <Step title="Add intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. </Step> <Step title="Add Google Sheets destination"> Click the + button and select Google Sheets from the destinations list. </Step> <Step title="Configure the Google Sheets node"> Select your spreadsheet, choose the sheet tab, and map your fields. You can use enriched data from previous nodes. </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Submissions will now flow through your workflow to the spreadsheet. </Step> </Steps> ### Example: Enriched Lead Tracking A workflow that enriches leads before adding them to your spreadsheet: **Form Submission** → **Clay (Enrich)** → **AI Agent (Score)** → **Google Sheets** ## Verifying Your Sync After setting up either method, verify that submissions are being synced correctly: <Steps> <Step title="Submit a test form"> Fill out and submit your form with test data to trigger a sync. </Step> <Step title="Open your spreadsheet"> Go to Google Sheets and open the spreadsheet you configured. </Step> <Step title="Check for the new row"> Look for a new row with your test data. It should appear within a few seconds of submission. </Step> </Steps> ## Troubleshooting <Warning> **Rows not appearing in spreadsheet?** — Make sure your spreadsheet has column headers in the first row. The integration requires headers to map fields correctly. Also verify that you've saved your field mappings. </Warning> <Warning> **Google authorization expired?** — If the connection stops working, disconnect and reconnect your Google account from the Integrations page. Google tokens can expire after extended periods of inactivity. </Warning> <Warning> **Data appearing in wrong columns?** — Double-check your field mappings in the integration settings. Each form field should be mapped to the correct column. If you've renamed columns in your spreadsheet, you may need to update the mappings. </Warning> <Warning> **Wrong sheet (tab) selected?** — If data appears in the wrong tab, edit the integration and select the correct sheet from the dropdown. Each spreadsheet can have multiple sheets (tabs). </Warning> <Warning> **Duplicate rows in spreadsheet?** — If you're seeing duplicate rows, you may have both the Integration Page and a Workflow configured for the same form. Choose one method and disable the other to avoid duplicates. </Warning> ## Resources * [Create a New Spreadsheet](https://docs.google.com/spreadsheets) * [Google Sheets Help Center](https://support.google.com/docs/answer/46973) * [Google Sheets Website](https://sheets.google.com) # Google Tag Manager Source: https://docs.orbitforms.ai/integrations/google-tag-manager Manage all your tracking tags in one place <img alt="Google Tag Manager" /> [Visit Google Tag Manager](https://tagmanager.google.com) <Info> **GTM vs. Direct Integration: Which Should You Use?** OrbitForms supports both direct tracking (adding GA4, Meta Pixel, etc. directly in form settings) and Google Tag Manager. Choose based on your needs: **Use Direct Integration if:** * You want quick, simple setup * You only need 1-2 tracking pixels * You don't have a GTM account **Use GTM if:** * You want centralized tag management * You need multiple tracking tags * You want version control & preview <Warning> **Important:** Don't use both! If you configure GA4 or Meta Pixel in GTM, don't also add them directly in Orbit's form settings. This causes duplicate events. </Warning> </Info> ## Overview Google Tag Manager (GTM) is a tag management system that lets you manage and deploy tracking tags on your forms without editing code. Once connected, you can add, edit, and disable tags from the GTM interface without making changes to your forms. Use GTM to deploy GA4, Meta Pixel, LinkedIn Insight Tag, conversion pixels, and more—all from one central dashboard. <CardGroup> <Card title="Centralized Tags" icon="tag"> Manage all your tracking codes from one dashboard </Card> <Card title="Multiple Platforms" icon="layer-group"> Add GA4, Meta Pixel, LinkedIn, TikTok, and more </Card> <Card title="No Code Changes" icon="bolt"> Update tracking without touching your forms </Card> <Card title="Version Control" icon="gear"> Preview changes and roll back if needed </Card> </CardGroup> ## How It Works When you add GTM to your OrbitForms form, here's what happens: <CardGroup> <Card title="1. GTM Loads" icon="code"> When your form loads, the GTM container script is injected automatically. </Card> <Card title="2. Events Fire" icon="chart-bar"> Orbit pushes events to the data layer (form view, start, submit). </Card> <Card title="3. Tags Trigger" icon="bullseye"> Your configured tags fire based on triggers you set up in GTM. </Card> </CardGroup> ## Step 1: Get Your GTM Container ID Your GTM Container ID starts with "GTM-" and is found in your Google Tag Manager account. If you don't have an account yet, you'll create one. <Steps> <Step title="Go to Google Tag Manager"> Open your browser and navigate to the Google Tag Manager website. [tagmanager.google.com](https://tagmanager.google.com) </Step> <Step title="Sign in with your Google account"> Use your Google account to sign in. This can be any Google account—personal or workspace. </Step> <Step title="Create or select an account"> If this is your first time, click "Create Account". Otherwise, select your existing account from the list. </Step> <Step title="Create a container (if new)"> If creating new: enter your account name, container name (e.g., "Orbit Forms"), and select "Web" as the target platform. </Step> <Step title="Find your Container ID"> Your Container ID is displayed at the top of the workspace page. It looks like GTM-XXXXXXX (7 characters after GTM-). </Step> </Steps> <Info> Need help creating a GTM account? [Google's GTM Setup Guide →](https://support.google.com/tagmanager/answer/6103696) </Info> ## Step 2: Add GTM to Your Form Now add your Container ID to your OrbitForms form to start loading GTM. <Steps> <Step title="Open your form in OrbitForms"> Go to your dashboard and click on the form you want to add GTM to. </Step> <Step title="Click the 'Integrate' tab"> In the form editor, find and click the "Integrate" tab at the top. </Step> <Step title="Find Google Tag Manager"> Scroll down to find "Google Tag Manager" under the Tracking & Analytics section. </Step> <Step title="Paste your Container ID"> Paste your GTM Container ID (e.g., GTM-XXXXXXX) into the input field. </Step> <Step title="Save your form"> Click the Save button. GTM will now load whenever your form is viewed. </Step> </Steps> ## Data Layer Events OrbitForms automatically pushes events to the GTM data layer. You'll use these events to trigger your tags. | Event Name | When It Fires | Common Use | | ------------------- | ------------------------------------------ | ------------------- | | `orbit_form_view` | When a visitor loads your form | Page view tracking | | `orbit_form_start` | When a user interacts with the first field | Engagement tracking | | `orbit_form_submit` | When a user submits the form | Conversion tracking | ### Data Layer Variables Each event includes additional data you can use in your tags: | Variable | Description | Example Value | | ----------- | -------------------------------- | ----------------- | | `form_slug` | The unique URL slug for the form | `contact-us` | | `form_name` | The display name of the form | `Contact Us Form` | ### Using Variables in GTM To use these variables in your tags, create Data Layer Variables in GTM: 1. Go to Variables → New → Data Layer Variable 2. Set the Data Layer Variable Name to `form_slug` or `form_name` 3. Use the variable in your tags as `{{form_slug}}` or `{{form_name}}` <Tip> The `orbit_form_submit` event is the most important—use this to trigger your conversion tracking tags in GTM. Use `form_name` to pass the form name to your analytics for better reporting. </Tip> ## Step 3: Create Triggers in GTM Triggers tell GTM when to fire your tags. Create a trigger for the Orbit form submit event. <Steps> <Step title="Go to Triggers in GTM"> In your GTM container, click "Triggers" in the left sidebar menu. </Step> <Step title="Create a new trigger"> Click the "New" button in the top right corner to create a new trigger. </Step> <Step title="Name your trigger"> Give it a clear name like "Orbit Form Submit" so you can easily identify it later. </Step> <Step title="Click to configure trigger"> Click on the trigger configuration area to select the trigger type. </Step> <Step title="Select "Custom Event""> Scroll down and select "Custom Event" from the list of trigger types. </Step> <Step title="Enter the event name"> In the "Event name" field, enter exactly: `orbit_form_submit` (must match exactly). </Step> <Step title="Save the trigger"> Click "Save" in the top right corner. Your trigger is now ready to use. </Step> </Steps> <Warning> **Important:** The event name must be typed exactly as `orbit_form_submit` (lowercase, with underscores). Any typo will prevent the trigger from firing. </Warning> ## Step 4: Create Tags Tags are the actual tracking codes that fire. Here's how to create a tag and connect it to your trigger. <Steps> <Step title="Go to Tags in GTM"> Click "Tags" in the left sidebar menu. </Step> <Step title="Create a new tag"> Click the "New" button to create a new tag. </Step> <Step title="Name your tag"> Give it a descriptive name like "GA4 - Form Submit Conversion" or "Meta Pixel - Lead". </Step> <Step title="Configure the tag"> Click "Tag Configuration" and select your tag type (GA4 Event, Meta Pixel, etc.). </Step> <Step title="Set up the tag details"> Configure the tag with your tracking ID and event parameters. Each platform has different settings. </Step> <Step title="Add the trigger"> Click "Triggering" at the bottom and select the "Orbit Form Submit" trigger you created. </Step> <Step title="Save the tag"> Click "Save" to save your tag. Repeat for any additional tags you want to fire. </Step> </Steps> ### Common Tag Examples <CardGroup> <Card title="GA4 Conversion" icon="chart-line"> * Tag type: Google Analytics: GA4 Event * Event name: generate\_lead or form\_submit * Trigger: Orbit Form Submit </Card> <Card title="Meta Pixel Lead" icon="meta"> * Tag type: Meta Pixel (Custom Template) * Event: Lead * Trigger: Orbit Form Submit </Card> </CardGroup> ## Step 5: Preview and Publish Before your tags go live, test them with GTM's Preview mode, then publish. <Steps> <Step title="Click Preview"> In the top right of GTM, click the "Preview" button to enter debug mode. </Step> <Step title="Enter your form URL"> Enter the URL where your Orbit form is embedded or the direct form URL. </Step> <Step title="Test the form"> A new window opens with your form. Fill out and submit the form to test. </Step> <Step title="Verify tags fired"> Back in the Tag Assistant panel, look for "orbit\_form\_submit" in the event list. Check that your tags show as "Fired". </Step> <Step title="Publish your container"> Once verified, close Preview mode. Click "Submit" then "Publish" to make your tags live. </Step> </Steps> ## Verifying Your Setup After publishing, confirm everything is working: * Load your form in a browser (use incognito to avoid caching) * Submit a test entry * Check GA4 Realtime or your ad platform for the conversion * Verify the event appears within a few minutes ## Troubleshooting <AccordionGroup> <Accordion title="Tags not firing?"> Make sure you've published your GTM container after making changes. Unpublished changes only work in Preview mode. Click Submit → Publish. </Accordion> <Accordion title="Invalid Container ID?"> Make sure your ID starts with "GTM-" followed by 7 characters (e.g., GTM-XXXXXXX). Copy directly from your GTM dashboard. </Accordion> <Accordion title="orbit_form_submit not appearing in Preview?"> The event only fires when the form is actually submitted. Make sure you fill out the form completely and click the submit button. </Accordion> <Accordion title="Trigger created but not matching?"> Event names are case-sensitive. Make sure you typed `orbit_form_submit` exactly—all lowercase with underscores. </Accordion> </AccordionGroup> ## Important Notes <Warning> **Avoid duplicate tracking:** If you add GA4 or Meta Pixel through GTM, don't also add them directly in the Orbit form settings. This will cause duplicate events and skew your data. Choose one method: either use GTM for all your tags, or add each tracking pixel directly in Orbit's integration settings—not both. </Warning> ## Resources <CardGroup> <Card title="Google Tag Manager Dashboard" icon="link" href="https://tagmanager.google.com"> Access your GTM containers </Card> <Card title="GTM Setup & Install Guide" icon="book" href="https://support.google.com/tagmanager/answer/6103696"> Google's official guide </Card> <Card title="Preview & Debug Your Tags" icon="bug" href="https://support.google.com/tagmanager/answer/6107056"> Google's debugging guide </Card> <Card title="GTM Developer Documentation" icon="code" href="https://developers.google.com/tag-platform/tag-manager/web"> Developer reference </Card> </CardGroup> *** **Ready to Track Your Forms?** Set up Google Tag Manager in minutes and manage all your tracking from one place. [Get Started](https://orbitforms.ai/signin) # Halo Integration Source: https://docs.orbitforms.ai/integrations/halo AI support agents that answer from your Orbit data <img alt="Halo" /> <Note>Built by **Halo AI**. The connection is made from the Halo app via OAuth.</Note> ## Start Here Halo is an AI support agent platform built by Halo AI. When you connect it to your OrbitForms workspace, Halo's agents can answer customer questions using your forms, submissions, and help content — and hand off to your team when a human is needed. Once connected, the Halo card on your Integrations page shows as **Installed**. ## Key Features * **AI Support Agents** — trained on your forms, submissions, and docs * **Lead Capture** — capture and qualify leads from conversations * **Human Handoff** — escalate to your inbox when the AI needs help * **Secure OAuth** — scoped, revocable access to your workspace ## Setting Up the Integration <Steps> <Step title="Open Halo"> Sign in to Halo and start the Orbit connection from their app. </Step> <Step title="Authorize via OAuth"> You'll be redirected to OrbitForms to approve the scopes Halo requests. Review them and authorize. </Step> <Step title="Choose your data"> In Halo, pick the forms and content the agent can use to answer questions. </Step> <Step title="Verify in OrbitForms"> Open **Integrations → Halo** in your OrbitForms dashboard. The card shows "Installed" once the connection is active. </Step> </Steps> ## Disconnecting * Disconnect from within the Halo app — this revokes Halo's OAuth tokens immediately * The Halo card in OrbitForms flips back to "Not installed" automatically * Deleting the Halo OAuth app from your Developer Portal also revokes all of its tokens ## Troubleshooting <AccordionGroup> <Accordion title="The card shows "Not installed" after connecting?"> The status updates when Halo completes the OAuth flow. Refresh the Integrations page, and make sure you authorized the correct workspace. </Accordion> <Accordion title="Halo can't see my forms?"> Check the scopes you approved during authorization — Halo needs `forms:read` at minimum to list your forms. </Accordion> <Accordion title="How do I revoke access?"> Disconnect from the Halo app, or delete the Halo app from your Developer Portal to revoke all tokens. </Accordion> </AccordionGroup> ## Resources * [Halo Website](https://www.haloagents.ai) * [Privacy Policy](https://www.haloagents.ai/privacy) * [Terms of Service](https://www.haloagents.ai/terms) # HubSpot Integration Source: https://docs.orbitforms.ai/integrations/hubspot Sync form leads directly to your CRM <img alt="HubSpot" /> <Note>This integration requires a **Pro** plan.</Note> [Visit HubSpot](https://www.hubspot.com) ## Start Here ### Overview Connect your OrbitForms forms to HubSpot CRM and automatically create or update contacts and companies when forms are submitted. Perfect for capturing leads, managing customer inquiries, and powering your marketing automation. <Note> **Why This Matters** Manual lead entry is slow and error-prone. With the HubSpot integration, every form submission automatically creates or updates a contact in your CRM, saving your team hours of data entry and ensuring leads never slip through the cracks. </Note> ## Key Features <CardGroup> <Card title="Create Contacts" icon="users"> Automatically create new contacts from submissions. </Card> <Card title="Sync Companies" icon="building"> Create or update company records alongside contacts. </Card> <Card title="Smart Deduplication" icon="arrows-rotate"> Update existing records if email matches. </Card> <Card title="Activity Timeline" icon="bolt"> Branded activity notes appear in HubSpot. </Card> </CardGroup> ## Before You Begin * A HubSpot account (Free, Starter, Professional, or Enterprise) * Admin or Super Admin permissions to install integrations * A form with at least an Email field ## Choose Your Setup Method You can sync form submissions to HubSpot in two ways. Choose based on your needs: <CardGroup> <Card title="Integration Page" icon="gear"> Connect HubSpot from your Integrations page and configure form-to-CRM field mappings directly. **Best for:** * Quick setup with OAuth authentication * Simple 1:1 form-to-HubSpot mapping * Syncing all submissions without filtering [Set up via Integration Page](#integration-page-setup) </Card> <Card title="Workflows" icon="code-branch"> Add HubSpot as a destination in your workflows for advanced control over which leads sync. **Best for:** * Filtering by lead score or qualification * Enriching data before syncing to HubSpot * Combining with AI Agent qualification [Set up with Workflows](#using-hubspot-with-workflows) </Card> </CardGroup> ### Integration Page vs. Workflows: Which Should You Use? **Integration Page** Use the Integration page when you want to send **all form submissions** directly to HubSpot without any filtering. * Simple form-to-HubSpot mapping * No need for lead qualification first * Fastest setup for basic CRM sync **Workflows** Use Workflows when you need **filtering, enrichment, or AI qualification** before sending to HubSpot. * Filter by lead score or qualification * Enrich leads before syncing (Clay, etc.) * Use AI Agent to qualify first [Learn more about Workflows](#using-hubspot-with-workflows) ## Integration Page Setup Connect HubSpot to OrbitForms using OAuth and configure which forms sync to your CRM. ### Step 1: Connect Your HubSpot Account <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. `Dashboard → Integrations (left sidebar)` </Step> <Step title="Find HubSpot"> Scroll down or search for "HubSpot" in the integrations list. `Search or scroll to find HubSpot` </Step> <Step title="Click "Connect HubSpot""> Click the HubSpot card, then click the "Connect HubSpot" button. `Click on HubSpot card → Connect HubSpot` </Step> <Step title="Sign in to HubSpot"> You'll be redirected to HubSpot to sign in and authorize the connection. `Enter your HubSpot credentials` </Step> <Step title="Grant Permissions"> Allow OrbitForms to access your HubSpot account. We only request the minimum permissions needed to create contacts and companies. `Click "Allow" to authorize` </Step> </Steps> <Info> **Secure OAuth Connection** OrbitForms uses OAuth 2.0 to connect to HubSpot. We never see your password, and you can revoke access at any time from your HubSpot settings. </Info> ### Step 2: Configure a Form Mapping <Steps> <Step title="Go to the Field Mapping tab"> After connecting, you'll see the HubSpot configuration panel. Click the "Field Mapping" tab. `HubSpot config → Field Mapping tab` </Step> <Step title="Select a form to configure"> You'll see a list of your forms. Click on the form you want to sync to HubSpot. `Click on a form from the list` </Step> <Step title="Choose what to sync"> Toggle on "Contacts" to create contact records, and optionally "Companies" to create company records as well. `Toggle Contacts and/or Companies` </Step> <Step title="Map your form fields"> For each form field, select the corresponding HubSpot property from the dropdown. Email is required for contacts. `Form field → Select HubSpot property` </Step> <Step title="Configure sync settings"> Choose duplicate behavior (update, skip, or create new) and whether to add activity notes. `Set duplicate behavior and notes options` </Step> <Step title="Save Configuration"> Click "Save Configuration" to save your mappings. The form will now sync to HubSpot. `Click "Save Configuration" button` </Step> </Steps> ## Field Mapping Reference Map your form fields to HubSpot contact properties. The email field is required for contact creation. ### Contact Properties | Form Field | HubSpot Property | Required | | ---------- | ---------------- | -------- | | Email | email | Required | | First Name | firstname | Optional | | Last Name | lastname | Optional | | Phone | phone | Optional | | Company | company | Optional | | Job Title | jobtitle | Optional | | Website | website | Optional | ### Company Properties | Form Field | HubSpot Property | Notes | | -------------- | ----------------- | ----------------------------- | | Company Name | name | Required for company creation | | Company Domain | domain | Used for deduplication | | Industry | industry | Optional | | Company Size | numberofemployees | Optional | ### Using Custom Properties You can map form fields to any custom HubSpot property. First, create the property in HubSpot under Settings → Properties → Contact properties, then it will appear in the field mapping dropdown. <Tip> Click the refresh button in the field mapping panel to load newly created custom properties. </Tip> ## Duplicate Handling Choose what happens when a contact with the same email already exists in HubSpot: <CardGroup> <Card title="Update (Default)" icon="arrows-rotate"> Merge new data into the existing record. Properties from the form submission will update the contact. </Card> <Card title="Skip" icon="forward"> Keep the existing record unchanged. The form submission won't modify any HubSpot data. </Card> <Card title="Create New" icon="plus"> Always create a new record, even if the email already exists. May create duplicates. </Card> </CardGroup> ## Using HubSpot with Workflows For advanced use cases, add HubSpot as a destination in your workflows. This gives you more control over which submissions get sent to your CRM. ### Use workflows when you need to: * Send to HubSpot only for qualified leads (after AI agent qualification) * Include enriched data in your HubSpot records (from Clay, Clearbit, etc.) * Use AI SDR to classify leads before adding to your CRM * Route different leads to different HubSpot lists or properties ### Adding HubSpot to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. `Dashboard → Workflows → Create/Edit` </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to sync. `Add Trigger → Form Submission` </Step> <Step title="Add any intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. `Add AI Agent, Enrichment, or Filter nodes` </Step> <Step title="Add HubSpot destination"> Click the + button and select HubSpot from the destinations list. `+ Add Destination → HubSpot` </Step> <Step title="Configure the HubSpot node"> Choose to create contacts, companies, or both. Map your fields to HubSpot properties. `Select record type → Map fields` </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Leads will now flow through your workflow to HubSpot. `Save → Toggle Active` </Step> </Steps> ### Example: Qualified Leads Only A common workflow that only sends qualified leads to HubSpot: **Form Submission** → **AI Agent (Qualify)** → **Filter (Score > 70)** → **HubSpot** ### Syncing the Contact Owner The workflow HubSpot destination includes an optional **Sync contact owner** toggle. When enabled, the owner assigned to the contact in OrbitForms is mirrored to the HubSpot contact owner, so the right rep owns the record in both tools. The toggle is off by default — enable it per workflow where you want owners to stay in sync. ## Automatic Field Capture with HubSpot Pixel If you have the HubSpot tracking code installed, HubSpot can automatically capture form submissions — no API configuration needed. ### Embedded Forms If your Orbit form is embedded on a page where the HubSpot pixel is already installed, HubSpot may automatically capture form field data when visitors submit the form. Note that standard Orbit embeds render the form inside an iframe, which can prevent HubSpot from seeing the submission — test this on your site, and use the API integration if you need guaranteed delivery. ### Hosted Forms (Orbit URL or Custom Domain) If you're using an Orbit-hosted form URL, you can load your HubSpot tracking code on the form's thank-you page: <Steps> <Step title="Open your form in Orbit"> Open the form in the form editor. </Step> <Step title="Go to the Settings tab"> In the form editor, open the "Settings" tab and make sure the thank-you mode is set to "Page". </Step> <Step title="Paste your HubSpot tracking code"> Paste your HubSpot tracking code into the "Custom HTML / Tracking Scripts" box in the Thank You Page settings. </Step> <Step title="Save"> Save — the tracking code loads on the thank-you page after each submission. </Step> </Steps> ### Viewing Captured Submissions View your captured submissions in HubSpot under **Marketing → Forms → Non-HubSpot Forms**. <Info> **Note:** This is separate from the API integration. Use the pixel for simple automatic capture, or use the API integration for full control over field mapping and workflow automation. </Info> ## Troubleshooting <Warning> **Contact not appearing in HubSpot?** Check that the email field is properly mapped and contains a valid email address. HubSpot requires a valid email to create contacts. </Warning> <Warning> **OAuth connection expired?** If your integration stops working, try clicking "Reconnect" in the HubSpot configuration panel. This will refresh your OAuth tokens. </Warning> <Warning> **Custom properties not appearing?** Click the refresh button in the field mapping panel to reload properties from HubSpot. Make sure the property exists in HubSpot under Settings → Properties. </Warning> <Warning> **Permission errors?** Ensure the HubSpot user who authorized the integration has Admin or Super Admin permissions. Limited users may not have access to create contacts or companies. </Warning> <Warning> **Duplicate contacts in HubSpot?** Check your duplicate behavior setting. If set to "Create New", it will create duplicates. Change to "Update" to merge data into existing records instead. </Warning> ## Resources * [Creating Custom Properties](https://knowledge.hubspot.com/properties/create-and-edit-properties) * [HubSpot Workflows Guide](https://knowledge.hubspot.com/workflows/create-workflows) * [HubSpot Contacts API](https://developers.hubspot.com/docs/api/crm/contacts) * [HubSpot Collected Forms](https://knowledge.hubspot.com/forms/use-collected-forms) * [HubSpot Website](https://www.hubspot.com) *** ## Ready to Sync Your Forms to HubSpot? Connect HubSpot in minutes and start automatically syncing leads to your CRM. [Get Started](https://orbitforms.ai/signin) # Instantly Integration Source: https://docs.orbitforms.ai/integrations/instantly Sync form and meeting events to your Instantly campaigns <img alt="Instantly" /> <Note>This integration requires a **Pro** plan.</Note> [Visit Instantly](https://instantly.ai) ## Overview Instantly is a cold-email platform for running multi-step outreach campaigns. The OrbitForms integration closes the loop on that outreach: when someone you emailed from a campaign fills out a form, books a meeting, or gets a call outcome, OrbitForms can tell Instantly what happened. Two workflow steps do the work: <CardGroup> <Card title="Instantly Lookup" icon="magnifying-glass"> An **Enrich Data** step. Finds the lead in your workspace and adds fields like `instantly_found`, `instantly_campaign_name`, `instantly_interest_status`, and `instantly_clicked_email` for the rest of the workflow. It also checks whether anyone else at the lead's company domain is in a campaign (`instantly_domain_found`). </Card> <Card title="Instantly" icon="paper-plane"> A **Send Data** step. **Update lead** sets their interest status (Interested, Meeting Booked, No Show…) and writes details back as custom variables. **Add to campaign** adds a new lead to a campaign. </Card> </CardGroup> Triggers you can use: * A form is submitted (or abandoned with an email captured) * A meeting is booked on one of your scheduling pages * A meeting outcome is set (for example "No Show" or "Live Call") ## Step 1: Create an Instantly API Key <Steps> <Step title="Log in to Instantly"> Go to [app.instantly.ai](https://app.instantly.ai) and sign in. </Step> <Step title="Open API Keys"> Go to **Settings → Integrations → API Keys**. </Step> <Step title="Create a key"> Click **Create API Key**, name it "OrbitForms", and give it the `campaigns:read`, `leads:read`, `leads:update`, and `leads:create` scopes. The `all:all` scope also works. </Step> <Step title="Copy the key"> Copy the generated key. Instantly only shows it once. </Step> </Steps> <Info> Instantly API v2 keys are scoped. `campaigns:read` lists your campaigns, `leads:read` powers the lookup, `leads:update` sets status and custom variables, and `leads:create` adds leads to a campaign. </Info> ## Step 2: Connect Instantly in OrbitForms <Steps> <Step title="Go to Integrations"> From your dashboard, click **Integrations** in the left sidebar. </Step> <Step title="Find Instantly"> Search for "Instantly" and click the card. </Step> <Step title="Paste your API key"> Paste the key into the **API Key** field and click **Connect Instantly**. OrbitForms verifies the key against your workspace before saving it. </Step> </Steps> ## Step 3: Look up the lead (Instantly Lookup) Add this step when you want to know whether a lead came from an Instantly campaign before doing anything else. <Steps> <Step title="Add the step"> In a workflow, click **+**, open **Enrich Data**, and pick **Instantly Lookup**. </Step> <Step title="Choose the email field"> Leave it on **Auto-detect** for form email fields and meeting attendees, or pick the field explicitly. </Step> <Step title="Optionally scope to a campaign"> Pick a campaign to only match leads in that campaign. Leave as **Any** to match across the workspace. </Step> <Step title="Company domain match (on by default)"> **Also match the company domain** checks whether anyone else at the lead's email domain (for example `acme.com`) is in a campaign or list, even when the person who booked isn't a lead themselves. The result lands in `instantly_domain_*` fields. Personal mailboxes such as Gmail or Outlook.com are skipped, so a Gmail booker never matches every Gmail lead. </Step> <Step title="Branch on the result"> Add a **Filter** after it with **Instantly: lead or company found** (`instantly_any_found`) is `true`. That passes when the person is in a campaign *or* someone else at their company is. Use `instantly_found` (the person themself) or `instantly_domain_found` (a colleague) when you want to treat those cases differently, or route by `instantly_match_type` / `instantly_campaign_name`. </Step> </Steps> Fields the lookup adds: | Field | Meaning | | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | `instantly_any_found` | `true` if the person **or** anyone at their company is a lead in Instantly. The simplest thing to filter on | | `instantly_found` | `true` if the email is a lead in Instantly | | `instantly_campaign_name`, `instantly_campaign_id` | The campaign the lead is in | | `instantly_interest_status` | Lead, Interested, Meeting Booked, Meeting Completed, Won, No Show, Not Interested, … | | `instantly_lead_status` | Active, Paused, Completed, Bounced, Unsubscribed | | `instantly_opened_email`, `instantly_clicked_email`, `instantly_replied` | Engagement flags | | `instantly_email_open_count`, `instantly_email_click_count`, `instantly_email_reply_count` | Counts | | `instantly_last_open_at`, `instantly_last_click_at`, `instantly_last_reply_at`, `instantly_last_contact_at` | Timestamps | | `instantly_match_count` | How many campaigns or lists contain this email | | `instantly_match_type` | `email` (the lead is in Instantly), `domain` (only a colleague is), or `none` | Company-domain fields (from every lead at the same email domain): | Field | Meaning | | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `instantly_domain` | The domain that was checked, e.g. `acme.com` | | `instantly_domain_found` | `true` if anyone **else** at that domain is a lead in Instantly (in the scoped campaign, if one is selected). The person being looked up is never counted here | | `instantly_domain_match_count` | How many other leads share the domain | | `instantly_domain_company_name` | Company name on those leads | | `instantly_domain_campaign_name`, `instantly_domain_campaign_id` | Campaign of the colleague who reached the best interest status | | `instantly_domain_campaign_names`, `instantly_domain_campaign_count` | Every campaign the company appears in | | `instantly_domain_interest_status` | The most positive interest status anyone at the company reached (Won beats Meeting Booked beats Interested, and so on) | | `instantly_domain_opened_email`, `instantly_domain_clicked_email`, `instantly_domain_replied` | `true` if anyone at the company did it | | `instantly_domain_last_contact_at` | Last email sent to anyone at the company | | `instantly_domain_is_free_email` | `true` when the check was skipped because the email is a personal mailbox | | `instantly_domain_error` | Set if the domain check failed; the step still succeeds | <Tip> **Attribution:** if `instantly_clicked_email` is `true` and the lead just submitted a form, they clicked a campaign email and then converted. You can put `instantly_campaign_name` in a Slack alert so sales sees where the lead came from. </Tip> <Tip> **Company-level attribution:** a booking from `cfo@acme.com` while your campaign is emailing `vp-sales@acme.com` shows up as `instantly_found` = `false` but `instantly_domain_found` = `true`. Filter on `instantly_match_type` is `domain` to alert sales that outbound to that account is working even though a different person converted. </Tip> ## Step 4: Tell Instantly what happened (Instantly step) <Steps> <Step title="Add the step"> Click **+**, open **Send Data**, and pick **Instantly**. </Step> <Step title="Choose the action"> **Update lead** finds the lead by email and updates them. **Add to campaign** creates a new lead in the campaign you choose. </Step> <Step title="Update lead: set the interest status"> Pick a status such as **Meeting Booked**, **Meeting Completed**, **No Show**, or **Interested**. Setting a status stops the lead's sequence in Instantly. Choose whether to fail or skip the step when the email isn't in Instantly (skip is the default). </Step> <Step title="Add to campaign: pick the campaign"> Select the campaign and duplicate handling (skip if already in campaign or workspace, verify email on import). </Step> <Step title="Map the Email field (required)"> Map the field that holds the lead's email to **Email**. For meeting triggers this is usually `attendee_email`. </Step> <Step title="Map other fields (optional)"> Map first name, last name (or a single **Full Name** field, which is split for you), company, phone, website, job title, and personalization. Anything else can be written as a **custom variable**, which you can reference in Instantly sequences as `{{variable_name}}`. </Step> <Step title="Save and activate"> Save the workflow and toggle it to **Active**. </Step> </Steps> <Tip> **Example: meeting booked** — Meeting Booked → Instantly Lookup → Filter (`instantly_found` is true) → Instantly (Update lead: Meeting Booked, custom variable `meeting_time`). </Tip> <Tip> **Example: no-show follow-up** — Meeting Outcome → Filter (outcome is "No Show") → Instantly (Update lead: No Show) → Instantly (Add to campaign: "No-show re-engagement"). </Tip> <Tip> **Example: inbound from a campaign** — Form Submission → Instantly Lookup → Filter (`instantly_found` is true) → Instantly (Update lead: Interested) → Slack (" from campaign just filled out the demo form"). </Tip> ## Custom Variables Any field you map to a **Custom Variable** destination is written to the lead's custom variables in Instantly. Instantly adds new variables to the campaign automatically so every lead in that campaign can use them. Values must be text, numbers, or true/false. Lists are joined with commas. ## Troubleshooting <AccordionGroup> <Accordion title="Campaign list is empty"> Check that the API key has the `campaigns:read` scope and that your workspace has at least one campaign. Click the refresh button in the node to reload. </Accordion> <Accordion title="Lookup always returns instantly_found = false"> The lookup matches on exact email. Check the email field it's reading (Auto-detect uses form email fields and `attendee_email`), and that the key has `leads:read`. If you scoped it to a campaign, make sure the lead is in that campaign. If a colleague is in Instantly but not this person, `instantly_domain_found` will be `true` instead. </Accordion> <Accordion title="instantly_domain_found is false for a company I'm emailing"> The domain match compares the lead's email domain to the email domain, company domain, and website of leads in Instantly, exactly (`acme.co` never matches `acme.com`). Personal mailboxes are skipped (`instantly_domain_is_free_email` is `true`). Newly added leads can take a few seconds to become searchable in Instantly. If `instantly_domain_error` is set, the key is likely missing the `leads:read` scope. Very large companies are summarised from the first few hundred matching leads. </Accordion> <Accordion title="Update lead step is skipped"> The email isn't a lead in Instantly (or not in the selected campaign). That's expected for leads who didn't come from a campaign. Turn on **Fail the step if the lead isn't in Instantly** if you want the run to error instead. </Accordion> <Accordion title=""No email found" error in the run history"> Instantly needs an email to identify the lead. Map the field that contains the email to **Email**. For meeting triggers use `attendee_email`. </Accordion> <Accordion title="Instantly rejected the API key (401)"> The key was revoked or regenerated in Instantly. Disconnect and reconnect with a new key. </Accordion> <Accordion title="Missing scope (403)"> Create a new key in Instantly with `campaigns:read`, `leads:read`, `leads:update`, and `leads:create`, then reconnect. </Accordion> <Accordion title="Workspace has no active paid plan (402)"> The Instantly API requires an active paid Instantly plan. </Accordion> <Accordion title="Lead did not appear in the campaign"> If **Skip if already in campaign** or **Skip if already in workspace** is on and the email already exists, Instantly does not add it again. Turn the option off if you want duplicates. </Accordion> </AccordionGroup> ## Resources <CardGroup> <Card title="Instantly API v2 Reference" icon="code" href="https://developer.instantly.ai/api/v2"> Developer documentation </Card> <Card title="Instantly Help Center" icon="book" href="https://help.instantly.ai"> Setup guides and FAQs </Card> </CardGroup> # Mailchimp Integration Source: https://docs.orbitforms.ai/integrations/mailchimp Email marketing & automation <img alt="Mailchimp" /> [Visit Mailchimp](https://mailchimp.com) Connect your OrbitForms forms to Mailchimp and automatically add subscribers to your audiences, apply tags, and trigger customer journey automations. You can set this up in two ways: via the **Integration Page** for quick form-to-Mailchimp connections, or via **Workflows** for advanced filtering and enrichment. ## Key Features <CardGroup> <Card title="Automatic Subscriber Sync" icon="envelope"> Add or update subscribers instantly on form submit </Card> <Card title="Audience Selection" icon="users"> Choose which Mailchimp audience to add subscribers to </Card> <Card title="Tag Automation" icon="tag"> Apply tags that trigger your customer journeys </Card> <Card title="Workflow Integration" icon="bolt"> Use with AI qualification and enrichment </Card> </CardGroup> ## Prerequisites <Note> Before setting up the Mailchimp integration, make sure you have: * A Mailchimp account (Free or any paid plan) * At least one audience (list) created in Mailchimp * At least one OrbitForms form ready to connect </Note> ## Choose Your Setup Method You can connect Mailchimp to your forms in two ways. Choose based on your needs: <CardGroup> <Card title="Integration Page" icon="link"> Connect Mailchimp directly to a form via OAuth. All form submissions are synced to your audience automatically. **Best for:** * Quick setup via OAuth (no API key needed) * Simple 1:1 form-to-audience mapping * All submissions go to Mailchimp </Card> <Card title="Workflows" icon="code-branch"> Add Mailchimp as a destination in your workflows. Filter, qualify, or enrich leads before subscribing them. **Best for:** * Filtering leads before subscribing * AI qualification or lead scoring first * Enriching data before syncing </Card> </CardGroup> ### Integration Page vs. Workflows: Which Should You Use? **Integration Page** — Use the Integration page when you want to send **all form submissions** directly to Mailchimp without any filtering. * Newsletter sign-up forms * Lead magnets and content downloads * Event registrations **Workflows** — Use Workflows when you need **filtering, enrichment, or AI qualification** before subscribing leads. * Filter by lead score or qualification * Enrich leads before subscribing (Clay, etc.) * Use AI SDR qualification first ## Integration Page Setup Connect Mailchimp to your form using OAuth. This method uses the form's Integrate tab for a quick, secure connection. ### Step 1: Open the Integration Tab <Steps> <Step title="Go to your form in OrbitForms"> From your dashboard, click on the form you want to connect to Mailchimp. </Step> <Step title="Click the "Integrate" tab"> In the form editor, find and click the "Integrate" tab at the top. </Step> <Step title="Find Mailchimp"> Scroll down to find "Mailchimp" under the Email Marketing section. </Step> </Steps> ### Step 2: Connect Your Mailchimp Account <Steps> <Step title="Click "Connect to Mailchimp""> Click the button to start the OAuth connection process. </Step> <Step title="Sign in to Mailchimp"> A popup will open asking you to sign in to your Mailchimp account. Enter your credentials. </Step> <Step title="Authorize OrbitForms"> Grant OrbitForms permission to manage your audiences. We only request the minimum required permissions. </Step> <Step title="Wait for connection"> The popup will close and you'll see a success message. Your Mailchimp account is now connected. </Step> </Steps> ### Step 3: Configure Your Settings <Steps> <Step title="Select your audience"> Choose which Mailchimp audience (list) should receive new subscribers from this form. </Step> <Step title="Configure double opt-in (optional)"> Enable if you want subscribers to confirm via email first. Required in some countries for GDPR compliance. </Step> <Step title="Select or create tags"> Choose tags to apply to new subscribers. Tags can trigger your customer journey automations in Mailchimp. </Step> <Step title="Map your form fields"> Map your form fields to Mailchimp merge fields (EMAIL, FNAME, LNAME, PHONE, etc.). </Step> <Step title="Enable the integration"> Toggle the integration on and click Save. The form will now sync to Mailchimp on submission. </Step> </Steps> ## Field Mapping Map your form fields to Mailchimp merge fields. The EMAIL field is required; other fields are optional but recommended for personalization. | Merge Field | Description | Example | | ----------- | ----------------------------------------- | ------------------------------------------- | | EMAIL | Required - the subscriber's email address | [john@example.com](mailto:john@example.com) | | FNAME | First name | John | | LNAME | Last name | Doe | | PHONE | Phone number | +1 555-123-4567 | | ADDRESS | Mailing address (grouped fields) | 123 Main St, City, ST 12345 | | BIRTHDAY | Birthday (MM/DD format) | 03/15 | | COMPANY | Company name | Acme Inc | <Info> **Custom merge fields:** If you've created custom merge fields in Mailchimp (like COMPANY or WEBSITE), they'll appear in the field mapping dropdown automatically. </Info> ## Double Opt-in <Info> **When double opt-in is enabled:** * New subscribers receive a confirmation email from Mailchimp * They must click the confirmation link to be fully subscribed * Required by law in some countries (GDPR compliance) * Results in higher quality, more engaged subscribers </Info> ## Triggering Customer Journeys Tags are the key to triggering Mailchimp customer journeys. Here's how to set it up: <Steps> <Step title="Create a customer journey in Mailchimp"> Go to Mailchimp → Automations → Customer Journeys and create a new journey. Set the starting point to "Tag is added". </Step> <Step title="Choose the trigger tag"> Select which tag should trigger this journey (e.g., "New Lead" or "Downloaded Ebook"). </Step> <Step title="Build your journey"> Add email steps, delays, and conditions to create your automated sequence. </Step> <Step title="Use the same tag in OrbitForms"> In your Mailchimp integration settings in OrbitForms, select the same tag. When a form is submitted, the tag is applied and your journey begins. </Step> </Steps> ## Using Mailchimp with Workflows For advanced use cases, add Mailchimp as a destination in your workflows. This gives you more control over which submissions get subscribed. ### Use workflows when you need to: * Only subscribe qualified leads (after AI agent qualification) * Enrich subscriber data before syncing (from Clay, Clearbit, etc.) * Apply different tags based on form responses or lead scores * Sync to both Mailchimp and your CRM in a single flow * Use AI SDR to classify leads before subscribing ### Adding Mailchimp to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to connect. </Step> <Step title="Add any intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. </Step> <Step title="Add Mailchimp destination"> Click the + button and select Mailchimp from the destinations list. </Step> <Step title="Configure the Mailchimp node"> Select your audience, configure double opt-in, select tags, and map your fields. </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Submissions will now flow through your workflow. </Step> </Steps> ### Example: Qualified Leads Only A common workflow that only subscribes qualified leads to Mailchimp: **Form Submission** → **AI Agent (Qualify)** → **Filter (Qualified = Yes)** → **Mailchimp** ## Verifying Your Setup After setting up the integration, verify that subscribers are being added correctly: <Steps> <Step title="Submit a test form"> Fill out and submit your form with a test email address. </Step> <Step title="Check your Mailchimp audience"> In Mailchimp, go to Audience → All contacts. Look for your test submission. </Step> <Step title="Verify subscriber data"> Click on the subscriber to verify their merge fields and tags are correctly populated. </Step> <Step title="Check double opt-in (if enabled)"> If you enabled double opt-in, check your test email for the confirmation message. </Step> </Steps> ## Troubleshooting <Warning> **Subscriber not appearing in audience?** — If double opt-in is enabled, subscribers must confirm via email first. They'll appear as "Pending" until confirmed. Also verify that the EMAIL field is correctly mapped to your form's email field. </Warning> <Warning> **OAuth connection expired?** — If the integration stops working, try disconnecting and reconnecting your Mailchimp account from the form's Integrate tab. Click "Disconnect" and then "Connect to Mailchimp" again. </Warning> <Warning> **Tags not being applied?** — Ensure the tag names are selected correctly in the integration settings. Tags are case-sensitive. If the tag doesn't exist in Mailchimp, it will be created automatically when the first subscriber is added. </Warning> <Warning> **"Invalid merge fields" error?** — Some Mailchimp fields have specific format requirements. For example, BIRTHDAY must be in MM/DD format, and ADDRESS requires structured data. Make sure your form fields contain data in the expected format. </Warning> <Warning> **Duplicate subscribers?** — Mailchimp uses email as the unique identifier. If someone submits the same email twice, their existing subscriber record will be updated rather than creating a duplicate. If you're seeing duplicates, check that both Integration Page and Workflows aren't configured for the same form. </Warning> ## Resources * [Getting Started with Mailchimp](https://mailchimp.com/help/getting-started-with-mailchimp/) * [Creating Customer Journeys](https://mailchimp.com/help/create-a-customer-journey/) * [Managing Tags](https://mailchimp.com/help/manage-tags/) * [Understanding Double Opt-in](https://mailchimp.com/help/about-double-opt-in/) # Meta Pixel Integration Source: https://docs.orbitforms.ai/integrations/meta-pixel Track form conversions and build retargeting audiences <img alt="Meta" /> [Visit Meta Events Manager](https://business.facebook.com/events_manager) ## Overview The Meta Pixel (formerly Facebook Pixel) tracks when visitors view and submit your forms. Use this data to measure ad effectiveness, optimize for conversions, and build custom audiences for retargeting. <CardGroup> <Card title="Page View Tracking" icon="bolt"> Track when visitors land on your form </Card> <Card title="Conversion Tracking" icon="bullseye"> Measure when forms are submitted </Card> <Card title="Custom Audiences" icon="users"> Build audiences from form interactions </Card> <Card title="Ad Optimization" icon="chart-bar"> Let Meta optimize for form completions </Card> </CardGroup> <Info> **Note:** This integration sends browser-side events only. For server-side tracking via Meta's Conversion API, see the [Cometly integration](/integrations/cometly). </Info> ## Setup Guide ### Step 1: Get Your Pixel ID from Meta <Steps> <Step title="Open Meta Events Manager"> Go to Meta Events Manager in your browser. [business.facebook.com/events\_manager](https://business.facebook.com/events_manager) </Step> <Step title="Select your Pixel"> Click on "Data sources" in the left sidebar, then select your Meta Pixel from the list. </Step> <Step title="Find your Pixel ID"> Your Pixel ID is displayed at the top of the page. It's a 15-16 digit number. </Step> <Step title="Copy the ID"> Copy this number. You'll paste it into OrbitForms in the next step. Example: `123456789012345` </Step> </Steps> <Warning> **Don't have a Pixel yet?** You'll need to create one first in Meta Events Manager. Go to [Events Manager](https://business.facebook.com/events_manager) → Connect Data Sources → Web → Meta Pixel. </Warning> ### Step 2: Connect the Pixel in OrbitForms <Steps> <Step title="Open your form in OrbitForms"> Go to your dashboard and click on the form you want to track. </Step> <Step title="Click the 'Integrate' tab"> In the form editor, find and click the "Integrate" tab at the top. </Step> <Step title="Find Meta Pixel"> Scroll down to find "Meta Pixel" under the Tracking & Analytics section. </Step> <Step title="Click to configure"> Click on the Meta Pixel card to open the configuration modal. </Step> <Step title="Enter your Pixel ID"> Paste the 15-16 digit Pixel ID you copied from Meta Events Manager. </Step> <Step title="Choose your events"> Select which events to track (see event options below). We recommend the custom events for detailed tracking. </Step> <Step title="Save your form"> Click "Save". The pixel will now fire whenever your form is viewed or submitted. </Step> </Steps> ## Event Options OrbitForms sends two types of events to your Meta Pixel. Choose the event type that best fits your tracking needs: ### Page View Event Fires when a visitor loads your form. Choose one: * **Custom: OrbitFormPageView** — **Recommended.** Includes form\_slug and form\_name for detailed tracking per form. * **Standard: PageView** — Meta's standard page view event. Simpler but less form-specific. * **Disabled** — Don't fire any page view event. Use this if you only want to track submissions. ### Form Submission Event Fires when a visitor submits your form. Choose one: * **Custom: OrbitFormSubmitted** — **Recommended** for detailed tracking. Includes form\_slug and form\_name. * **Standard: Lead** — Best for lead generation forms. Helps Meta optimize ad delivery for lead conversions. * **Standard: CompleteRegistration** — Best for signup and registration forms. * **Disabled** — Don't fire any submission event. Use this if you only want to track page views. ## Step 3: Verify Your Pixel is Working After connecting your pixel, verify that events are being received by Meta: <Steps> <Step title="Install Meta Pixel Helper (optional)"> The Meta Pixel Helper Chrome extension shows you in real-time what events are firing on a page. [Install from Chrome Web Store](https://chrome.google.com/webstore/detail/meta-pixel-helper/fdgfkebogiimcoedlicjlajpkdmockpc) </Step> <Step title="Visit your form"> Open your form in a new browser tab. If using the Pixel Helper, you should see the PageView event fire. </Step> <Step title="Submit a test entry"> Fill out and submit your form with test data. This will trigger the submission event. </Step> <Step title="Check Meta Events Manager"> Go to Events Manager and look at your Pixel's Overview or Test Events. You should see your events within a few minutes. [Events Manager](https://business.facebook.com/events_manager) </Step> </Steps> <Tip> **Tip: Use Test Events** — In Events Manager, click "Test Events" to see events in real-time as they fire. This is faster than waiting for the main Overview to update. </Tip> ## Advanced: Custom Events <Warning> **Important: Choose one method only.** Use the built-in Meta Pixel integration above (enter Pixel ID and select events) rather than adding your own pixel code elsewhere. Running both the built-in integration and a second copy of the pixel will cause duplicate events to fire. </Warning> Need more control? The event options above cover most use cases: the **Custom** events (`OrbitFormPageView` / `OrbitFormSubmitted`) include `form_slug` and `form_name`, and the **Standard** events (`PageView`, `Lead`, `CompleteRegistration`) map directly to Meta's optimization goals. Note: the form's Custom JavaScript field runs in an isolated sandbox and cannot call `fbq`, so it can't be used to fire additional pixel events—configure your events with the built-in options instead. ## Server-Side Tracking **Want Conversion API (Server Events)?** The Meta Pixel integration uses browser-side tracking, which can be blocked by ad blockers. For server-side tracking with Meta's Conversion API, we recommend using [Cometly](/integrations/cometly). Cometly provides first-party attribution with server-side event tracking, bypassing browser limitations for more accurate conversion data. ## Troubleshooting <AccordionGroup> <Accordion title="Events not showing in Events Manager?"> Events can take up to 20 minutes to appear in the Overview. Use the "Test Events" tab for real-time verification, or install the [Meta Pixel Helper](https://chrome.google.com/webstore/detail/meta-pixel-helper/fdgfkebogiimcoedlicjlajpkdmockpc) Chrome extension to verify events are firing correctly. </Accordion> <Accordion title="Numbers don't match form submissions?"> Browser tracking can be blocked by ad blockers, privacy extensions, or browser settings. For more accurate tracking, consider using [Cometly](/integrations/cometly) for server-side events. </Accordion> <Accordion title="Invalid Pixel ID error?"> Pixel IDs are 15-16 digit numbers only. Make sure you're copying the correct ID from Events Manager (not the Pixel name), and that there are no extra spaces. </Accordion> <Accordion title="Duplicate events firing?"> Check that the pixel isn't also installed by another tag manager on the same page (e.g. via Google Tag Manager), or that your form isn't embedded on a page that already loads the same pixel. Choose one installation method to avoid duplicates. </Accordion> <Accordion title="Pixel Helper shows errors?"> Common issues include: Pixel ID mismatch (check the ID is correct), no events detected (the page may not have fully loaded), or "Pixel did not load" (check for browser extensions blocking scripts). </Accordion> </AccordionGroup> ## Resources <CardGroup> <Card title="Meta Events Manager" icon="link" href="https://business.facebook.com/events_manager"> Manage your pixels and events </Card> <Card title="Meta Pixel Documentation" icon="book" href="https://www.facebook.com/business/help/952192354843755"> Official Meta documentation </Card> <Card title="Meta Pixel Helper" icon="puzzle-piece" href="https://chrome.google.com/webstore/detail/meta-pixel-helper/fdgfkebogiimcoedlicjlajpkdmockpc"> Chrome extension for debugging </Card> <Card title="Meta Pixel Reference" icon="code" href="https://developers.facebook.com/docs/meta-pixel/reference"> Developer documentation </Card> </CardGroup> *** **Ready to Track Your Forms?** Set up Meta Pixel in minutes and start measuring your form conversions. [Get Started](https://orbitforms.ai/signin) # Microsoft Email & Calendar Source: https://docs.orbitforms.ai/integrations/microsoft-email-calendar Outlook, Microsoft Calendar & Teams integration <img alt="Microsoft" /> <Warning> Microsoft integration is coming soon. The details below describe planned functionality. Google Email & Calendar is available now. </Warning> Connect your Microsoft 365 account to power email sending in sequences via Outlook, sync your calendar for scheduling, and auto-generate Microsoft Teams meeting links for booked meetings. Authentication is handled through Azure AD v2.0 OAuth. <CardGroup> <Card title="Outlook for Sequences" icon="envelope"> Send personalized emails from your Outlook account in automated sequences </Card> <Card title="Calendar Sync" icon="calendar"> Real-time calendar sync via Microsoft Graph API for availability checking </Card> <Card title="Microsoft Teams" icon="video"> Auto-generate Teams meeting links when someone books a meeting with you </Card> <Card title="Auto-Refresh" icon="arrows-rotate"> OAuth tokens refresh automatically — no manual reconnection needed </Card> </CardGroup> ## Prerequisites You'll need: * A Microsoft 365 account (personal or work/school) * Member or admin access to your OrbitForms team * Your organization may require admin consent for OAuth apps (check with your IT team) ## Setup Guide <Steps> <Step title="Open Email & Calendar Settings"> Navigate to **Settings → Email & Calendar** in your OrbitForms dashboard. </Step> <Step title="Click "Connect Microsoft""> Click the **Connect Microsoft** button to begin the Azure AD v2.0 OAuth flow. You'll be redirected to Microsoft's sign-in page. </Step> <Step title="Sign In & Authorize"> Sign in with your Microsoft account and accept the requested permissions. If your organization requires admin consent, you may need to request approval from your IT administrator first. </Step> <Step title="Verify Connection"> Once redirected back, you'll see your Microsoft account listed as connected. Your calendars will be automatically discovered via the Microsoft Graph API. </Step> </Steps> ## Permissions OrbitForms requests the following Microsoft Graph API permissions: <CardGroup> <Card title="Mail.Send" icon="paper-plane"> Send emails on your behalf from Outlook in sequences and workflows </Card> <Card title="Mail.ReadBasic" icon="envelope-open"> Read basic email metadata for reply detection in sequences (message content is not accessed) </Card> <Card title="Calendars.ReadWrite" icon="calendar"> Read your calendars for availability and create events for booked meetings </Card> <Card title="User.Read" icon="shield"> Read your basic profile information (name and email address) </Card> </CardGroup> <Info> **Privacy Note** — OrbitForms only accesses the minimum data needed. Mail.ReadBasic provides access to message metadata only — we never read the full content of your emails. </Info> ## Calendar Sync Calendar sync is powered by the Microsoft Graph API. Once connected, your Outlook calendars are automatically discovered and synced for availability checking and conflict detection in scheduling. ### How Calendar Sync Works * All calendars from your Microsoft account are automatically discovered via Graph API * Select which calendars to check for conflicts in your scheduling settings * New bookings are created as events on your primary calendar * Calendar data syncs in real-time via Microsoft Graph webhooks ## Outlook for Sequences Your connected Microsoft account is used to send emails in sequences via Outlook. Emails are sent directly from your Outlook address, maintaining deliverability and allowing recipients to reply directly to you. * **Send from your address** — Sequence emails are sent from your actual Outlook address, not a proxy * **Thread tracking** — OrbitForms tracks email threads for automatic reply detection in sequences * **Token auto-refresh** — Azure AD tokens are refreshed automatically — no manual reconnection required ## Microsoft Teams When someone books a meeting through your scheduling page, OrbitForms can automatically generate a Microsoft Teams meeting link and include it in the calendar event and confirmation email. Set Microsoft Teams as the location type in your scheduling page settings. <Tip> **Automatic Teams Links** — Teams meeting links are generated at booking time and attached to the calendar event. Both you and the booker will receive the link in your confirmation emails. </Tip> ## Troubleshooting <AccordionGroup> <Accordion title="Token expired or connection lost"> If your Microsoft token expires and cannot be auto-refreshed, go to Settings → Email & Calendar and click "Reconnect" next to your Microsoft account. This will re-authorize via Azure AD and restore the connection. </Accordion> <Accordion title="Admin consent required"> Some organizations require an Azure AD administrator to approve third-party OAuth apps. If you see an "admin consent required" error, contact your IT team to approve OrbitForms in your Azure AD tenant. </Accordion> <Accordion title="Missing calendars"> Only calendars you have access to in Outlook will appear. If a calendar is missing, verify it's visible in your Outlook calendar settings. Shared calendars may require the owner to grant you access. </Accordion> <Accordion title="Emails not sending from sequences"> Verify your Microsoft connection is active in Settings → Email & Calendar. If the status shows "Disconnected", reconnect your account. Also check that your Outlook sending limits haven't been exceeded. </Accordion> </AccordionGroup> <Note> **Still need help?** Reach out to our support team at [support@orbitforms.ai](mailto:support@orbitforms.ai) or visit our [Help Center](/support). </Note> *** ## Microsoft Integration Coming Soon Microsoft account support for Outlook email, calendar sync, and Teams meeting links is coming soon. In the meantime, connect your Google account to get started. [Connect Google Instead →](https://orbitforms.ai/settings/email-calendar) # Notion Integration Source: https://docs.orbitforms.ai/integrations/notion All-in-one workspace for notes & databases <img alt="Notion" /> [Visit Notion](https://www.notion.so) ## Overview Connect your OrbitForms forms to Notion and automatically add submissions as pages in your databases. Perfect for tracking leads, managing requests, or building custom workflows in your team workspace. OrbitForms offers two ways to integrate with Notion: **Integration Page** for direct form-to-database connections and **Workflows** for advanced routing and filtering. <CardGroup> <Card title="Create Pages" icon="file-lines"> Automatically create new pages in your Notion database from form submissions </Card> <Card title="Property Mapping" icon="database"> Map form fields to any Notion property including selects, dates, and more </Card> <Card title="Rich Text Support" icon="layer-group"> Long-form responses are added as rich text content in the page body </Card> <Card title="Workflow Integration" icon="code-branch"> Use with AI qualification and enrichment before sending to Notion </Card> </CardGroup> ## Choose Your Integration Method Notion can be set up in two ways. Choose based on your needs: <CardGroup> <Card title="Integration Page" icon="gear"> Use the Integration page when you want to send **all form submissions** directly to Notion without any filtering. * Simple 1:1 form-to-database mapping * No need for lead qualification first * Fastest setup for basic tracking [Set up Integration](#step-1-create-a-notion-integration) </Card> <Card title="Workflows" icon="code-branch"> Use Workflows when you need **filtering, enrichment, or AI qualification** before sending to Notion. * Filter by lead score or qualification * Enrich leads before sending (Clay, etc.) * Use AI SDR qualification first * Route different leads to different databases [Learn more about Workflows](#using-notion-with-workflows) </Card> </CardGroup> ## Step 1: Connect Notion in OrbitForms OrbitForms connects to Notion via OAuth — no API tokens to create or copy. You'll authorize the connection and choose which pages and databases to share during Notion's authorization flow. <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. </Step> <Step title="Find Notion"> Scroll down or search for "Notion" in the integrations list. </Step> <Step title="Click to configure"> Click on the Notion card to open the configuration panel. </Step> <Step title="Click "Connect Notion""> Click the "Connect Notion" button. You'll be redirected to Notion's authorization page. </Step> <Step title="Authorize and select pages"> In Notion, select the pages and databases you want to share with OrbitForms, then confirm. Only the databases you select here will be available for mapping. </Step> <Step title="Return to OrbitForms"> You'll be redirected back to OrbitForms with a "Connected to Notion" confirmation showing your workspace name. </Step> </Steps> <Info> **Need to share another database later?** Open the database in Notion, click the "..." menu → "Add connections" (or "Connect to") and select the OrbitForms connection — or click "Reconnect" in the Notion integration settings to re-run the authorization flow and select more pages. </Info> ## Step 2: Configure Form Field Mapping Map your form fields to your Notion database properties. Each form field can be connected to a specific property in your database. <Steps> <Step title="Select a form to configure"> After connecting, you'll see a list of your forms. Click on the form you want to connect to Notion. </Step> <Step title="Select your database"> Choose which Notion database should receive the form submissions from the dropdown. </Step> <Step title="Map the Title field (required)"> Every Notion database needs a Title property. Map a form field (like Name or Email) to serve as the page title. </Step> <Step title="Map additional fields"> Map other form fields to their corresponding database properties. Match field types where possible (email to Email, dates to Date, etc.). </Step> <Step title="Click Save"> Click "Save" to save your mapping. New form submissions will now create pages in your Notion database. </Step> </Steps> ### Supported Property Types OrbitForms supports mapping to these Notion database property types: | Property Type | Description | Best For | | ---------------- | ----------------------------- | ------------------------ | | Title | Primary name field (required) | Name, Subject, Email | | Text (rich text) | Text content | Company, Messages, Notes | | Number | Numeric values | Amounts, Counts, Scores | | Email | Email addresses | Contact email | | Phone | Phone numbers | Phone number fields | | Select | Single choice from options | Status, Type, Source | | Multi-select | Multiple choices | Tags, Interests | | Status | Status options | Pipeline stage | | Date | Date values | Submitted at, Deadline | | Checkbox | Boolean true/false | Subscribed, Agreed | | URL | Website links | Website, Portfolio | ## Using Notion with Workflows For advanced use cases, add Notion as a destination in your workflows. This gives you more control over which submissions get sent to Notion. Use workflows when you need to: * Send only qualified leads to your Notion database * Include enriched data from Clay, Clearbit, or other sources * Route different form submissions to different Notion databases * Combine with other destinations like CRMs in a single flow * Use AI SDR to classify leads before adding to Notion ### Adding Notion to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want to connect. </Step> <Step title="Add any intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. </Step> <Step title="Add Notion destination"> Click the + button and select Notion from the destinations list. </Step> <Step title="Configure the Notion node"> Select your database and map your fields. You can use enriched data from previous nodes. </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Submissions will now flow through your workflow. </Step> </Steps> <Tip> **Example: Lead Tracking Database** — A common workflow that enriches and qualifies leads before adding to Notion: Form Submission → AI Agent (Qualify) → Clay (Enrich) → Notion </Tip> ## Verifying Your Integration After setting up your integration, verify that pages are being created in your Notion database: <Steps> <Step title="Submit a test form"> Fill out and submit your form with test data to trigger a page creation. </Step> <Step title="Open your Notion database"> Go to the database you connected and look for the new page. </Step> <Step title="Verify the page data"> Check that the page was created with the correct property values from your form submission. </Step> </Steps> ## Troubleshooting <AccordionGroup> <Accordion title="Database not appearing in dropdown?"> Make sure you've shared the database with your integration. Open the database in Notion, click the "..." menu, then "Add connections" and select your integration. </Accordion> <Accordion title="Connection expired or workspace access revoked?"> If the connection stops working, open the Notion integration settings in OrbitForms and click "Reconnect" to re-run the OAuth authorization flow. Your existing form mappings are preserved. </Accordion> <Accordion title="Pages not appearing in database?"> Check that your form has a valid mapping saved. Also verify the Title field is mapped — Notion requires a Title property for every page. </Accordion> <Accordion title="Select values not matching?"> For Select and Multi-select properties, the option must already exist in your Notion database or it will be created automatically. Make sure the values match exactly (case-sensitive). </Accordion> <Accordion title="Long text getting truncated?"> For long-form content like messages or notes, use a Rich Text property type instead of Text. Rich Text supports longer content and formatting. </Accordion> </AccordionGroup> ## Resources <CardGroup> <Card title="Manage Connections in Notion" icon="link" href="https://www.notion.so/profile/connections"> See and manage apps connected to your workspace </Card> <Card title="Notion Connections Guide" icon="book" href="https://developers.notion.com/docs/authorization"> How Notion OAuth authorization works </Card> <Card title="Notion Database API Reference" icon="code" href="https://developers.notion.com/reference/database"> Developer documentation </Card> <Card title="Notion Website" icon="globe" href="https://www.notion.so"> Visit Notion </Card> </CardGroup> *** **Ready to Connect Notion?** Set up Notion in minutes and start automatically adding form submissions to your databases. [Get Started](https://orbitforms.ai/signin) # Integrations Source: https://docs.orbitforms.ai/integrations/overview Connect OrbitForms with your favorite tools to automate your workflows. ## How Integrations Work When a user submits your form, OrbitForms can automatically send the data to your connected integrations. This happens in real-time, so your systems are always up to date. * Real-time sync * Field mapping * Retry on failure ## Featured Guides <CardGroup> <Card title="Salesforce" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/salesforce.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=a67c88cb0f606e2be17eab30ebf0b3b5" href="/integrations/salesforce"> <Badge icon="clock">Coming Soon</Badge> Sync leads to Salesforce </Card> <Card title="HubSpot" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/HubSpot.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=1fdf3aa6d2c9545d9ce8348dfc8ed927" href="/integrations/hubspot"> Sync leads to HubSpot </Card> <Card title="Slack" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/slack.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=a3500e56190bcac222907b8e38a5f9c2" href="/integrations/slack"> <Badge icon="bolt">Pro</Badge> Real-time notifications </Card> <Card title="Google Sheets" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/Sheets.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=67609a146a5538eaae2bc529e4bd5e2b" href="/integrations/google-sheets"> Add rows to spreadsheets </Card> <Card title="Airtable" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/airtable.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=fdca561c79dfd00a4ab6226de6d6a3b3" href="/integrations/airtable"> Add records to bases </Card> <Card title="Zapier" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/zapier.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=57b79caa02205dedaf6c8b879067976a" href="/integrations/zapier"> Connect 5,000+ apps </Card> <Card title="Clay" icon="https://mintcdn.com/orbitai-d647f397/xAyOn7AVz_trk1Dg/_images/integrations/clay.png?fit=max&auto=format&n=xAyOn7AVz_trk1Dg&q=85&s=590d1ced4c954bc83d6c3408781aacbe" href="/integrations/clay"> <Badge icon="bolt">Pro</Badge> Enrich form data </Card> <Card title="Webhooks" icon="webhook" href="/integrations/webhooks"> <Badge icon="bolt">Pro</Badge> Custom integrations </Card> </CardGroup> ## All Integrations ### Notifications Get notified when forms are submitted. Slack, Email Notifications ### CRMs Automatically create or update contacts in your CRM. Salesforce (coming soon), HubSpot, Pipedrive (coming soon), Attio, Close ### Email Marketing Add subscribers to your email lists and campaigns. Mailchimp, ActiveCampaign, [Instantly](/integrations/instantly) ### Spreadsheets & Databases Sync submissions to spreadsheets and databases in real-time. Google Sheets, Airtable, Notion ### Enrichment Enrich form data with company and contact information. Clay ### Messaging Send SMS and MMS from **Sequences** using Salesmsg (Advanced plan). [Salesmsg](/integrations/salesmsg) ### Email Verification Validate email addresses in real time on your forms (Pro plan). NeverBounce, ZeroBounce, Emailable ### Analytics & Tracking Attribute conversions and track form events. [Cometly](/integrations/cometly), [Google Analytics 4](/integrations/google-analytics), [Google Tag Manager](/integrations/google-tag-manager), [Meta Pixel](/integrations/meta-pixel), [Custom JavaScript](/integrations/custom-javascript) ### Calendar & Scheduling Sync availability and auto-generate meeting links for bookings. [Google Calendar & Meet](/integrations/google-email-calendar), [Zoom](/integrations/zoom), Microsoft (coming soon) ### Automation Connect to 5,000+ apps via automation platforms. Zapier ### Custom Build your own integrations with webhooks. Webhooks ## Setting Up an Integration Follow these steps to connect an integration: <Steps> <Step title="Open your form settings"> Go to your form and navigate to the Integrations tab. </Step> <Step title="Choose an integration"> Click "Add Integration" and select the service you want to connect. </Step> <Step title="Authenticate"> Connect your account by following the OAuth flow or entering API credentials. </Step> <Step title="Map your fields"> Match your form fields to the corresponding fields in the destination. </Step> <Step title="Test and activate"> Send a test submission to verify everything works, then enable the integration. </Step> </Steps> ## Need a Custom Integration? Use webhooks to send form data to any endpoint. Perfect for custom backends, internal tools, or services we don't have native integrations for. [Learn about Webhooks](/integrations/webhooks) # Pipedrive Integration Source: https://docs.orbitforms.ai/integrations/pipedrive Sales CRM for pipeline management <Warning> **Coming Soon** — The Pipedrive integration is currently in development. Check back soon for updates. </Warning> <img alt="Pipedrive" /> [Visit Pipedrive](https://www.pipedrive.com) ## Start Here ### Overview Connect your OrbitForms forms to Pipedrive and automatically create Persons and Deals when forms are submitted. Pipedrive's visual pipeline makes it easy to track leads through your sales process. <Note> **Why This Matters** Stop copying and pasting lead data from forms to your CRM. With the Pipedrive integration, every form submission automatically creates a Person and optionally a Deal in your pipeline, so your sales team can focus on selling instead of data entry. </Note> ## Key Features <CardGroup> <Card title="Create Persons" icon="users"> Automatically create new Persons from form submissions. </Card> <Card title="Create Deals" icon="bullseye"> Optionally create Deals linked to the Person. </Card> <Card title="Update Existing" icon="arrows-rotate"> Update Person details if email already exists. </Card> <Card title="Organizations" icon="building"> Link Persons to Organizations based on company. </Card> </CardGroup> ## Before You Begin * A Pipedrive account (any plan) * Permission to authorize OAuth apps in Pipedrive * A form with fields to map (e.g., Name, Email, Company) ## Choose Your Setup Method You can sync form submissions to Pipedrive in two ways. Choose based on your needs: <CardGroup> <Card title="Integration Page" icon="gear"> Connect Pipedrive from your Integrations page using secure OAuth and configure field mappings. **Best for:** * Quick setup with OAuth (no API tokens to manage) * Simple 1:1 form-to-Pipedrive mapping * Syncing all submissions without filtering [Set up via Integration Page](#integration-page-setup) </Card> <Card title="Workflows" icon="code-branch"> Add Pipedrive as a destination in your workflows for advanced control over which leads sync. **Best for:** * Filtering by lead score or qualification * Enriching data before syncing to Pipedrive * Combining with AI Agent qualification [Set up with Workflows](#using-pipedrive-with-workflows) </Card> </CardGroup> ### Integration Page vs. Workflows: Which Should You Use? **Integration Page** Use the Integration page when you want to send **all form submissions** directly to Pipedrive. * Simple form-to-CRM mapping * No need for lead qualification * Fastest setup for basic sync **Workflows** Use Workflows when you need **filtering, enrichment, or AI qualification** before syncing. * Filter by lead score * Enrich leads before syncing * Use AI Agent to qualify first ## Integration Page Setup Connect Pipedrive to OrbitForms using OAuth and configure which forms sync to your CRM. ### Step 1: Connect Pipedrive in OrbitForms <Steps> <Step title="Go to Integrations in OrbitForms"> From your dashboard, click "Integrations" in the left sidebar. `Dashboard → Integrations (left sidebar)` </Step> <Step title="Find Pipedrive"> Scroll down or search for "Pipedrive" in the integrations list. `Search or scroll to find Pipedrive` </Step> <Step title="Click to configure"> Click on the Pipedrive card to open the configuration panel. `Click on Pipedrive card` </Step> <Step title="Click Connect"> Click the "Connect Pipedrive" button to start the OAuth authorization flow. `Click "Connect Pipedrive" button` </Step> <Step title="Authorize in Pipedrive"> You'll be redirected to Pipedrive. Sign in if needed, then click "Allow and Install" to grant OrbitForms access. `Authorize OrbitForms in Pipedrive` </Step> <Step title="Connection complete"> You'll be redirected back to OrbitForms. You should see a success message confirming the connection. `Verify "Connected" status` </Step> </Steps> ### Step 2: Configure a Form Mapping <Steps> <Step title="Go to the Field Mapping tab"> After connecting, click the "Field Mapping" tab in the Pipedrive configuration panel. `Pipedrive config → Field Mapping tab` </Step> <Step title="Select a form to configure"> You'll see a list of your forms. Click on the form you want to sync to Pipedrive. `Click on a form from the list` </Step> <Step title="Map your form fields"> For each form field, select the corresponding Pipedrive field from the dropdown. Name is required. `Form field → Select Pipedrive field` </Step> <Step title="Configure Deal creation (optional)"> Toggle on "Create Deal" if you want to automatically create Deals. Select a pipeline and stage. `Toggle Create Deal → Select pipeline/stage` </Step> <Step title="Save Configuration"> Click "Save Configuration" to save your mappings. The form will now sync to Pipedrive. `Click "Save Configuration" button` </Step> </Steps> ## Field Mapping Reference Map your form fields to Pipedrive Person fields. The Name field is required for creating Persons. | Form Field | Pipedrive Field | Required | | ---------- | --------------- | -------- | | Name | name | Required | | Email | email | Optional | | Phone | phone | Optional | | Company | org\_id.name | Optional | | Job Title | job\_title | Optional | | Message | notes | Optional | ### Using Custom Fields You can map form fields to any custom field in Pipedrive. Custom fields use a hash key format that you can find in Settings → Data fields. <Tip> Example: A custom field might have a key like `abc123def456` </Tip> ## Using Pipedrive with Workflows For advanced use cases, add Pipedrive as a destination in your workflows. This gives you more control over which submissions get sent to your CRM. ### Use workflows when you need to: * Send to Pipedrive only for qualified leads (after AI agent qualification) * Include enriched data in your Pipedrive records (from Clay, Clearbit, etc.) * Use AI SDR to classify leads before adding to your pipeline * Route different leads to different pipelines or deal stages ### Example: Qualified Leads Only A common workflow that only sends qualified leads to Pipedrive: **Form Submission** → **AI Agent (Qualify)** → **Filter (Score > 70)** → **Pipedrive** ## Troubleshooting <Warning> **Person not created in Pipedrive?** Pipedrive requires a Person name. Make sure you have the name field mapped from your form. </Warning> <Warning> **OAuth connection expired?** If the integration stops working, disconnect and reconnect Pipedrive from the Integrations page. This re-runs the OAuth flow and refreshes your tokens. </Warning> <Warning> **Deal not being created?** Make sure "Create Deal" is enabled in the integration settings and you've selected a valid pipeline and stage. </Warning> <Warning> **Custom fields not syncing?** Custom fields use hash keys. Find your field's API key in Pipedrive under Settings → Data fields → Click on the field to see its API key. </Warning> ## Resources * [Pipedrive OAuth Guide](https://pipedrive.readme.io/docs/marketplace-oauth-authorization) * [Persons API Reference](https://pipedrive.readme.io/docs/core-api-concepts-persons) * [Custom Fields Guide](https://support.pipedrive.com/en/article/custom-fields) * [Pipedrive Website](https://www.pipedrive.com) *** ## Ready to Sync Your Forms to Pipedrive? Connect Pipedrive in minutes and start automatically syncing leads to your sales pipeline. [Get Started](https://orbitforms.ai/signin) # Salesforce Integration Source: https://docs.orbitforms.ai/integrations/salesforce Sync leads directly to your CRM <Warning> **Coming Soon** — The Salesforce integration is currently in development. Check back soon for updates. </Warning> <img alt="Salesforce" /> [Visit Salesforce](https://www.salesforce.com) ## Start Here Connect your OrbitForms forms to Salesforce CRM and automatically create or update Leads, Contacts, and Accounts when forms are submitted. This integration is perfect for capturing leads, managing customer inquiries, and powering your sales pipeline. ### Overview Here's the idea in plain terms: * You connect Salesforce to OrbitForms via **OAuth** authentication. * When someone submits a form, Orbit creates or updates a **Lead, Contact, or Account** in Salesforce. * Form fields are mapped to Salesforce fields (standard or custom). * Branded activity notes appear in the record's timeline. ### Why This Matters Salesforce is the world's leading CRM. By connecting your forms to Salesforce, you ensure every lead is captured immediately, no manual data entry is required, and your sales team can follow up faster with complete information. *** ## Key Features <CardGroup> <Card title="Create Leads" icon="users"> Automatically create new Lead records from form submissions. </Card> <Card title="Smart Deduplication" icon="arrows-rotate"> Update existing records if email already exists in your CRM. </Card> <Card title="Field Mapping" icon="building"> Map form fields to any standard or custom Salesforce field. </Card> <Card title="Activity Timeline" icon="file-lines"> Create branded OrbitForms tasks visible in record timelines. </Card> </CardGroup> *** ## Step 1: Connect via OAuth First, connect your Salesforce account to OrbitForms using secure OAuth authentication. ### What to do <Steps> <Step title="Go to Integrations"> Go to **Integrations** in your OrbitForms dashboard. </Step> <Step title="Find Salesforce"> Find **Salesforce** and click **Connect**. </Step> <Step title="Sign in"> Sign in with your Salesforce account credentials. </Step> <Step title="Allow access"> Allow OrbitForms to access your Salesforce org. </Step> </Steps> ### What this does * Securely connects your Salesforce account without sharing your password. * We only request the minimum API permissions needed. *** ## Step 2: Choose Object Type Select whether to create Leads, Contacts, or Accounts from form submissions. ### What to do <Steps> <Step title="Select Object Type"> In the Salesforce configuration panel, click **Select Object Type**. </Step> <Step title="Choose record type"> Choose **Lead**, **Contact**, or **Account**. </Step> </Steps> <Tip> Leads are most common for capturing new prospects. Use Contacts when leads are already qualified, or Accounts for company-level tracking. </Tip> *** ## Step 3: Map Your Fields Match each form field to the corresponding Salesforce field. ### Common Lead Field Mappings | Form Field | Salesforce Field | Required | | ---------- | ---------------- | -------- | | Email | Email | Optional | | First Name | FirstName | Optional | | Last Name | LastName | Required | | Company | Company | Required | | Phone | Phone | Optional | | Job Title | Title | Optional | | Website | Website | Optional | | Message | Description | Optional | <Warning> LastName and Company are required for Lead creation in Salesforce. Make sure your form includes these fields. </Warning> *** ## Using Custom Fields You can map form fields to any custom Salesforce field using the API name. ### Finding Custom Field API Names * Custom fields use the API name format with `__c` suffix. * Find API names in Setup → Object Manager → Lead → Fields & Relationships. * Example: A "Lead Source Detail" field might have API name `Lead_Source_Detail__c` *** ## Common Issues and Fixes <Warning> **Issue: Lead not appearing in Salesforce** * Make sure LastName and Company fields are mapped and contain valid data. * Verify the connected Salesforce account has permission to create Leads. </Warning> <Warning> **Issue: OAuth connection expired** * Salesforce tokens can expire. * Try disconnecting and reconnecting your Salesforce account. </Warning> <Warning> **Issue: Custom field not saving** * Use the API name (e.g., Custom\_Field\_\_c), not the display label. * Find the API name in Setup → Object Manager → Lead → Fields & Relationships. </Warning> <Warning> **Issue: Duplicate leads being created** * Configure duplicate matching rules in Salesforce Setup. * Or use email-based deduplication to update existing leads instead. </Warning> *** ## Related Articles <CardGroup> <Card title="Creating Workflows" icon="code-branch" href="/guides/workflows" /> <Card title="HubSpot Integration" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/HubSpot.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=1fdf3aa6d2c9545d9ce8348dfc8ed927" href="/integrations/hubspot" /> <Card title="Clay Integration" icon="https://mintcdn.com/orbitai-d647f397/xAyOn7AVz_trk1Dg/_images/integrations/clay.png?fit=max&auto=format&n=xAyOn7AVz_trk1Dg&q=85&s=590d1ced4c954bc83d6c3408781aacbe" href="/integrations/clay" /> <Card title="All Integrations" icon="bolt" href="/integrations/overview" /> </CardGroup> *** [Visit Salesforce](https://www.salesforce.com) · [All Integrations](/integrations/overview) · [Documentation](/guides/overview) # Salesmsg Integration Source: https://docs.orbitforms.ai/integrations/salesmsg SMS & MMS messaging for sales teams <img alt="Salesmsg" /> <Note> Salesmsg is an **Advanced** plan feature. It is used with **Sequences** (also on Advanced) to send automated SMS and MMS to enrolled contacts. </Note> [Visit Salesmsg](https://www.salesmessage.com) Connect your Salesmsg account to OrbitForms and send SMS and MMS messages to your leads and contacts automatically. Use Salesmsg with **Sequences** for automated multi-step outreach with SMS steps. Salesmsg is a **personal integration** — each team member connects their own Salesmsg account. <CardGroup> <Card title="Automated SMS outreach" icon="message"> Send text messages from sequence SMS steps alongside email steps </Card> <Card title="Inbox & default number" icon="inbox"> Choose a Salesmsg inbox (for conversations) and a default sending number in Sending settings, then save </Card> <Card title="Sequence sender" icon="phone"> Pick the **Send from number** once per sequence (Settings → SMS); Orbit uses that team member's Salesmsg connection </Card> <Card title="Easy setup" icon="gear"> Connect in a few minutes with secure OAuth — your Salesmsg password is never shared </Card> </CardGroup> <Info> **Personal integration** — Salesmsg is connected per user, not per team. Each team member who wants their number available for sequences should connect in **Settings → Sending** under **SMS Sending**. When a sequence sends SMS, it uses the **Send from number** you chose in that sequence's settings; that number belongs to a specific team member's Salesmsg account. </Info> ## Before you begin You will need: * An OrbitForms **Advanced** plan (Sequences + SMS messaging) * A Salesmsg account with an active subscription * At least one phone number configured in Salesmsg * Access to your Salesmsg account to authorize OrbitForms * Member access to your OrbitForms team ## Setup guide <Steps> <Step title="Open Sending settings"> Go to **Settings → Sending** in OrbitForms. Find the **SMS Sending** section below email domain configuration. </Step> <Step title="Authorize with Salesmsg"> Click **Connect with Salesmsg**. You will be redirected to Salesmsg to authorize OrbitForms. Log in and approve the connection; you will return to OrbitForms automatically. <Info> **Secure OAuth** — OrbitForms uses OAuth 2.0. Access tokens are stored securely; your Salesmsg password is not kept by OrbitForms. You can disconnect anytime in Sending settings. </Info> </Step> <Step title="Choose your Salesmsg inbox"> After connecting, open the **Message Inbox** dropdown and select the Salesmsg inbox (team) to use for conversations. The Salesmsg API requires this for creating conversations and sending messages. </Step> <Step title="Choose your default phone number"> Open **Default Phone Number** and select the number that should be used when no other number is chosen at the sequence level. </Step> <Step title="Save settings"> Click **Save Settings** so your inbox and default number are stored. If you change inbox or numbers in Salesmsg later, update and save here again (or disconnect and reconnect if lists look stale). </Step> <Step title="Configure each sequence that has SMS"> Open your sequence, add **SMS** steps as needed, then go to the **Settings** tab. In the **SMS** section, choose **Send from number** (required to publish when the sequence includes SMS). The list includes numbers from every team member who has connected Salesmsg. </Step> </Steps> ## Using with sequences Sequences can mix **email** and **SMS** steps with delays between them. | What | Where | | ---------------------------------------- | --------------------------------------------------------------------------------------------------- | | **Connect Salesmsg** | **Settings → Sending** → **SMS Sending** (per team member who sends) | | **Default inbox & number** | Same place, after connect — **Message Inbox**, **Default Phone Number**, then **Save Settings** | | **Which number sends for this sequence** | Sequence **Settings** tab → **SMS** → **Send from number** (required if the sequence has SMS steps) | Orbit sends each SMS using the Salesmsg account tied to the sequence **Send from number**. You must set that field to **publish** any sequence that includes SMS steps. ### Example sequence 1. Step 1: Send introductory email (Day 0) 2. Step 2: Follow up with SMS via Salesmsg (Day 2) 3. Step 3: Send detailed email with case study (Day 5) 4. Step 4: Final SMS follow-up if no reply (Day 7) ## Troubleshooting <AccordionGroup> <Accordion title="Connection or authorization issues"> Disconnect and reconnect Salesmsg in **Settings → Sending**. Confirm you are logged into the correct Salesmsg account when the OAuth window opens. If you see a reconnect prompt, complete it so tokens stay valid. </Accordion> <Accordion title="Messages are not delivered"> Check that the contact has a **phone** field in E.164 format (e.g. +14155551234). Confirm your Salesmsg account has credits, the sending number is active, and the recipient has not opted out or blocked messaging. </Accordion> <Accordion title="No phone numbers after connecting"> In Salesmsg, confirm at least one number exists (Salesmsg → Numbers). Return to OrbitForms, open **SMS Sending**, and use **Save Settings** after selecting inbox and number. If the list is empty, try disconnect and reconnect. </Accordion> <Accordion title="Errors about inbox, team, or conversation"> Select a **Message Inbox** in **Settings → Sending**, click **Save Settings**, and retry. Sending requires a valid Salesmsg inbox ID. Reconnecting refreshes inbox metadata if something changed in Salesmsg. </Accordion> <Accordion title="Cannot publish / "Select a Send From Number""> Open the sequence **Settings** tab → **SMS** section and choose **Send from number**. The teammate who owns that number must have Salesmsg connected under **SMS Sending** without connection errors. </Accordion> <Accordion title="My number does not appear in the sequence list"> The **Send from number** list only includes numbers from users who have connected Salesmsg for your team. That user should connect (or reconnect) under **Settings → Sending** → **SMS Sending**. </Accordion> </AccordionGroup> <Note> **Still need help?** Reach out at [support@orbitforms.ai](mailto:support@orbitforms.ai) or visit the [Help Center](/support). </Note> *** ## Ready to connect Salesmsg? Start sending SMS messages to your leads in minutes. Connect your Salesmsg account now. [Connect Salesmsg →](https://orbitforms.ai/settings/email-sending) # Slack Integration Source: https://docs.orbitforms.ai/integrations/slack Real-time form notifications for your team <Info> This integration requires a **Pro** plan. </Info> [Visit Slack](https://slack.com) ## Start Here ### Overview Connect OrbitForms to Slack and receive instant notifications whenever forms are submitted. Keep your team informed in real-time without leaving your messaging workspace. Choose between the Integration Page for quick setup or Workflows for advanced automation with filtering and enrichment. <Note> **Why This Matters** Speed to lead is critical. With Slack notifications, your team sees new submissions the moment they arrive—no more checking dashboards or waiting for email. React faster, close more deals, and keep everyone aligned. </Note> ## Key Features <CardGroup> <Card title="Instant Notifications" icon="bell"> Get real-time alerts the moment a form is submitted. </Card> <Card title="Channel Selection" icon="hashtag"> Send notifications to any public or private channel. </Card> <Card title="Rich Formatting" icon="message"> See all form data in clean, readable messages. </Card> <Card title="Workflow Integration" icon="code-branch"> Use with AI qualification and enrichment. </Card> </CardGroup> ## Choose Your Setup Method Slack notifications can be set up in two ways. Choose based on your needs: <CardGroup> <Card title="Integration Page" icon="gear"> The quickest way to get started. Connect Slack in your form's Integrations tab and select a channel to receive all submissions. **Best for:** * Quick setup with minimal configuration * Sending all form submissions to one channel * Simple notification needs [Set up via Integration Page](#integration-page-setup) </Card> <Card title="Workflows" icon="code-branch"> Use Slack as a destination in your workflows for advanced control over which submissions trigger notifications. **Best for:** * Notify only for qualified leads * Include enriched data in notifications * Route to different channels based on criteria [Set up via Workflows](#using-slack-with-workflows) </Card> </CardGroup> ### Integration Page vs. Workflows: Which Should You Use? **Integration Page** Use the Integration page when you want to send **all form submissions** directly to Slack without any filtering. * Simple 1:1 form-to-channel mapping * No need for lead qualification first * Fastest setup for basic notifications **Workflows** Use Workflows when you need **filtering, enrichment, or AI qualification** before notifying your team. * Filter by lead score or qualification * Enrich leads before notifying (Clay, etc.) * Use AI SDR qualification first * Route different leads to different channels [Learn more about Workflows](#using-slack-with-workflows) ## Before You Begin ### Prerequisites * A Slack workspace where you have permission to install apps * At least one OrbitForms form ready to connect * Access to the channel where you want notifications sent ## Integration Page Setup The quickest way to get Slack notifications. Connect your workspace and select a channel directly from your form's settings. ### Step 1: Connect Your Slack Workspace <Steps> <Step title="Open your form in OrbitForms"> Go to your dashboard and click on the form you want to send notifications for. `Dashboard → Forms → [Your Form]` </Step> <Step title="Click the "Integrate" tab"> In the form editor, find and click the "Integrate" tab at the top. `Form Editor → Integrate tab` </Step> <Step title="Find the Slack section"> Scroll down to find "Slack" under the Notifications section. `Scroll to: Notifications → Slack` </Step> <Step title="Click "Connect to Slack""> Click the "Connect to Slack" button to begin the authorization process. `Click "Connect to Slack" button` </Step> <Step title="Authorize OrbitForms"> Sign in to your Slack workspace and click "Allow" to grant OrbitForms permission to post messages. We only request the minimum required permissions. `Sign in → Click "Allow"` </Step> </Steps> ### Step 2: Select a Channel <Steps> <Step title="Choose your notification channel"> After connecting, a dropdown will appear with all available channels. Select the channel where you want form submissions to be posted. `Click dropdown → Select channel` </Step> <Step title="Save your configuration"> Click the Save button to save your Slack integration settings. `Click Save button` </Step> </Steps> <Warning> **Using a Private Channel?** For private channels, you'll need to manually invite the OrbitForms bot after connecting. In Slack, go to the channel, type `/invite @OrbitForms` and press Enter. </Warning> ## Notification Format Each Slack notification includes key information about the form submission in a clean, readable format: | Field | Description | Example | | --------------- | ------------------------------------------------------- | ------------------------------------------- | | Form Name | The name of the form that was submitted | Contact Form | | Submission Time | Timestamp of when the form was submitted | Jan 15, 2025 at 10:30 AM | | Form Fields | All submitted field values (email, name, message, etc.) | [john@example.com](mailto:john@example.com) | | View Link | Direct link to view the submission in OrbitForms | View submission → | ## Using Slack with Workflows For advanced use cases, add Slack as a destination in your workflows. This gives you more control over which submissions trigger notifications and what data is included. ### Use workflows when you need to: * Send notifications only for qualified leads (after AI agent qualification) * Include enriched data in your Slack messages (from Clay, Clearbit, etc.) * Route different form submissions to different channels * Combine with other destinations like your CRM in a single flow * Use AI SDR to classify leads before notifying sales ### Adding Slack to a Workflow <Steps> <Step title="Create or open a workflow"> Go to Workflows in your dashboard and create a new workflow or open an existing one. `Dashboard → Workflows → Create/Edit` </Step> <Step title="Add a trigger"> Set up a Form Submission trigger for the form(s) you want notifications for. `Add Trigger → Form Submission` </Step> <Step title="Add any intermediate steps (optional)"> Add AI Agent for qualification, Enrichment nodes, or Filter nodes as needed. `Add AI Agent, Enrichment, or Filter nodes` </Step> <Step title="Add Slack destination"> Click the + button and select Slack from the destinations list. `+ Add Destination → Slack` </Step> <Step title="Connect your Slack workspace"> If you haven't connected Slack yet, click "Connect to Slack" and authorize the app. `Connect to Slack → Authorize` </Step> <Step title="Select the target channel"> Choose which channel should receive notifications from this workflow. `Select channel from dropdown` </Step> <Step title="Save and activate"> Save your workflow and toggle it to Active. Notifications will now flow through your workflow. `Save → Toggle Active` </Step> </Steps> ### Example: Notify Sales for Qualified Leads Only A common workflow that only notifies your sales team about high-quality leads: **Form Submission** → **AI Agent (Qualify)** → **Filter (Score > 70)** → **Slack (#sales-leads)** ## Testing Your Integration After setting up Slack notifications, verify that messages are being sent correctly: <Steps> <Step title="Submit a test form"> Fill out and submit your form with test data to trigger a notification. </Step> <Step title="Check your Slack channel"> Open the Slack channel you configured. You should see a notification within a few seconds. </Step> <Step title="Verify the message content"> Check that all the form data appears correctly in the notification and that the "View submission" link works. </Step> </Steps> ## Troubleshooting <Warning> **Notifications not appearing in Slack?** Make sure the OrbitForms bot has been added to the channel. For private channels, you need to manually invite the bot by typing `/invite @OrbitForms` in the channel. </Warning> <Warning> **Connection expired or disconnected?** If notifications stop working, your Slack connection may have expired. Go to your form's Integrations tab, disconnect Slack, and reconnect it. You'll need to reauthorize the app. </Warning> <Warning> **Can't find a channel in the dropdown?** The channel list shows channels the OrbitForms bot has access to. For private channels, invite the bot first, then refresh the page to see the channel in the dropdown. </Warning> <Warning> **Duplicate notifications?** If you're seeing duplicate notifications, you may have both the Integration Page and a Workflow configured for the same form. Choose one method and disable the other to avoid duplicates. </Warning> <Warning> **"Missing permissions" error?** This usually means your Slack admin has restricted app installations. Contact your workspace administrator to approve the OrbitForms app, or ask them to install it for you. </Warning> ## Tips for Success <Tip> * **Create a dedicated channel** for form notifications to avoid cluttering general channels * **Use Slack's notification settings** to control alert frequency and avoid notification fatigue * **Set up workflows for high-volume forms** to filter out noise and only notify on important submissions * **Test with a real submission** to ensure the message format looks correct before going live </Tip> ## Resources * [Understanding Slack Channels](https://slack.com/help/articles/115000769927-Use-channels) * [Managing App Permissions](https://slack.com/help/articles/360025446073-Manage-app-permissions-in-a-workspace) * [Configuring Slack Notifications](https://slack.com/help/articles/201355156-Configure-your-Slack-notifications) * [Slack Website](https://slack.com) *** ## Ready to Set Up Slack Notifications? Keep your team in the loop with real-time form submission notifications. [Get Started](https://orbitforms.ai/signin) ## Next Steps <CardGroup> <Card title="All Integrations" href="/integrations/overview" icon="grid"> Explore other integrations </Card> <Card title="HubSpot Integration" href="/integrations/hubspot" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/HubSpot.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=1fdf3aa6d2c9545d9ce8348dfc8ed927"> Sync leads to your CRM </Card> </CardGroup> # Webhooks Source: https://docs.orbitforms.ai/integrations/webhooks Send form data to any endpoint <Note> Webhooks are a **Pro** plan feature. </Note> ## Start Here Webhooks let you send form submission data to any URL in real-time. This is perfect for building custom integrations, connecting to internal systems, or triggering complex automation workflows. This guide shows you how to set up and secure webhooks. ### Overview Here's the idea in plain terms: * You provide a **webhook URL** where OrbitForms should send data. * When someone submits a form, Orbit sends a **POST request** with the submission data. * Your server receives the data and processes it however you need. * We include authentication headers so you can verify requests are from Orbit. ### Why This Matters Webhooks give you complete flexibility. Connect to any backend, internal tool, or custom service — even systems we don't have native integrations for. They're perfect for developers who need full control over their data flow. *** ## Step 1: Create Your Webhook Endpoint First, set up a URL on your server that can receive POST requests. **What to do:** * Create an endpoint on your server that accepts POST requests. * The endpoint must be publicly accessible (not localhost). * The URL must use HTTPS for security. **What this does:** * Creates a destination for your form data. * Your server can then process, store, or forward the data as needed. <Warning> Your endpoint must respond with a 2xx status code (like 200) to confirm receipt. If it doesn't, we'll retry the webhook. </Warning> *** ## Step 2: Add the Webhook in Orbit Now configure OrbitForms to send data to your endpoint. **What to do in Orbit:** 1. Go to your form and click the **Integrations** tab. 2. Click **Add Integration** and select **Webhook**. 3. Enter your **Webhook URL** (must be HTTPS). 4. Optionally add authentication headers (see Authentication section below). 5. Click **Test Webhook** to verify it works. 6. Click **Save** to enable the webhook. *** ## Payload Format Webhooks send a POST request with a JSON body containing the form submission data. The example below shows the `submission.created` event: ```json theme={null} { "event": "submission.created", "timestamp": "2024-01-15T10:30:00Z", "data": { "form_id": "550e8400-e29b-41d4-a716-446655440000", "form_title": "Contact Form", "form_slug": "contact", "submission_id": "660e8400-e29b-41d4-a716-446655440001", "submission_data": { "email": "john@example.com", "name": "John Doe", "message": "Hello, I have a question..." }, "submitted_at": "2024-01-15T10:30:00Z", "metadata": { "referrer": "https://yoursite.com/contact", "device_type": "desktop", "utm_source": "google" } } } ``` <Tip> The `submission_data` object contains all form fields exactly as submitted. Field names match your form field labels. </Tip> ### Available Events You can subscribe a webhook to any of these events: | Event | When it fires | | ---------------------- | ----------------------------------- | | `submission.created` | A new form submission is received | | `submission.qualified` | A submission is marked as qualified | | `submission.updated` | A submission is updated | | `submission.deleted` | A submission is deleted | | `contact.created` | A new contact is created | | `contact.updated` | A contact is updated | | `contact.tag_added` | A tag is added to a contact | | `contact.tag_removed` | A tag is removed from a contact | | `contact.archived` | A contact is archived | *** ## Authentication Secure your webhook endpoint by adding authentication headers. We recommend using at least one of these methods: ### Bearer Token ``` Authorization: Bearer your-secret-token ``` ### API Key Header ``` X-API-Key: your-api-key ``` ### Webhook Signature Each webhook includes a signature header you can use to verify the request came from Orbit: ``` X-Orbit-Signature: sha256=... ``` *** ## Retry Logic If your webhook endpoint returns an error or doesn't respond, OrbitForms automatically retries up to **3 times** with exponential backoff and jitter: ### Retry Schedule | Retry | Approximate timing (default settings) | | --------- | ------------------------------------- | | 1st retry | \~1 minute after initial failure | | 2nd retry | \~2 minutes after 1st retry | | 3rd retry | \~4 minutes after 2nd retry | Notes on retry behavior: * **4xx responses are not retried** (except `429 Too Many Requests`, which is retried honoring the `Retry-After` header, capped at 5 minutes). * **5xx responses, network errors, and timeouts are retried.** * Retry count and delay are configurable per webhook (retries capped at 5, delay capped at 5 minutes). <Tip> If all retries fail, check your endpoint logs for errors. Common issues include timeouts, invalid responses, or authentication problems. </Tip> *** ## Common Issues and Fixes <AccordionGroup> <Accordion title="Webhook not receiving data"> * Verify your endpoint URL is correct and publicly accessible. * Check that your server is accepting POST requests. * Make sure your URL uses HTTPS (HTTP is not supported). </Accordion> <Accordion title="Webhook keeps retrying"> * Your endpoint must return a 2xx status code (like 200). * 5xx responses and timeouts trigger retries; 4xx responses (except 429) stop delivery immediately. * Check your server logs for errors processing the request. </Accordion> <Accordion title="Request timing out"> * Webhooks time out after 30 seconds by default (configurable up to 60 seconds per webhook). * Return a quick response, then process data asynchronously. * Avoid slow database queries or external API calls during the request. </Accordion> </AccordionGroup> ### Response Status Codes | Code | Meaning | | ---- | -------------------------------------------------------------------------------- | | 2xx | Success - submission delivered | | 4xx | Client error - will not retry (except 429, which retries honoring `Retry-After`) | | 5xx | Server error - will retry | *** ## Related Articles <CardGroup> <Card title="Zapier Integration" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/zapier.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=57b79caa02205dedaf6c8b879067976a" href="/integrations/zapier"> Connect to 5,000+ apps with no code </Card> <Card title="HubSpot Integration" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/HubSpot.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=1fdf3aa6d2c9545d9ce8348dfc8ed927" href="/integrations/hubspot"> Connect to HubSpot CRM </Card> <Card title="Workflow Features" icon="bolt" href="/guides/workflows"> Automate with built-in workflows </Card> <Card title="All Integrations" icon="webhook" href="/integrations"> Browse all available integrations </Card> </CardGroup> # Zapier Integration Source: https://docs.orbitforms.ai/integrations/zapier Connect to 5,000+ apps with no code <img alt="Zapier" /> ## Start Here Zapier lets you connect OrbitForms forms to thousands of apps without writing any code. When someone submits a form, Zapier automatically sends that data to other apps like Google Sheets, Slack, Mailchimp, or your CRM. This guide shows you how to set up your first Zap. ### Overview Here's the idea in plain terms: * You create a **Zap** in Zapier with OrbitForms as the trigger. * When someone submits a form, Zapier receives the data instantly. * Zapier then sends that data to your chosen destination apps (CRMs, spreadsheets, email tools, etc.). * You can add filters, transformations, and multiple actions in a single Zap. ### Why This Matters Zapier gives you flexibility to connect to apps we don't have native integrations for. With 5,000+ supported apps, you can automate almost any workflow — from adding leads to your CRM to sending welcome emails to notifying your team in Slack. *** ## Step 1: Get Your API Key First, you'll need your OrbitForms API key to connect Zapier to your account. **What to do:** 1. Log in to OrbitForms and click **API & Developers** in the left sidebar. 2. Open the **API Keys** page. 3. Create or copy your API key — you'll need this when connecting Zapier. **What this does:** * Allows Zapier to securely access your form submissions. * Your API key is unique to your team and should be kept private. *** ## Step 2: Create a Zap Now you'll create a Zap in Zapier with OrbitForms as the trigger. → [OrbitForms on Zapier](https://zapier.com/apps/orbit-ai-forms/integrations) **What to do in Zapier:** 1. Go to [zapier.com](https://zapier.com) and log in (or create a free account). 2. Click **Create Zap** or **+ Create**. 3. Search for **OrbitForms** or **Orbit Forms** as your trigger app. 4. Select **New Form Submission** as the trigger event. 5. Click **Connect** and paste your API key when prompted. *** ## Step 3: Select Your Form Choose which form should trigger this Zap and test the connection. **What to do:** 1. Select the form you want to use from the dropdown. 2. Click **Test Trigger** to pull in sample data. 3. Verify that your form fields appear in the test data. <Tip> If no test data appears, submit a test entry on your form first. Zapier needs at least one submission to display available fields. </Tip> *** ## Step 4: Add an Action Now add an action to send your form data to another app. **What to do:** 1. Click the **+** to add an action step. 2. Search for and select your destination app (e.g., Google Sheets, Slack, HubSpot). 3. Choose an action event (e.g., "Create Spreadsheet Row" or "Send Channel Message"). 4. Connect your account for that app. 5. Map your form fields to the destination fields. **What this does:** * Every form submission triggers the action in your destination app. * You can add multiple actions in a single Zap for complex workflows. *** ## Step 5: Test and Publish Test your Zap to make sure everything works, then turn it on. **Test checklist:** 1. Click **Test step** on your action to verify it works. 2. Check your destination app to confirm the data arrived correctly. 3. Click **Publish** to turn on your Zap. 4. Submit a real form entry to confirm the full flow works. <Note> **That's it!** Your Zap is now active. Every form submission will automatically trigger your workflow. Check Zapier's Task History to monitor runs. </Note> *** ## Native Integrations vs. Zapier We offer native integrations for popular apps. Use native integrations when available for faster sync and no extra costs. <CardGroup> <Card title="Use Native Integrations for:" icon="bolt"> * HubSpot, Salesforce, Slack, Google Sheets * Faster sync (no Zapier polling delay) * No Zapier task limits or extra costs </Card> <Card title="Use Zapier for:" icon="puzzle-piece"> * Apps we don't have native integrations for * Complex multi-step workflows * Connecting to niche or custom tools </Card> </CardGroup> *** ## Common Issues and Fixes <AccordionGroup> <Accordion title="Zap not triggering"> * Make sure your Zap is turned on (check the toggle). * Verify the form is correctly selected in the trigger. * Check Zapier's Task History to see if submissions are received. </Accordion> <Accordion title="Missing form fields in Zapier"> * Submit a test form first — Zapier needs sample data to display fields. * Click "Test Trigger" again to refresh the available fields. </Accordion> <Accordion title="Action step failing"> * Check the error message in Zapier's Task History. * Common causes: missing required fields, expired credentials, or rate limits. * Try re-connecting your destination app account. </Accordion> <Accordion title="Delayed Zap execution"> * Free Zapier plans poll every 15 minutes. * Upgrade to a paid Zapier plan for 1-2 minute polling. * For instant triggers, consider using our native integrations or webhooks. </Accordion> </AccordionGroup> *** ## Related Articles <CardGroup> <Card title="Webhooks" icon="webhook" href="/integrations/webhooks"> Send form data to any endpoint </Card> <Card title="HubSpot Integration" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/HubSpot.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=1fdf3aa6d2c9545d9ce8348dfc8ed927" href="/integrations/hubspot"> Connect to HubSpot CRM </Card> <Card title="Slack Integration" icon="https://mintcdn.com/orbitai-d647f397/T1yKN7sdBmMTM8cv/_images/integrations/slack.svg?fit=max&auto=format&n=T1yKN7sdBmMTM8cv&q=85&s=a3500e56190bcac222907b8e38a5f9c2" href="/integrations/slack"> Send notifications to Slack </Card> <Card title="All Integrations" icon="share-nodes" href="/integrations"> Browse all available integrations </Card> </CardGroup> # Zoom Source: https://docs.orbitforms.ai/integrations/zoom Auto-create Zoom meetings for scheduled bookings <img alt="Zoom" /> [Visit Zoom](https://zoom.us) Connect your Zoom account to automatically create Zoom meetings when someone books a meeting through your scheduling pages. Zoom is a **personal integration** — each team member connects their own Zoom account, and meetings are created using the host's connected account. <CardGroup> <Card title="Auto-Create" icon="video"> Zoom meetings are created automatically when bookings are made </Card> <Card title="Auto-Update" icon="arrows-rotate"> Meetings update automatically when bookings are rescheduled </Card> <Card title="Auto-Cancel" icon="trash"> Zoom meetings are deleted when bookings are cancelled </Card> </CardGroup> <Info> **Personal integration** — Zoom is connected per user, not per team. Each team member who hosts meetings with Zoom should connect their own account in the Email & Calendar settings. When a booking is made, the host's personal Zoom account is used to create the meeting. </Info> ## Prerequisites You'll need: * A Zoom account (Free, Pro, or Business) * Member access to your OrbitForms team * At least one scheduling page configured in OrbitForms ## Adding the App Follow these steps to connect your Zoom account to OrbitForms and start generating meetings automatically. <Steps> <Step title="Log in to OrbitForms"> Sign in to your [OrbitForms dashboard](https://orbitforms.ai/signin). You must be a member of the team where you want to use Zoom for scheduling. </Step> <Step title="Go to Email & Calendar settings"> Navigate to **Settings → Email & Calendar** in your OrbitForms dashboard. This is where all personal connections are managed, including email, calendar, and Zoom. </Step> <Step title="Click "Connect Zoom Account""> In the Zoom section, click **Connect Zoom Account**. You'll be redirected to Zoom's OAuth authorization page. </Step> <Step title="Authorize OrbitForms"> Sign in to your Zoom account and click **Allow** to grant OrbitForms permission to create and manage meetings on your behalf. OrbitForms will request the following permissions: * Create, view, and manage Zoom meetings on your behalf * Access your Zoom user profile information After authorizing, you'll be redirected back to OrbitForms automatically. </Step> <Step title="Set Zoom as your meeting location"> Open your scheduling page settings and set **Zoom** as the meeting location type. New bookings will now automatically generate Zoom meeting links using your connected account. </Step> <Step title="You're all set!"> Your Zoom account is now connected. When someone books a meeting through your scheduling pages, a Zoom meeting will be created automatically. Having trouble? See the [troubleshooting guide](#troubleshooting) below. </Step> </Steps> ## Usage Once Zoom is connected and set as the meeting location for a scheduling page, the entire meeting lifecycle is managed automatically. Below is a breakdown of each feature, when it applies, and what you need. ### Automatic Meeting Creation **Use case:** You want a unique Zoom meeting link generated every time someone books a meeting through your scheduling page, without any manual work. **How it works:** A Zoom meeting is automatically created using the host's connected Zoom account with the correct date, time, and duration. The join link is included in the calendar event and confirmation emails sent to both parties. **Prerequisites:** Zoom account connected · Scheduling page with "Zoom" as the meeting location ### Automatic Meeting Updates **Use case:** An attendee reschedules a booking and the Zoom meeting needs to reflect the new date and time, without creating a new link. **How it works:** When a booking is rescheduled, the existing Zoom meeting is updated with the new date and time. The same meeting link is preserved, so any links already shared remain valid. **Prerequisites:** Original booking must have been created with Zoom connected ### Automatic Meeting Cancellation **Use case:** A booking is cancelled and the Zoom meeting should be removed from the host's account to keep things clean and avoid confusion. **How it works:** When a booking is cancelled, the Zoom meeting is automatically deleted from the host's Zoom account. Attendees who try to join the old link will see that the meeting no longer exists. **Prerequisites:** Original booking must have been created with Zoom connected <Info> **Note for teams** — Each host's personal Zoom account is used to create meetings for their bookings. If a team member hasn't connected Zoom, their bookings will not generate Zoom meetings. Have each team member connect Zoom in their own **Settings → Email & Calendar** page. </Info> ## Removing the App You can disconnect Zoom from OrbitForms at any time. There are two ways to remove the integration depending on whether you want to disconnect from within OrbitForms or from your Zoom account directly. ### Option 1: Disconnect from OrbitForms <Steps> <Step title="Open settings"> Go to **Settings → Email & Calendar** in your OrbitForms dashboard. </Step> <Step title="Disconnect Zoom"> In the Zoom section, click **Disconnect** next to your connected Zoom account. </Step> <Step title="Confirm disconnection"> Confirm the disconnection. OrbitForms will revoke its access to your Zoom account and delete your stored Zoom OAuth tokens. </Step> </Steps> ### Option 2: Remove from your Zoom account <Steps> <Step title="Open Zoom Marketplace"> Sign in to the [Zoom App Marketplace](https://marketplace.zoom.us). </Step> <Step title="Find installed apps"> Click **Manage → Added Apps**, or navigate to the [Installed Apps](https://marketplace.zoom.us/user/installed) page. </Step> <Step title="Remove OrbitForms"> Find **OrbitForms** in the list and click **Remove**. </Step> </Steps> <Warning> **What happens when you disconnect:** * **New bookings will not generate Zoom meetings.** Any scheduling pages using Zoom as the meeting location will no longer create Zoom links for new bookings. * **Existing Zoom meetings are not affected.** Meetings already created in your Zoom account will remain and can still be joined. They are not deleted by disconnecting. * **Rescheduling and cancellation will not sync.** If you reschedule or cancel a booking that has an existing Zoom meeting, the Zoom meeting will no longer be updated or deleted automatically. </Warning> ### How we handle your data When you disconnect your Zoom account from OrbitForms, we take the following steps: * Your Zoom OAuth access and refresh tokens are permanently deleted from our systems * Your Zoom user ID and connection metadata are removed from your profile * OrbitForms can no longer access your Zoom account or create meetings on your behalf * Booking records in OrbitForms that reference Zoom meeting IDs are retained for your historical records, but OrbitForms will have no access to the meetings in Zoom If you wish to have all your data deleted entirely, including booking records, contact us at [support@orbitforms.ai](mailto:support@orbitforms.ai). ## Troubleshooting <AccordionGroup> <Accordion title="Token expired or connection lost"> If your Zoom OAuth token expires and cannot be auto-refreshed, go to Settings > Email & Calendar and click "Reconnect" next to your Zoom account. This will re-authorize your account and restore the connection. </Accordion> <Accordion title="Zoom meeting not created for a booking"> Verify that Zoom is set as the meeting location type in your scheduling page settings. Also check that your Zoom account is connected in Settings > Email & Calendar. If the issue persists, try disconnecting and reconnecting Zoom. </Accordion> <Accordion title="Meeting link not appearing in confirmation email"> The Zoom meeting link is generated when the booking is created. If the link is missing from the email, check that Zoom was connected before the booking was made. Bookings made before connecting Zoom will not have Zoom links. </Accordion> <Accordion title="Team member's bookings don't have Zoom links"> Each team member needs to connect their own Zoom account. Zoom is a personal integration — it's not shared across the team. Have the team member go to Settings > Email & Calendar and connect their Zoom account. </Accordion> </AccordionGroup> <Note> **Still need help?** Reach out to our support team at [support@orbitforms.ai](mailto:support@orbitforms.ai) or visit our [Help Center](/support). </Note> *** ## Ready to connect Zoom? Start creating Zoom meetings automatically for every booking. Connect your account in the Email & Calendar settings. [Go to Email & Calendar Settings →](https://orbitforms.ai/settings/email-calendar) # MCP Server Source: https://docs.orbitforms.ai/mcp/overview Connect AI assistants like Claude to your OrbitForms account using the Model Context Protocol (MCP). OrbitForms ships a built-in [Model Context Protocol](https://modelcontextprotocol.io) server, so AI assistants and agents can read and act on your contacts, forms, submissions, meetings, scheduling pages, email sequences, and webhooks — scoped to your team and gated by the same scopes and rate limits as the REST API. ## Endpoint ``` https://orbitforms.ai/api/mcp ``` The server uses the Streamable HTTP transport (the current MCP standard). SSE-only clients are not supported. ## Connect with OAuth (recommended) The server supports the full MCP authorization flow — OAuth 2.1 with PKCE, dynamic client registration, and automatic discovery. Add the connector and your client walks you through login and consent in the browser; no keys to copy, tokens refresh automatically, and you can revoke access at any time. <Tabs> <Tab title="Claude Code"> ```bash theme={null} claude mcp add --transport http orbit https://orbitforms.ai/api/mcp ``` Then run `/mcp` inside Claude Code and choose **Authenticate** — your browser opens to the OrbitForms consent screen. </Tab> <Tab title="Claude Desktop / claude.ai"> Add a custom connector with URL `https://orbitforms.ai/api/mcp` and click **Connect**. You'll be taken to OrbitForms to sign in, pick a team, and approve the requested scopes. </Tab> <Tab title="Cursor"> Add to `.cursor/mcp.json` — Cursor detects the OAuth server and prompts you to log in: ```json theme={null} { "mcpServers": { "orbit": { "url": "https://orbitforms.ai/api/mcp" } } } ``` </Tab> </Tabs> During consent you choose which team the assistant may access; every tool call is scoped to that team. Access is revocable from your account settings, and dynamically registered clients are limited to non-destructive scopes (no delete or team-management permissions). ## Connect with an API key For headless use — scripts, CI, server-side agents — authenticate with an OrbitForms API key instead, created in **Developer Portal → API Keys**. Pass it either way: ``` Authorization: Bearer sk_live_... ``` ``` X-API-Key: sk_live_... ``` For example, in Claude Code: ```bash theme={null} claude mcp add --transport http orbit https://orbitforms.ai/api/mcp \ --header "Authorization: Bearer sk_live_YOUR_KEY" ``` <Tip> If you use API keys, create a dedicated key for each assistant with only the scopes it needs — read-only scopes are a good default. You can revoke it any time from the Developer Portal without affecting other integrations. </Tip> ## Scopes Each tool requires a specific scope (for example `contacts:read` for `list_contacts`, `sequences:write` for `enroll_contacts_in_sequence`). With OAuth you approve scopes on the consent screen; with API keys you pick them at key creation. Calls made with a credential missing the scope return an `insufficient_scope` error naming the scope to add. All data access is scoped to the team that owns the credential. See [Available Tools](/mcp/tools) for the full tool list, required scopes, and the meeting-booking flow. # Available Tools Source: https://docs.orbitforms.ai/mcp/tools Every tool exposed by the OrbitForms MCP server, the scope each one requires, and how agents book meetings. ## Tools by area | Area | Tools | Required scope | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | | Contacts | `list_contacts`, `get_contact`, `create_contact`, `update_contact` | `contacts:read` / `contacts:write` | | Contact tags | `list_contact_tags`, `create_contact_tag`, `add_contact_tag`, `remove_contact_tag` | `contacts:read` / `contacts:write` | | Forms | `list_forms`, `get_form` | `forms:read` | | Submissions | `list_form_submissions` | `submissions:read` | | Meetings | `list_meetings`, `get_meeting`, `update_meeting` | `meetings:read` / `meetings:write` | | Scheduling | `list_scheduling_pages`, `get_scheduling_page`, `list_event_types`, `list_availability_schedules` | `scheduling:read` | | Booking | `get_available_slots`, `book_meeting` | `scheduling:read` / `meetings:write` | | Sequences | `list_sequences`, `get_sequence`, `list_sequence_steps`, `get_sequence_analytics`, `list_sequence_enrollments`, `list_sequence_unsubscribes` | `sequences:read` | | Sequences (write) | `enroll_contacts_in_sequence`, `add_sequence_unsubscribes` | `sequences:write` | | Webhooks | `list_webhooks`, `create_webhook` | `webhooks:read` / `webhooks:write` | Delete operations are intentionally not exposed over MCP. Use the [REST API](/developers/api/overview) if you need them. ## Booking a meeting An agent books a meeting in three steps: find the scheduling page and event type (`list_scheduling_pages` → `list_event_types`), fetch open slots for a date with `get_available_slots` (working hours intersected with the host's live calendar free/busy), then call `book_meeting` with one of the returned slots. Booking creates the meeting, sends calendar invites to both sides, and triggers configured workflows; a taken slot returns a `409` so the agent can pick another. The `team_id` on these calls is always derived from your API key server-side — it cannot be overridden. ## Rate limits & behavior MCP tool calls execute the corresponding `/api/v1` endpoints internally, so [REST API rate limits](/developers/api/rate-limits) apply unchanged. List tools return the same paginated envelope as the REST API (`data` plus `meta.total` / `meta.page` / `meta.total_pages`); pass `page` and `per_page` arguments to page through results. # Report a Bug Source: https://docs.orbitforms.ai/support/bug-report Found something that isn't working as expected? Let us know and we'll fix it. Found something that isn't working as expected? Let us know and we'll fix it. <Warning> The more detail you provide, the faster we can fix the issue. Screenshots and screen recordings are very helpful! </Warning> ## How to Submit a Bug Report To report a bug, use the [bug report form](https://orbitforms.ai/support/bug-report) on our website, or email [support@orbitforms.ai](mailto:support@orbitforms.ai) with the following information. <Steps> <Step title="Your Email"> Provide your email address so we can follow up with questions if needed. </Step> <Step title="Severity"> Select the severity level that best describes the issue: * **Critical** - App is unusable * **Major** - Feature is broken * **Minor** - Small issue * **Cosmetic** - Visual only </Step> <Step title="Area"> Tell us where you encountered the bug: * Form Editor * Public Form View * Dashboard * Submissions * Integrations * Settings * Login/Signup * Other </Step> <Step title="Bug Description"> Describe the bug in detail. Include what you were doing, what you expected to happen, and what actually happened. </Step> <Step title="Screenshot (optional)"> Upload a screenshot showing the issue. Accepted formats: PNG, JPG, GIF, WebP (up to 5MB). </Step> <Step title="Screen Recording URL (optional)"> Use Loom, CleanShot, or any screen recording tool and paste the link here. </Step> </Steps> <Tip> After submitting your report, our team will investigate and follow up if needed. Thank you for helping us improve OrbitForms! </Tip> # Contact Us Source: https://docs.orbitforms.ai/support/contact Have a question or need help? Reach out to the OrbitForms support team. Have a question or need help? Use our [contact form](https://orbitforms.ai/support/contact) or email us and we'll get back to you as soon as possible. ## Contact Methods <CardGroup> <Card title="Email" icon="envelope"> [support@orbitforms.ai](mailto:support@orbitforms.ai) </Card> <Card title="Hours" icon="clock"> Mon-Fri, 9am-6pm EST </Card> <Card title="Response Time" icon="reply"> Within 24 hours </Card> </CardGroup> ## Contact Form The [contact form](https://orbitforms.ai/support/contact) asks for the following information (you can also email [support@orbitforms.ai](mailto:support@orbitforms.ai) directly with the same details): <Steps> <Step title="Your Name"> Include your full name so we can address you properly. </Step> <Step title="Email Address"> Provide your email address so we can respond to you. </Step> <Step title="Subject"> Select the topic that best describes your inquiry: * **General Question** * **Technical Support** * **Billing & Account** * **Feature Request** * **Bug Report** * **Other** </Step> <Step title="Message"> Describe your question or issue in detail. </Step> </Steps> <Info> We've received your message and will get back to you within 24 hours. </Info> # Frequently Asked Questions Source: https://docs.orbitforms.ai/support/faq Find answers to common questions about OrbitForms. Find answers to common questions about OrbitForms. Can't find what you're looking for? [Contact our support team](/support/contact). ## Getting Started <AccordionGroup> <Accordion title="How do I create my first form?"> Navigate to your dashboard and click "Create Form". Choose between a Standard Form or Flow Form, give it a name, and start adding fields. You can publish your form immediately or save it as a draft. </Accordion> <Accordion title="What's the difference between Standard Forms and Flow Forms?"> Standard Forms display all fields at once on a single page. Flow Forms present one question at a time, creating a conversational experience. </Accordion> <Accordion title="Can I try OrbitForms for free?"> Yes! New teams start with a 7-day free trial of a paid plan, which includes full access to that plan's features. A credit card is required at signup, and you won't be charged if you cancel before the trial ends. </Accordion> </AccordionGroup> ## Forms & Fields <AccordionGroup> <Accordion title="What field types are available?"> OrbitForms supports text, email, phone, number, textarea, dropdown, radio buttons, checkboxes, date picker, file upload, rating, and more. Each field type has customizable validation options. </Accordion> <Accordion title="Can I add conditional logic to my forms?"> Yes! You can show or hide fields based on previous answers. This is available on all plans and works with both Standard and Flow Forms. </Accordion> <Accordion title="How do I customize the look of my form?"> Go to the Styling tab in the form editor. You can customize colors, fonts, backgrounds, button styles, and more. Pro plans include access to custom CSS for complete control. </Accordion> </AccordionGroup> ## Submissions & Data <AccordionGroup> <Accordion title="How do I view form submissions?"> Click on any form in your dashboard, then navigate to the Submissions tab. You'll see all responses with the ability to search, filter, and export data. </Accordion> <Accordion title="Can I export my data?"> Yes! You can export submissions as CSV from the Submissions page. For Pro users, you can also set up automatic exports via webhooks or integrations. </Accordion> <Accordion title="How long is data retained?"> We retain submission data indefinitely on all plans. You can delete individual submissions or entire forms at any time. </Accordion> </AccordionGroup> ## Sharing & Embedding <AccordionGroup> <Accordion title="How do I share my form?"> Each form gets a unique shareable link. You can also embed forms on your website using our embed code, or integrate with platforms like WordPress, Webflow, and more. </Accordion> <Accordion title="Can I use a custom domain?"> Yes! The Advanced plan includes custom domain support. You can host forms on forms.yourdomain.com or any subdomain you choose. </Accordion> <Accordion title="Is the embed code responsive?"> Absolutely. Our embed automatically adapts to any container size and works great on mobile devices. </Accordion> </AccordionGroup> ## Integrations <AccordionGroup> <Accordion title="What integrations are available?"> We integrate with popular tools like Zapier, Slack, HubSpot, Salesforce, Google Sheets, Notion, and many more. You can also use webhooks for custom integrations. </Accordion> <Accordion title="How do webhooks work?"> Webhooks send real-time data to your server whenever a form is submitted. You can configure multiple webhooks per form with custom headers and payload formats. </Accordion> <Accordion title="Can I integrate with my CRM?"> Yes! We have native integrations with HubSpot and Salesforce. For other CRMs, you can use Zapier or our webhook functionality. </Accordion> </AccordionGroup> ## Account & Billing <AccordionGroup> <Accordion title="How do I upgrade my plan?"> Go to the Billing page in your dashboard. You can upgrade, downgrade, or cancel your subscription at any time. </Accordion> <Accordion title="What happens if I exceed my plan limits?"> We'll notify you before you hit your limits. If you reach your monthly response limit, your forms stop collecting new responses — visitors see a message that the form is no longer collecting responses. Upgrade your plan to resume immediately, or wait until the next billing period when your limit resets. </Accordion> <Accordion title="Do you offer refunds?"> Monthly subscriptions are non-refundable. For annual subscriptions cancelled within the first 14 days of the initial purchase or renewal, you can request a pro-rated refund for the unused portion — contact support and we'll process your request. </Accordion> </AccordionGroup> # Feature Request Source: https://docs.orbitforms.ai/support/feature-request Have an idea that would make OrbitForms better? We'd love to hear it! Have an idea that would make OrbitForms better? We'd love to hear it! <Info> We prioritize features based on user demand. The more detail you provide about your use case, the better we can understand your needs. </Info> ## How to Submit a Feature Request To suggest a new feature, use the [feature request form](https://orbitforms.ai/support/feature-request) on our website, or email [support@orbitforms.ai](mailto:support@orbitforms.ai) with the following information. <Steps> <Step title="Your Email"> Provide your email address so we can update you on the status of your request. </Step> <Step title="Category"> Select the category that best fits your feature idea: * Form Builder * Field Types * Styling & Design * Integrations * Analytics & Reporting * Team & Collaboration * Mobile Experience * AI Features * Other </Step> <Step title="Feature Title"> A short, descriptive title for the feature. </Step> <Step title="Description"> Describe the feature in detail. What would it do? How would it work? </Step> <Step title="Your Use Case"> How would this feature help you? What problem does it solve? </Step> </Steps> <Tip> Thank you for your suggestion! We review every request and consider them for our roadmap. </Tip> # Help Center Source: https://docs.orbitforms.ai/support/help-center Get support and find resources to help you get the most out of OrbitForms. We're here to help you get the most out of OrbitForms. Choose how you'd like to get support. ## Support at a Glance | Metric | Value | | ------------- | ---------- | | Avg. Response | \< 4 hours | | Satisfaction | 98% | | Uptime | 99.99% | ## Get Support <CardGroup> <Card title="Email Support" icon="envelope" href="mailto:support@orbitforms.ai"> Send us a detailed message and we'll get back to you within 24 hours — typically within 4 hours during business hours (Mon-Fri, 9am-6pm EST). **Fastest way to get help** </Card> <Card title="FAQ" icon="help-circle" href="/support/faq"> Find answers to commonly asked questions about OrbitForms. </Card> </CardGroup> ## Quick Links <CardGroup> <Card title="Documentation" icon="book" href="/"> Technical documentation and API reference </Card> <Card title="User Guide" icon="zap" href="/getting-started/welcome"> Step-by-step tutorials for getting started </Card> <Card title="Report a Bug" icon="bug" href="/support/bug-report"> Let us know if something isn't working </Card> <Card title="Feature Request" icon="lightbulb" href="/support/feature-request"> Suggest new features or improvements </Card> </CardGroup> ## Need something else? Our team is available Monday through Friday, 9am–6pm EST. We typically reply within 4 hours during business hours. **Email:** [support@orbitforms.ai](mailto:support@orbitforms.ai)