evoLeadGate: reference
The "Lead magnet" element
The builder labels are in Spanish. English glosses are given in brackets. Defaults are those of a freshly added element.
Formulario tab (Form)
| Option | What it does | Default |
|---|---|---|
| ID del formulario (form ID) | Unique identifier of the form. It is normalised to lower case with hyphens, without accents or spaces (letters a-z and digits only). Stored on every lead and sent in the analytics events. Without it, the form is not shown. | empty |
| Campos adicionales (extra fields) | List of fields (see below). The email is always requested and is not part of this list. Maximum 20; extra ones are ignored. | one sample "Nombre" field |
| Archivo de descarga (download file) | The file that is delivered. It must be in images/evoleadgate-privado/. It accepts the path the picker stores (images/evoleadgate-privado/…); a path to any other folder is discarded. |
empty |
Textos tab (Texts)
| Option | What it does | Default |
|---|---|---|
| Título (title) | Heading above the form. | empty |
| Elemento del título (title element) | HTML tag of the heading: H2, H3, H4 or Div. | H3 |
| Descripción (description) | Rich text under the heading. | empty |
| Texto del botón de envío (submit button text) | Button label. | site-language text ("Download") |
| Mensaje de éxito (success message) | Message after submitting. | site-language text |
Entrega y avisos tab (Delivery and notices)
| Option | What it does | Default |
|---|---|---|
| Entrega (delivery) | "Descarga inmediata y email" or "Solo por email (doble opt-in)". See "Delivery modes" below. | Instant download and email |
| Emails de aviso (notification emails) | One or more recipients for each lead notice, separated by commas, semicolons, spaces or line breaks. Invalid addresses are dropped. If empty, the default notification email from the options is used. | empty |
Consentimiento tab (Consent)
| Option | What it does | Default |
|---|---|---|
| Texto de privacidad (privacy text, required) | Label of the privacy checkbox, which the visitor must tick. | site-language text ("I accept the privacy policy") |
| Texto del enlace (link text) | Text of the link to the policy. | site-language text ("View policy") |
| Enlace a la política de privacidad (privacy policy link) | URL of the policy. It opens in a new tab. Without it, no link is shown. | empty |
| Texto de comunicaciones comerciales (marketing text, optional) | Label of the marketing checkbox. If empty, the checkbox is not shown. It is shown unticked. | empty |
The exact text of each checkbox is stored with the lead at the moment of submission.
Analítica tab (Analytics)
| Option | What it does | Default |
|---|---|---|
| Evento de Analytics (Analytics event) | Name of the event pushed to the dataLayer. |
generate_lead |
| Conversión de Google Ads (Google Ads conversion) | Format AW-XXXXXXX/label. Leave empty if you do not use Google Ads. |
empty |
| Evento de Meta Ads (Meta Ads event) | Name of the event sent to fbq. |
Lead |
Ajustes and Avanzado tabs (Settings and Advanced)
The usual YOOtheme options: top and bottom margin, maximum width, block and text alignment, animation and visibility. Margins default to "default" at the top and bottom. The Advanced tab holds the standard builder options.
The "Campo" child element (Field)
| Option | What it does |
|---|---|
| Etiqueta (label) | Text the visitor sees. The internal field name is derived from it (lower case, no accents, underscores, unique within the form). Fields without a label are ignored. |
| Tipo (type) | Texto (text), Teléfono (phone), Desplegable (dropdown) or Casilla (checkbox). |
| Obligatorio (required) | Marks the field as required. |
| Texto de ayuda (placeholder) | Placeholder inside the field. Text and phone only. |
| Opciones (options) | One option per line. Dropdown only. Up to 50 options of up to 100 characters; duplicates are dropped. |
Server-side validation, always against the signed definition of the form:
| Type | Rule |
|---|---|
| Lower-cased, 190 characters at most, valid email format. | |
| Text | 255 characters at most. |
| Phone | 6 to 30 characters from digits, +, (, ), -, . and spaces. |
| Dropdown | The value must be one of the defined options. |
| Checkbox | Stored as 1 when ticked and empty otherwise. If required, it must be ticked. |
Delivery modes
| Mode | Value | Behaviour |
|---|---|---|
| Instant download and email | instant_email |
After submitting, the visitor sees a download button. They also get an email with the link. |
| Email only (double opt-in) | email_only |
After submitting, the visitor only sees that an email was sent. There is no link on screen. The first valid use of the link marks the lead's email as verified. |
In both modes:
- the notice goes to the form's notification emails or, if there are none, to the default email in the options. With no recipient at all, the notice status is stored as
skipped; - the delivery email goes to the address typed in that same form;
- a mail failure does not stop the lead from being saved; it is recorded as
failedin the lead's status; - the download link works as many times as needed until it expires. Each download is logged;
- the file is served by PHP as an attachment, without exposing its real path. An expired link answers 410; an unknown link, or a file that is gone, answers 404.
Analytics events
After a successful submission, the form script does this in the browser:
| Action | Condition |
|---|---|
dataLayer.push({event: <Analytics event>, form_id, event_id}) |
Always. |
gtag('event', 'conversion', {send_to: <Google Ads conversion>}) |
When "Conversión de Google Ads" has a value and gtag is a function. |
fbq('track', <Meta Ads event>, {}, {eventID: event_id}) |
When fbq is a function. |
dataLayer.push({event: 'file_download', form_id}) |
When the download button is clicked (instant delivery only). |
event_id is the lead's UUID, so it matches the event_id shown in the lead detail and can be used to deduplicate conversions.
The script does not read the consent state. It checks whether gtag and fbq exist: your site loads the pixels, for example from YOOtheme's scripts panel in the marketing category, and they only exist if the visitor accepted them. The script does not load third-party scripts; what gtag and fbq do depends on how you load them.
Joomla event for integrations
Each new lead fires a Joomla event after it is saved and the emails have been sent:
| Name | onEvoleadgateLeadCreated |
| Plugin group | evoleadgate (imported before the event is dispatched) |
| Argument | lead: an array with every column of the lead plus its id |
The argument also carries the stored IP, the user agent, the consents, the attribution data and the download token. Treat it as personal data and as a credential. If your plugin throws an exception, it is ignored and the lead is still saved.
A minimal subscribed plugin:
public static function getSubscribedEvents(): array
{
return ['onEvoleadgateLeadCreated' => 'onLead'];
}
public function onLead(\Joomla\Event\Event $event): void
{
$lead = $event->getArgument('lead'); // ['id' => ..., 'email' => ..., 'form_id' => ..., ...]
}
REST API (read-only)
Provided by the package's web services plugin. It uses the X-Joomla-Token header and needs a user with the core.manage permission on com_evoleadgate. Responses are not cached.
| Method and route | What it returns |
|---|---|
GET /api/index.php/v1/evoleadgate/leads |
List of leads, newest first. Parameters: filter_form (form ID), page[limit] (1 to 100, default 20), page[offset]. Attributes: form_id, email, verified, delivery, created. Includes meta.total-items. |
GET /api/index.php/v1/evoleadgate/leads/{id} |
One lead: form_id, email, fields, source_url, consent_privacy, consent_marketing, consented_at, verified, delivery, utm_source, utm_medium, utm_campaign, created. |
Neither includes the IP or the user agent. There are no write routes. A user without the permission gets 403.
Tools for evoMCP (optional)
If you have evoMCP installed, the package's evomcp plugin registers these tools under the "evoLeadGate" component. They need core.manage on com_evoleadgate plus the permissions of the MCP connection.
| Tool | Permission | What it does |
|---|---|---|
evoleadgate_list_leads |
read | Lists leads with filters (form, email, verified, dates) and pagination up to 100. Flagged as personal data. |
evoleadgate_get_lead |
read | One lead with its fields, consents, UTM and email status. It does not include the IP or the user agent. |
evoleadgate_lead_stats |
read | Leads per form and per day, with no personal data. |
evoleadgate_delete_leads |
write | Deletes up to 50 leads with their downloads. It also needs core.delete and always requires human approval. It supports dry_run. |
Component entry points
For information only: the form script uses them, and they are not meant to be called by hand.
| Entry | Use |
|---|---|
GET /index.php?option=com_evoleadgate&format=json&task=lead.token |
Returns a current CSRF token. The script requests it on load so the form works with a cached page. |
POST /index.php?option=com_evoleadgate&format=json&task=lead.submit |
Receives the submission. Responses: 200 with ok, event_id, delivery and, for instant delivery, download_url; 422 with per-field errors; 400 if anti-spam blocks the submission or the signed configuration is invalid; 403 if the CSRF token fails; 503 if the file is no longer available. |
GET /?option=com_evoleadgate&task=lead.download&token=<token> |
Serves the file to a valid link. |
The form configuration travels in a hidden field signed with HMAC-SHA256 using the site secret, with no expiry. Changing Joomla's secret invalidates any form still in a cache until it is rendered again.
Limits
| Limit | Value |
|---|---|
| Extra fields per form | 20 |
| Dropdown options | 50, up to 100 characters each |
| Files per form | 1 |
| Text fields | 255 characters |
| 190 characters | |
| Leads per REST API call | 100 |
| Leads per delete from evoMCP | 50 |