Quote Builder by Vexco

Formatos, campos y fórmulas

Todo lo que entra se convierte en una plantilla (aunque sea de un solo uso) y se calcula con el mismo motor.

Campos del CRM

En títulos, conceptos, comentarios y condiciones, entre llaves dobles:

CampoQué es
{{deal.dealname}}, {{deal.amount}}, {{deal.mi_propiedad}}Propiedades del negocio (también las personalizadas)
{{company.name}}, {{company.city}}…Empresa principal del negocio
{{contact.firstname}}, {{contact.fullname}}, {{contact.email}}Primer contacto del negocio
{{owner.fullname}}, {{owner.email}}Propietario del negocio
{{inputs.clave}}Datos que pide la plantilla
{{today()}}, {{addDays(30)}}, {{addMonths(12)}}Fechas

Filtros: upper, lower, capitalize, money, money:'USD', number:2, round:2, date, default:'—', truncate:40. Ejemplo: {{deal.amount | money}}.

Fórmulas (cantidad, precio, descuentos, condiciones)

inputs.usuarios * 12
deal.amount > 5000 && inputs.formacion
inputs.plan == 'pro' ? 49 : 29
tier(quantity, [[1, 30], [20, 25], [100, 21]])      precio por tramos
lookup(inputs.plan, 'basic', 10, 'pro', 20, 0)       tabla de valores
round(product.price * 0.9, 2)                        precio del producto de HubSpot
max(0, inputs.usuarios - 100)                        cantidad 0 = la línea no entra

Operadores: + - * / %, == != < <= > >= (también =), && || ! (también and or not, y o no), condición ? a : b.

Funciones: min max round ceil floor abs if coalesce number text upper lower len contains concat tier lookup today addDays addMonths.

Dentro de una línea: quantity (cantidad ya calculada), price y product.*.

HTML con «quote markup»

<article data-quote data-title="Propuesta {{company.name}}" data-expires="30" data-currency="EUR">
  <var data-variable="users" data-type="number" data-default="10" data-required>Número de usuarios</var>
  <var data-variable="plan" data-type="select" data-options="basic=Básico|pro=Pro">Plan</var>

  <section data-group="Licencias">
    <div data-line data-sku="LIC-PRO" data-qty="{{inputs.users}}" data-frequency="monthly" data-term="12">Licencia Pro</div>
  </section>

  <table>
    <tr><th>Concepto</th><th>Cant.</th><th>Precio</th></tr>
    <tr data-line data-optional>
      <td data-field="name">Formación</td><td data-field="qty">2</td><td data-field="price">450,00 €</td>
    </tr>
    <tr data-line data-condition="inputs.plan == 'pro'"><td data-field="name">Soporte prioritario</td><td data-field="price">99 €/mes</td></tr>
  </table>

  <div data-quote-comments>Precios sin IVA.</div>
  <div data-quote-terms>50 % a la aceptación.</div>
</article>
AtributoEnValor
data-quotecontenedordata-title, data-expires (días, fecha o fórmula), data-currency, data-language, data-buyer-email, data-hubspot-template
data-linecualquier elementodata-name, data-sku, data-product-id, data-qty, data-price, data-total, data-discount («10 %» o importe), data-tax, data-frequency, data-term, data-condition, data-group, data-optional
data-fieldhijo de una líneaname, description, sku, qty, price, total, discount, tax, frequency, term, condition, group (también en español: concepto, cantidad, precio…)
data-variable<var> u otrodata-type (number, text, boolean, select, date), data-default, data-required, `data-options="a=Ab=B", data-help`
data-group / data-sectioncontenedorsección de las líneas de dentro
data-quote-comments, data-quote-terms, data-quote-titlecualquier elementosu texto
data-quote-property="hs_x"cualquier elementopropiedad adicional del presupuesto
<meta name="quote:title" content="…"><head>alternativa para título, quote:expires, quote:currency…

Sin markup, se usa la tabla que más parece de líneas (cabeceras reconocidas: concepto, descripción, referencia/SKU, cantidad/uds/horas, precio/PVP/tarifa, importe/total, dto., IVA, frecuencia, duración, sección); si no hay tablas, el texto visible.

CSV, TSV y pegado de hojas de cálculo

Separador detectado; cabeceras como arriba (también sin cabecera: se deduce por el contenido). Las filas de una sola celda son secciones; las de total, base, IVA, IRPF se ignoran.

Texto libre y Markdown

# Web corporativa ACME
Válido hasta: 31/12/2026
Email: compras@acme.es

## Diseño
- 3 x Plantillas de página a 400 €
- Logo: 350 €

## Mantenimiento
Hosting y soporte 49 €/mes, 12 meses
Formación 2 h × 60 € (dto. 10 %)
Notas: Precios sin IVA.

Y tablas Markdown (| Concepto | Cantidad | Precio |).

JSON

{
  "title": "Pedido web",
  "expires": 15,
  "currency": "EUR",
  "buyer": { "email": "compras@acme.es" },
  "variables": [{ "key": "users", "label": "Usuarios", "type": "number", "required": true }],
  "lines": [
    { "sku": "LIC-PRO", "quantity": "{{inputs.users}}", "billing_frequency": "monthly", "term": 12 },
    { "name": "Formación", "quantity": 2, "price": 450, "discount_percent": 10 }
  ],
  "comments": "Precios sin IVA."
}

También vale cualquier JSON con una lista de líneas (items, line_items, products, conceptos…): se busca en profundidad.

Excel

Por la API (multipart, campo file) o por URL. Se usa la hoja con más líneas.