Virtual booths fail when platforms treat them like microsites. A logo, a PDF wall, a “Contact us” form, and a hope that someone follows up later.
InEvent treats the expo hall as a revenue system. Every visit creates structured telemetry. Every click can trigger a qualification action. Every “I’m Interested” becomes a CRM object that routes to the right owner, in the right campaign, with the right score, within seconds.
This page explains how InEvent builds that system end to end: traffic - Engagement - Conversion, backed by InEvent Sponsor-Connect, the InEvent Lead-Gen Pipeline, and the InEvent Traffic Router.
A sponsor does not buy a booth. They buy outcomes:
Qualified contacts (not anonymous “views”)
Attribution (what drove the lead)
Routing (who follows up and when)
Evidence (engagement depth that correlates with purchase intent)
So InEvent models a booth as a pipeline node with:
Identity: who visited (anonymous first, identified later)
Intent: what they did (asset click, chat, meeting request, demo watch)
Context: why they arrived (sponsored session, push, agenda link, UTM)
Conversion: what records InEvent created in CRM (Lead/Contact + Campaign Member + Activities)
Feedback loop: whether sales touched the record and whether the lead progressed
That requires two things most platforms avoid:
A real-time event stream (engagement telemetry)
A real-time integration layer (CRM writes with mapping and idempotency)
That is what the InEvent Lead-Gen Pipeline implements.
InEvent does not treat traffic as a counter. InEvent treats traffic as a stream of events that InEvent Traffic Router tags, routes, and attributes.
When an attendee lands in the digital expo hall, the router assigns:
event_id
attendee_id (or anonymous_id until authenticated)
booth_id
source (expo hall grid, agenda, sponsored session, push notification, email deep link)
campaign_tag (sponsor-defined taxonomy)
utm_* (if present)
timestamp (server-side)
Then InEvent emits standardized events:
booth.view
booth.dwell_tick
asset.click
video.play / video.progress / video.complete
chat.open / chat.message_sent
cta.click (for “I’m Interested”, “Book meeting”, “Request pricing”)
meeting.requested
lead.submitted
lead.pushed_to_crm
This is what enables Event ROI Analytics that can stand in front of finance.
Most platforms compute dwell time as “time between page open and close.” That inflates numbers.
InEvent uses engagement-based measurement:
The client sends a heartbeat booth.dwell_tick every N seconds only if:
the booth tab stays visible, and
the user shows activity (scroll, pointer movement, video progress, asset interaction), and
the network round trip succeeds (to prevent local-only inflation)
This makes dwell time defensible as sponsor evidence.
A booth becomes monetizable when engagement turns into structured data.
InEvent captures engagement at three layers:
UI interactions (clicks, opens, downloads)
Media signals (watch time, completion, rewind, mute state)
Conversation signals (chat opens, messages, agent response time)
Each signal writes to the analytics layer and can trigger conversion logic.
The “Digital Handshake” is the moment the attendee crosses from passive browsing to explicit intent.
The classic trigger is a CTA such as:
“I’m Interested”
“Request demo”
“Talk to sales”
“Book a meeting”
“Send me pricing”
In InEvent, that click does not just store a form submission. It triggers InEvent Sponsor-Connect, which triggers a webhook, which triggers CRM writes through the InEvent Lead-Gen Pipeline.
The attendee clicks CTA inside the booth container.
The booth front-end calls the InEvent API:
POST /v1/booths/{booth_id}/cta/{cta_id}/submit
The API validates:
attendee session token
event permissions
booth entitlement (sponsor rules)
The API creates a Lead Intent record:
ties attendee_id to booth_id to cta_id
stamps attribution: source, utm, session_id
The API emits an internal event:
lead.intent.created
The integration worker consumes that event and performs:
enrichment + mapping
scoring
dedupe
CRM write
The system calls sponsor webhook endpoints:
optionally before CRM write (for immediate custom handling)
always after CRM write (for confirmation + IDs)
{
"event": "lead.intent.created",
"event_id": "evt_9c3b...",
"booth_id": "booth_41a1...",
"sponsor_account_id": "sp_02d9...",
"attendee": {
"attendee_id": "att_18fe...",
"first_name": "Amina",
"last_name": "K.",
"email": "amina@example.com",
"job_title": "Procurement Lead",
"company": "NorthBridge Logistics",
"country": "GH",
"linkedin_url": "https://www.linkedin.com/in/...",
"phone": "+233...",
"consents": {
"marketing_opt_in": true,
"terms_accepted": true,
"timestamp": "2026-02-10T13:44:20Z"
}
},
"context": {
"source": "sponsored_session",
"session_id": "sess_7a22...",
"utm": {
"utm_source": "agenda",
"utm_medium": "inapp",
"utm_campaign": "gold_sponsor_push_1"
}
},
"engagement_snapshot": {
"booth_dwell_seconds": 312,
"assets_clicked": [
{ "asset_id": "pdf_11", "name": "Pricing Sheet", "clicks": 1 }
],
"video_watch_seconds": 94,
"chat_opened": true,
"messages_sent": 2
},
"idempotency_key": "leadintent_att_18fe_booth_41a1_cta_01"
}
This payload carries enough signal for real qualification decisions without waiting for a post-event export.
Pushing leads into Salesforce, HubSpot, or Marketo is easy if you accept garbage.
Sponsors do not accept garbage. They want:
Correct objects
Correct field mapping
Correct ownership
Correct campaign membership
Correct dedupe behavior
Correct consent handling
Correct attribution
The InEvent Lead-Gen Pipeline implements these requirements as a deterministic pipeline.
Normalize
Standardize email casing, phone formats, country codes
Validate required fields per sponsor rules
Enrich
Attach engagement snapshot
Attach traffic source and session linkage
Dedupe
Decide whether to create or update
Use sponsor-defined keys (email, CRM external ID, domain + name heuristics)
Score
Apply sponsor scoring model
Map
Map fields to CRM object schema
Write
Perform API writes with idempotency
Confirm
Persist CRM IDs back into InEvent
Fire confirmation webhooks
Real-time systems create duplicates when:
the user clicks twice,
mobile reconnects and retries,
the worker reprocesses after a timeout.
InEvent uses idempotency keys and sponsor-defined dedupe keys.
Idempotency: the same (attendee_id, booth_id, cta_id) yields one lead intent and one CRM transaction.
Dedupe: the pipeline checks CRM by:
email exact match, then
external ID match (if sponsor supplies it), then
fallback match rules (configurable)
The pipeline stores a transaction record:
idempotency_key
crm_system
crm_object_ids
status
attempt_count
last_error
So a retry updates the same transaction rather than creating a new one.
Most “integrations” push a Lead and stop.
Sponsors want reporting inside Salesforce that matches budget lines:
“How many leads did Gold Sponsor booth generate?”
“Which sponsored session produced pipeline?”
“Which asset produced the highest SQL rate?”
That requires the right Salesforce objects.
InEvent writes:
Lead or Contact (depending on sponsor rules)
Campaign (optional: reuse existing campaign)
Campaign Member (required for attribution)
Task / Activity (optional: represent key engagement actions)
Campaign Member is the backbone. InEvent maps booth activity to a specific Campaign and sets:
CampaignMember.Status (e.g., Interested, Meeting Requested, Attended Demo)
custom fields for:
booth ID
session ID
traffic source
score
top asset clicked
watch time
Lead fields:
FirstName, LastName, Email, Title, Company
LeadSource = "InEvent Virtual Booth"
InEvent_Booth_ID__c
InEvent_Engagement_Score__c
Campaign Member fields:
CampaignId (mapped to sponsor campaign)
LeadId or ContactId
Status
InEvent_Session_ID__c
InEvent_Traffic_Source__c
InEvent_UTM_Campaign__c
This is what you referenced in the InEvent Launches Integration with HubSpot CRM and Salesforce capabilities narrative: InEvent maps engagement into CRM reporting primitives instead of pushing a flat CSV.
InEvent can set owner via sponsor rules:
round-robin by region
assign by account list (ABM)
assign by product interest (CTA-level routing)
assign by the existing Contact owner if dedupe matched
If the sponsor uses Salesforce assignment rules, InEvent can:
write with a specific integration user and let SFDC rules apply, or
Pre-assign owner fields when the sponsor wants deterministic routing.