A form on your website is filled out — and the data sits in Jotform. A manager opens the Jotform table, copies the name, email, and phone number, then pastes it into Kommo by hand. With 20+ submissions per day, that amounts to several hours of wasted time per week, plus copy-paste errors. A Jotform -> Kommo webhook integration creates a lead in the CRM the moment a form is submitted — with full field mapping, attachments, and routing to the correct pipeline.
Why Jotform’s native integration is not enough
Jotform has built-in integrations with several CRMs. There is no official connector for Kommo (amoCRM) — only workarounds through Zapier or Make. These solutions create a lead but do not pass:
- File attachments (Jotform delivers a file URL, not binary data — additional processing is required)
- Conditional routing to pipelines based on form responses
- Contact deduplication (a repeat submission from the same email creates a duplicate)
- Kommo custom fields that require a numeric field ID
A webhook integration resolves these limitations.
How Jotform Webhooks work
Jotform sends a POST request to a specified URL on every form submission. Setup: Form Builder -> Settings -> Integrations -> Webhooks.
The payload contains all form fields in the format:
{
"rawRequest": {
"q1_firstName": "John",
"q2_lastName": "Smith",
"q3_email[0]": "john@company.com",
"q4_phone[full]": "+1 234 567 8901",
"q5_company": "Acme Corp",
"q6_service": "CRM Integration",
"q7_budget": "5000-10000",
"q8_file": "https://www.jotform.com/uploads/.../brief.pdf"
},
"formID": "240123456789",
"submissionID": "5847291034"
}
Field IDs (q1_, q2_, etc.) are set in the form settings. It is worth defining them explicitly during form development — it makes the mapping more readable.
Jotform -> Kommo field mapping
Each Jotform field maps to a standard or custom Kommo field:
| Jotform field | Kommo field | Kommo type |
|---|---|---|
| q1_firstName + q2_lastName | contact.name | Standard |
| q3_email | contact.email (field_id: 264) | Multi-field |
| q4_phone | contact.phone (field_id: 265) | Multi-field |
| q5_company | contact.company_name | Standard |
| q6_service | lead.name | Standard |
| q7_budget | custom_field_id: 1234 | Text/List |
| q8_file | note on the lead (file link) | Note |
Kommo custom fields require a numeric field_id — you can obtain it via GET /api/v4/leads/custom_fields.
Pipeline routing
A company may use multiple pipelines in Kommo: “New Clients”, “Partners”, “Repeat Sales”. Jotform lets you create separate forms for different segments, or use a single form with a routing field.
def route_to_pipeline(form_data: dict) -> tuple[int, int]:
service = form_data.get("q6_service", "")
budget = form_data.get("q7_budget", "")
if "partnership" in service.lower():
return PIPELINE_PARTNERS, STATUS_NEW_PARTNER
elif budget in ["50000+", "20000-50000"]:
return PIPELINE_ENTERPRISE, STATUS_QUALIFICATION
else:
return PIPELINE_SMB, STATUS_NEW_LEAD
The routing trigger is the value of a specific form field. This is not available in Zapier without a paid plan and conditional logic.
Handling attachments
Jotform passes the file URL, not the file contents. To make the file appear in Kommo:
import requests
def attach_file_to_lead(lead_id: int, file_url: str, filename: str):
# Download the file from Jotform
response = requests.get(file_url)
file_content = response.content
# Upload to Kommo as an attachment on the lead
kommo.leads.notes.create(
lead_id=lead_id,
note_type="file",
attachment={
"filename": filename,
"content": base64.b64encode(file_content).decode()
}
)
Important: Jotform files are only accessible via URL for a limited time (typically 7 days). Download and upload to Kommo immediately upon receiving the webhook.
Contact deduplication
If a client submits a form again, there is no need to create a second contact in Kommo. The correct logic:
def find_or_create_contact(email: str, name: str) -> int:
# Search for an existing contact
contacts = kommo.contacts.search(query=email)
if contacts:
return contacts[0].id
# Create a new one
contact = kommo.contacts.create(name=name, email=email)
return contact.id
Search by email -> if found, attach the new lead to the existing contact. The history of repeat submissions is preserved on a single contact.
Real-world case
An education company (3 forms: consultation, corporate training, partnership):
- Before integration: a manager checked Jotform three times a day and manually transferred submissions. Delay up to 4 hours. With 40+ submissions per week — 3–4 hours of manual work.
- After: webhook -> lead in the correct Kommo pipeline within 2–3 seconds of form submission. Routing: “partnership” -> partners pipeline, budget 20k+ -> Enterprise pipeline, everything else -> SMB.
- Result: zero lead delay. The brief (PDF from the form) is automatically attached to the lead — the manager opens the card and immediately sees the full context.
Who this is relevant for
Kommo + Jotform integration makes sense if:
— The primary lead source is forms on a website or landing pages (Jotform or similar)
— There are multiple submission types with different CRM routing
— Clients attach files (brief, spec, documents) with their submission
— Deduplication is needed for repeat inquiries
Similar logic works with Typeform — it has its own integration specifics with HubSpot, covered in the article on Typeform + HubSpot. The webhook -> CRM principle is universal; only the payload structure and destination API change.
Frequently asked questions
Jotform has a native amoCRM integration — doesn’t it work?
Jotform integrates with amoCRM (Kommo) through third-party connectors. Native support is limited: only basic fields are passed, there is no pipeline routing, and attachments are not handled. For simple forms (name + email + phone) the connector works. For forms with conditional logic and files — it does not.
How do I update an existing lead on a repeat submission?
When a contact is found by email, you can create a new lead and link it to the existing contact — the full history of submissions is then visible. Alternatively, update the current lead if your business logic allows only one active deal per contact. The choice depends on your sales process.
What if Jotform changes the webhook payload structure?
Keep field mapping separate from business logic. Any form change (adding a field, changing order) should not break the integration. Log the full payload of every webhook — this simplifies debugging when the form changes.
Can multiple Jotform forms be integrated into one Kommo pipeline?
Yes. Set up a single webhook endpoint that accepts all forms. The form can be identified by formID in the payload — apply the appropriate field mapping for each. One entry point, multiple sources.
How long does development take?
A simple integration (one form, basic fields) — 1 week. With pipeline routing, attachment handling, and deduplication — 2–3 weeks.
Summary
- Jotform webhook -> Kommo: submission lands in the CRM within 2–3 seconds without manual entry
- Custom field mapping, pipeline routing, and attachments are what the Zapier connector lacks
- Email deduplication is mandatory — otherwise repeat submissions create duplicate contacts
- Jotform files must be downloaded immediately upon webhook receipt — the URL is only available for a limited time
- Typical development timeline — 2–3 weeks
If you use Jotform to collect submissions and spend time manually transferring data into Kommo — describe the structure of your forms and submission routing logic. Exceltic.dev will review the mapping and propose an integration scheme.