CRM Campaign landing pages
Audience: Sales ops and marketing users in Aventora CRM who run paid ads or QR-based lead capture.
Goal: Create a campaign with a unique Hub URL and QR code, collect leads on a branded form, and either auto-start Aventora engagement or tag leads for later workflows.
Source of truth: Campaign configuration and metrics live in Engagement Hub. The CRM Campaigns UI stays and talks to Hub (GraphQL proxy) when AVENTORA_API_KEY + AVENTORA_BASE_URL are set. You can also manage campaigns from Engagement Hub → Campaigns. See Hub Campaigns.
Related: Hub campaigns, Ad campaigns → engagement (Path D below), CRM complete guide, Engagement Hub Start API.
Where to configure
- Open Aventora CRM (or Engagement Hub → Campaigns).
- In the left navigation (Sales Cockpit section), open Campaigns (
/campaigns). - Use the campaign list to search and filter by status. Click a row to open the campaign detail page.
- Click New campaign to choose an industry template or Start from blank, adjust copy and options, then save.
- On the campaign detail page, use Activate when ready. Use Edit to change copy, intent options, landing appearance, or post-submit behavior.
CRM still owns Person attribution (campaignId, leadIntent, marketing consent), the campaign detail Leads table (People with that campaignId), the Campaign Leads People view, and CAMPAIGN_LEAD_SUBMITTED when Hub syncs a lead into CRM. Hub stores its own submission log separately; CRM Leads does not read Hub lead rows.
Campaign list and detail pages
| Screen | URL | Purpose |
|---|---|---|
| List | /campaigns | All campaigns in a table (name, status, visits, submissions, unique leads, last lead, post-submit mode, updated). Search and filter by status. |
| New | /campaigns/new | Template picker, then create form. After save, opens the new campaign detail page. |
| Detail | /campaigns/{id} | Read-only overview (including copyable Campaign ID), metrics, leads table, landing URL, QR code, lead capture settings. Header actions: Edit, Copy link, Activate / Pause, Delete. |
| Edit | /campaigns/{id}/edit | Full edit form (same fields as create). Save returns to the detail page. |
Industry campaign templates
When you click New campaign, CRM shows templates matched to your workspace industry preset (from onboarding). Templates pre-fill name, headline, description, interest options, post-submit behavior, and auto-engage settings — you can edit everything before saving.
| Industry preset | Example templates |
|---|---|
| Real Estate | Open house registration, Half commission listing, Buyer lead capture, Home valuation request |
| Insurance | Insurance quote request, Policy review offer, Referral lead capture |
| Mortgage | Pre-approval lead, Rate quote request, Refinance inquiry |
| Financial Advisor | Retirement planning consultation, Portfolio review offer, Wealth planning lead |
| Other / Generic | General lead capture, Book a consultation, Contact us |
Choose Start from blank for an empty form with generic defaults. Created campaigns store an optional presetKey when started from a template (for your reference in CRM data).
Each active campaign shows:
- Landing URL —
{AVENTORA_BASE_URL}/campaign/{token}(same Hub base URL already set on the CRM server for engagements) - QR code — encodes the same URL for print/ads
Append ad attribution query params when sharing the link, for example:
?utm_source=meta&utm_campaign=spring&email=lead@example.com
Supported pre-fill params (when present in the URL) include email, phone, firstName, lastName, and standard UTM / click IDs.
Interest dropdown (optional)
In Campaigns → New or Campaigns → Edit (detail page → Edit), use Ask what they are interested in:
| Setting | Landing page behavior |
|---|---|
| Checked | Shows What are you interested in? with card-style selectable options (label = visitor text, value = stored on Person as leadIntent). Use Add option / Remove to edit the list. |
| Unchecked | No dropdown — only name and contact fields are collected. |
If you leave the checkbox on and do not customize options, defaults are Get a quote, Book a call, and Learn more.
Landing page appearance
In Campaigns → New or Campaigns → Edit, use Landing page appearance to customize the public Hub form:
| Setting | Landing page behavior |
|---|---|
| Submit button label | Text on the submit button (default Submit). |
| Intent question label | Label above the interest dropdown when enabled (default What are you interested in?). |
| Primary accent color | Hex color for the submit button, intent selection highlight, and field focus rings (default Aventora blue #2563eb). |
Branding on the landing page
The Hub landing page header uses your workspace branding automatically:
| Element | Source |
|---|---|
| Organization name | CRM workspace display name (header and browser tab suffix). |
| Logo | Domain Assistant logo for your assigned domain when configured; otherwise the CRM workspace logo. |
| Browser favicon | Aventora favicon (not tenant-specific). |
| Page headline | Campaign headline (internal campaign name is not shown to visitors). |
Required fields
Visitors must complete:
- First name and last name
- Channel-based contact field (from the campaign’s engagement Channel, also returned on the public config as
engagementChannel):- Phone or SMS → phone is required; email is optional
- Email → email is required; phone is optional
- Marketing consent checkbox (opt-in to receive messages including marketing communications). Stored on the Person as
marketingConsent/marketingConsentAt. - Interest selection when the dropdown is enabled and the campaign is Active
DRAFT and PAUSED campaigns show a preview banner; the submit button stays disabled until you Activate the campaign.
When Auto-start Aventora engagement is selected in Campaigns → New or Edit, configure:
| Setting | Purpose |
|---|---|
| Engagement type | Hub call type: Informational, Confirmational, Conversational, or Appointment Booking |
| Channel | Phone, SMS, or Email (email only when type is Informational) |
| Cockpit action type | Maps to Sales Cockpit action (for example CALL_LEAD, SEND_FOLLOW_UP) |
| Engagement instruction | Prompt sent to Hub for the auto-started engagement |
Delete a campaign
On the campaign detail page, use Delete to permanently remove a campaign with zero captured leads. You must type the campaign name to confirm. The public landing link stops working immediately after delete.
| Condition | Delete behavior |
|---|---|
leadCount = 0 | Delete is enabled; confirmation modal required |
leadCount > 0 | Delete is disabled — use Pause to stop new submissions while keeping lead history |
Captured leads remain on Person records even if you could delete (they are not removed). Campaigns with leads cannot be deleted so attribution history stays intact.
Public link abuse protection
Campaign landing links are public. CRM and Hub apply IP-based rate limits per campaign token (no captcha on the form):
| Action | Default limit (per IP + token, per hour) |
|---|---|
| Load landing page / config | 120 requests |
| Submit lead form | 5 requests |
When a limit is exceeded, visitors see Too many requests from your network. Please try again later. (HTTP 429). A hidden honeypot field still blocks naive bots.
CRM env (optional tuning): CAMPAIGN_PUBLIC_GET_THROTTLE_LIMIT, CAMPAIGN_PUBLIC_GET_THROTTLE_TTL_IN_MS, CAMPAIGN_PUBLIC_SUBMIT_THROTTLE_LIMIT, CAMPAIGN_PUBLIC_SUBMIT_THROTTLE_TTL_IN_MS
Hub env (optional tuning): CAMPAIGN_LANDING_GET_RATE_LIMIT, CAMPAIGN_LANDING_GET_RATE_WINDOW_SECONDS, CAMPAIGN_LANDING_SUBMIT_RATE_LIMIT, CAMPAIGN_LANDING_SUBMIT_RATE_WINDOW_SECONDS
Post-submit modes
| Mode | Behavior |
|---|---|
| Tag only | Creates or updates a Person with campaignId, source, leadIntent, and marketing consent fields. Sets Person Created by / Updated by to the campaign name. Ingests a Sales Cockpit signal (CAMPAIGN_LEAD_SUBMITTED). Use the detail-page Leads table or the Campaign Leads People view for follow-up. |
| Auto-start Aventora engagement | Same Person write, then starts a single Hub engagement using your configured engagement type, channel, cockpit action type, and instruction. When the visitor selected an interest option, CRM appends The lead selected: {label}. to the engagement instruction so Hub greetings reflect their choice (for example Request a call vs Learn more). When you pick a channel or type in the campaign editor, those values are used even if the cockpit action’s default mapping is different. Respects Do not contact. |
How interest selection affects outbound messages
| Step | What happens |
|---|---|
| Form submit | Hub POSTs the intent value (for example REQUEST_CALL) to CRM. |
| Person record | CRM stores the value on leadIntent (custom Person field). The display label (for example Request a call) comes from the campaign’s intentOptions. |
| Tag only | No outbound message. Intent is available on the Person and in the CAMPAIGN_LEAD_SUBMITTED signal payload for Sales Cockpit workflows. |
| Auto-start engagement | CRM sends Hub an instruction built from your campaign Engagement instruction plus The lead selected: {label}. Hub’s greeting service expands that combined instruction into the SMS, email, or call opening. |
Manual engagements started later from Sales Cockpit use the instruction you enter there — they do not automatically re-read leadIntent unless you reference it in your prompt.
Prerequisites
| Requirement | Why |
|---|---|
Engagement Hub connected (AVENTORA_API_KEY in CRM workspace settings) | Auto-engage and Hub landing page |
| At least one workspace member with Settings → Profile → Engagement callback number set | Auto-engage runs without a logged-in user; CRM uses the first valid callback number on the workspace |
AVENTORA_BASE_URL (CRM server, already required for Hub integration) and TWENTY_BASE_URL or CRM_API_URL (Hub server) | Campaign landing links and Hub → CRM submit |
| CRM Sync (for engagement timeline on Person) | Optional but recommended for auto-engage |
Campaign metrics
| Metric | Meaning |
|---|---|
Visits (visitCount) | Landing page loads recorded by Hub (including DRAFT/PAUSED previews). Not unique visitors. |
Submissions (leadCount) | Successful form submits (including re-submits by the same person). Still used for the delete guard. |
Unique leads (uniqueLeadCount) | Times a Person was newly attributed to this campaign (new Person, or existing Person whose campaignId was not already this campaign). |
Campaigns created before analytics tracking show Visits and Unique leads as blank (not 0), since that history was never captured. They begin counting from the first visit or submit after tracking is live. Submissions is always populated.
The detail page Leads table lists People currently linked via campaignId (live query). Copy Campaign ID from Overview to filter People → Campaign Id Contains that UUID. New submits also set Person Created by / Updated by to the campaign name so you can filter Created by Contains the campaign name.
Public API (integrators)
Hub serves the HTML form. CRM exposes token-scoped endpoints (no user JWT; the URL token is the secret):
| Method | Path | Purpose |
|---|---|---|
GET | /rest/aventora/campaigns/public/{publicToken} | Landing config (headline, intents, param mapping, landingPageConfig, engagementChannel, branding) |
POST | /rest/aventora/campaigns/public/{publicToken}/visit | Best-effort visit increment (Hub landing GET only; does not block the page) |
POST | /rest/aventora/campaigns/public/{publicToken}/submit | Lead submit JSON body |
Submit body example:
{
"firstName": "Alex",
"lastName": "Rivera",
"email": "alex@example.com",
"phone": "+14165551234",
"intent": "GET_QUOTE",
"marketingConsent": true,
"attribution": {
"utmSource": "meta",
"utmCampaign": "spring"
}
}
marketingConsent must be true. Contact-field requirements follow engagementChannel (phone/sms require phone; email requires email).
GraphQL (authenticated CRM UI): aventoraCampaigns, aventoraCampaign, aventoraCampaignLeads, createAventoraCampaign, updateAventoraCampaign, deleteAventoraCampaign.
deleteAventoraCampaign returns { success, id } and fails with a validation error when leadCount > 0.
Public endpoints return HTTP 429 when IP rate limits are exceeded.
Marketing site (aventora.ai)
The public marketing site does not embed the campaign form. Book a Demo, Contact Sales, Partner Setup, and similar CTAs open the Hub campaign landing URL stored in the site environment in a centered popup window so visitors remain on the marketing page:
| Env var | Purpose |
|---|---|
NEXT_PUBLIC_HUB_CAMPAIGN_CTA_URL | Full landing URL from Campaigns → Copy link (required for production CTAs) |
NEXT_PUBLIC_HUB_CAMPAIGN_CTA_URL_AI / _CA | Optional overrides when serving aventora.ai vs aventora.ca |
Setup:
- In CRM, create (or reuse) an ACTIVE campaign for marketing inquiries.
- Enable Ask what they are interested in with options such as Book a demo, Agency partner, Developer API, Privacy request, and Data deletion.
- Prefer Auto-start Aventora engagement with SMS so visitors who submit a North American phone receive a conversational SMS follow-up.
- Copy the landing URL into the marketing site env and redeploy.
The site appends utm_source=aventora_site and utm_content=<cta-id> (for example book-demo, contact-sales, agency-partner) so attribution distinguishes which button was clicked. If the env URL is missing, marketing CTAs do not fall back to the homepage contact form — they stay inactive until the campaign URL is configured. The homepage Contact Us form remains reachable only from the main site footer link (/#contact).
After a successful submit, the campaign thank-you page auto-closes the popup after about 2 seconds when it was opened from the marketing site (window.opener is set). Direct visits (new tab, copied link, QR) are unchanged — the thank-you message stays visible.
Changelog
| Date | Change |
|---|---|
| 2026-07-19 | Campaign detail Leads loads People via workspace SQL on person.campaignId (not Hub lead rows / ORM where), so migrated attributed People show reliably. |
| 2026-07-19 | Campaign detail Leads GraphQL always lists CRM People by campaignId (not Hub hub_campaign_leads), so migrated campaigns show attributed leads. |
| 2026-07-19 | Campaign data/API moved to Engagement Hub. CRM Campaigns UI kept and proxies to Hub when linked. Hub Admin Campaigns nav. Authenticated POST /rest/aventora/campaign-leads for Person upsert + signal. Ops migration preserves id/publicToken. Optional AVENTORA_CAMPAIGNS_PUBLIC_DISABLED retires CRM public REST. See Hub campaigns. |
| 2026-07-17 | Campaign analytics: Visits, Submissions, Unique leads on list/detail; copyable Campaign ID; detail Leads table (aventoraCampaignLeads); Person Created by/Updated by uses campaign name; Hub records visits via POST .../public/{token}/visit. Pre-tracking campaigns show blank Visits/Unique leads (nullable columns) instead of 0. |
| 2026-07-15 | Landing form requires phone for SMS/phone engagement channels and email for email channel (engagementChannel on public GET). Mandatory marketing consent checkbox; CRM stores marketingConsent / marketingConsentAt on Person. Submit body requires marketingConsent: true. |
| 2026-07-08 | Campaign thank-you page auto-closes the popup window after ~2s when opened from aventora-site CTAs (window.opener); direct tab/QR visits unchanged. |
| 2026-07-08 | Hub fix: Greeting service preserves CRM campaign suffix The lead selected: {label}. when generating opening SMS/call messages, so auto-engage greetings differ by intent (e.g. Partnership vs Learn more) instead of reusing a cached generic greeting. |
| 2026-07-08 | aventora-site Hub campaign CTAs open in a centered popup window (520×780) instead of a new tab, so visitors stay on the marketing page. Ctrl/Cmd+click still opens a new tab. |
| 2026-07-08 | Campaign landing page UI refresh (modern card layout, card-style intent options, two-column name fields). Auto-start engagements append the visitor’s selected intent label to the Hub instruction (The lead selected: …). |
| 2026-07-08 | Campaign Auto-start editor adds Engagement type (informational, confirmational, conversational, appointment booking); stored on engagementConfig.type and honored on submit. |
| 2026-07-08 | Delete campaign on detail page (blocked when leads exist; type name to confirm). Public landing links protected with IP rate limits on Hub and CRM (default 120 GET / 5 submit per IP per token per hour). GraphQL deleteAventoraCampaign. |
| 2026-07-08 | Documented aventora-site marketing CTAs via NEXT_PUBLIC_HUB_CAMPAIGN_CTA_URL (Hub campaign landing; Calendly/mailto CTAs removed from the site). Contact form fallback removed — only the main footer keeps /#contact. |
| 2026-07-06 | Campaigns UI refactored to list → detail → edit flow (table index at /campaigns, detail at /campaigns/{id}, edit at /campaigns/{id}/edit, create at /campaigns/new) matching standard CRM entity navigation. |
| 2026-07-05 | New campaign opens industry-matched templates (real estate, insurance, mortgage, financial advisor, generic) or start from blank; templates pre-fill form defaults. |
| 2026-07-05 | Campaign landing tab favicon uses the Aventora mark; post-submit thank-you message is Your information is submitted. We'll be in touch soon. |
| 2026-07-05 | Campaign auto-engage honors the campaign editor channel when set (cockpit action mappings no longer override explicit SMS/email/phone). |
| 2026-07-05 | Auto-engage from public campaign submit resolves initiator callback phone from any workspace member with Engagement callback number set (system auth path). |
| 2026-07-05 | Landing page branding (workspace/domain logo + name), Aventora favicon, required-field UX, and CRM-configurable submit label, intent label, and accent color. |
| 2026-07-05 | Campaign create/edit UI: optional interest dropdown with custom options, or turn collection off entirely. |
| 2026-07-05 | Public campaign REST routes skip CRM JWT middleware; DRAFT/PAUSED campaigns can preview the landing form (submit requires Activate). |
| 2026-07-05 | Campaign landing URLs use existing CRM AVENTORA_BASE_URL (no separate public URL env). |
| 2026-07-05 | Initial CRM Campaign landing pages: Hub-hosted form, CRM config UI, QR/link, tag-only vs auto-engage, Campaign Leads preset view. |