Cotizaciones

Utiliza la API de cotizaciones para crear, gestionar y recuperar cotizaciones de ventas para compartir información sobre precios con compradores potenciales. Una vez configurado, una cotización se puede compartir con un comprador, ya sea en una URL especificada o a través de PDF. Los usuarios también pueden gestionar cotizaciones en HubSpot para agregar detalles, actualizar asociaciones y mucho más.

example-quote-api

Ejemplo de caso de uso: debes crear una propuesta de contrato para un cliente que esté interesado en comprar uno de sus paquetes anuales de servicios de auditoría SEO.

A continuación, aprende cómo crear un presupuesto a través de la API y configurar sus diversas propiedades, asociaciones, estados y más.

Nota: la API de cotizaciones no admite la creación de cotizaciones con firma electrónica o el procesamiento de pagos a través de Stripe o HubSpot. Tampoco puedes configurar descuentos, tarifas o impuestos recurrentes a nivel de cotización a través de la API. Para utilizar estas funciones, puedes crear la cotización en HubSpot

Resumen

El proceso de creación de cotizaciones se puede dividir en los siguientes pasos:

  1. Crear una cotización: crea una cotización con algunos detalles, como el nombre y la fecha de vencimiento. También puedes configurar la cotización para habilitar firmas electrónicas
  2. Configurar asociaciones: asocia la cotización con otros tipos de objetos de CRM, como elementos de pedido, una plantilla de cotización, un negocio y más. Durante el siguiente paso, la cotización heredará los valores de propiedad de algunos de estos registros asociados, así como la configuración de la cuenta.
  3. Establecer el estado de la cotización: establece el estado de la cotización para que refleje que está lista para ser compartida con los compradores. Cuando estableces el estado de la cotización, como convertirla en un borrador editable o en una cotización totalmente publicada y de acceso público, heredará ciertas propiedades de sus registros de CRM asociados y de la configuración de la cuenta.
  4. Compartir la cotización: una vez que se ha publicado una cotización, puedes compartirla con tus compradores.

Crear una cotización

Para crear una cotización, primero debes configurar sus detalles básicos haciendo una solicitud POST a/crm/v3/objects/quotes. Más tarde, harás una llamada por separado para asociar la cotización con otros objetos, como la plantilla de cotización, un negocio y sus elementos de pedido.

Dependiendo de tu workflow preferido, puedes crear una cotización con asociaciones a través de una solicitud POST.

En el cuerpo de la publicación, incluye las siguientes propiedades obligatorias para configurar sus detalles básicos:

hs_title  string (required)

The name of the quote.

hs_expiration_date  string (required)

The date that the quote expires.

The above are just the minimum required properties to get a quote started. To see all available quote properties, make a GET request to crm/v3/properties/quotes. Learn more about the properties API.

// example POST request body { "properties": { "hs_title": "CustomerName - annual SEO audit", "hs_expiration_date": "2023-12-10" } }

La respuesta incluirá un id, que utilizarás para seguir configurando la cotización. Puedes actualizar las propiedades de la cotización en cualquier momento realizando una solicitud de PATCH a /crm/v3/objects/quotes/{quoteId}.

Habilitar firmas electrónicas

Para habilitar firmas electrónicas en la cotización, incluye la propiedad booleana hs_esign_enabled en el cuerpo de tu solicitud con un valor de true. Ten en cuenta que no podrás agregar refrendantes a través de la API, por lo que deberán agregarse en HubSpot antes de publicar la cotización. Tampoco puedes publicar una cotización con firma electrónica habilitada si has excedido tu límite mensual de firma electrónica

// example POST request body { "properties": { "hs_title": "CustomerName - annual SEO audit", "hs_expiration_date": "2023-12-10", "hs_esign_enabled": "true" } }

Más adelante, tendrás que asociar la cotización con sus firmantes. Si bien los contactos que firman la cotización existen como contactos en HubSpot, se almacenan como un tipo de asociación independiente de los contactos. Más información sobre cómo asociar cotizaciones con firmantes de cotización.

Agregar asociaciones

Para crear una cotización completa, deberás asociarla con otros registros de CRM, como elementos de pedido, utilizando la API de asociaciones. La siguiente tabla muestra qué asociaciones de registros de CRM se requieren para una cotización completa y cuáles son opcionales. Sigue leyendo para obtener más información sobre cómo recuperar ID y usarlas para crear las asociaciones necesarias.

Tipo de objeto Requerido Descripción
Elementos de pedido Los bienes y/o servicios que se venden a través de la cotización. Puedes crear elementos de pedido a partir de productos de tu biblioteca de productos o crear elementos de pedido independientes personalizados.
Plantilla de cotización La plantilla que representa la cotización, además de proporcionar algunos ajustes de configuración predeterminados para la cotización, como el idioma. Cada cotización se puede asociar con una plantilla.
Negocio El registro de negocio para el seguimiento de los ingresos y el ciclo de vida de las ventas. Una cotización hereda valores del negocio asociado, incluidos el responsable y la moneda. Cada cotización se puede asociar a un negocio.
Contacto No Compradores específicos a los que te estás dirigiendo en la cotización.
Empresa No Una empresa específica a la que te estás dirigiendo en la cotización. Cada cotización se puede asociar a una empresa.
Descuentos, cargos e impuestos No Todos los descuentos, tarifas e impuestos que se apliquen al momento de pagar. Al determinar la cantidad total de la cotización, HubSpot aplica primero los descuentos, seguidos de las tarifas y los impuestos. Puedes usar el campo hs_sort_order para reordenar objetos del mismo tipo. Se puede establecer en valores o porcentajes fijos estableciendo hs_type en FIXED o en PERCENT.

Recuperar ID para asociaciones

Para realizar cada asociación, primero tendrás que recuperar el ID de cada objeto que quieras asociar. Para recuperar cada ID, realizarás una solicitud GET al punto de terminación del objeto correspondiente, que sigue el mismo patrón en cada objeto de CRM. Al realizar cada solicitud, también puedes incluir un parámetro de consulta de propiedades para devolver propiedades específicas cuando sea necesario. A continuación se muestran ejemplos de solicitudes GET para cada tipo de objeto.

GET request for line items /crm/v3/objects/line_items?properties=name GET request for quote templates /crm/v3/objects/quote_template?properties=hs_name GET request for deals /crm/v3/objects/deals?properties=dealname GET request for contacts /crm/v3/objects/contacts?properties=email GET request for companies /crm/v3/objects/companies?properties=name GET request for discounts crm/v3/objects/discounts?properties=hs_type,hs_value GET request for fees crm/v3/objects/fees?properties=hs_type,hs_value GET request for taxes crm/v3/objects/taxes?properties=hs_type,hs_value #GET request for line items curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/line_items?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #GET request for quote templates curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/quote_templates?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #GET request for deals curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/deals?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #GET request for contacts curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/contacts?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #GET request for companies curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/companies?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #GET request for discounts curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/discounts?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #GET request for fees curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/fees?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #GET request for taxes curl --request GET \ --url 'https://api.hubapi.com/crm/v3/properties/taxes?archived=false' \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN'

Cada llamada exitosa devolverá una respuesta de 200 con detalles para cada tipo de objeto obtenido. Usarás el valor en el campo id para establecer asociaciones en el siguiente paso.

// Example quote template GET response { "results": [ { "id": "235425923863", "properties": { "hs_createdate": "2023-06-12T16:27:32.794Z", "hs_lastmodifieddate": "2023-06-12T16:27:32.794Z", "hs_name": "Default Basic", "hs_object_id": "235425923863" }, "createdAt": "2023-06-12T16:27:32.794Z", "updatedAt": "2023-06-12T16:27:32.794Z", "archived": false }, { "id": "235425923864", "properties": { "hs_createdate": "2023-06-12T16:27:32.794Z", "hs_lastmodifieddate": "2023-06-12T16:27:32.794Z", "hs_name": "Default Modern", "hs_object_id": "235425923864" }, "createdAt": "2023-06-12T16:27:32.794Z", "updatedAt": "2023-06-12T16:27:32.794Z", "archived": false }, { "id": "235425923865", "properties": { "hs_createdate": "2023-06-12T16:27:32.794Z", "hs_lastmodifieddate": "2023-06-12T16:27:32.794Z", "hs_name": "Default Original", "hs_object_id": "235425923865" }, "createdAt": "2023-06-12T16:27:32.794Z", "updatedAt": "2023-06-12T16:27:32.794Z", "archived": false } ] }

Crear asociaciones

Con tus ID recuperados, ahora puedes realizar llamadas a la API de asociaciones para crear asociaciones.

Para cada tipo de objeto que desees asociar con una cotización, deberás realizar una llamada por separado haciendo una solicitud PUT utilizando la siguiente estructura de URL:

 /crm/v4/objects/quotes/{fromObjectId}/associations/default/{toObjectType}/{toObjectId}

Use this table to describe parameters / fields
ParameterDescription
fromObjectId

El ID de la cotización.

toObjectType

El tipo de objeto con el que te estás asociando. Por ejemplo, line_items, deals y quote_template

toObjectId

El ID del objeto con el que asocias la cotización. 

A continuación se muestran ejemplos de solicitudes PUT para cada tipo de objeto.

PUT request to associate a line item /crm/v4/objects/quotes/{quoteId}/associations/default/line_items/{lineItemId} PUT request to associate a quote template /crm/v4/objects/quotes/{quoteId}/associations/default/quote_template/{quoteTemplateId} PUT request to associate a deal /crm/v4/objects/quotes/{quoteId}/associations/default/deals/{dealId} PUT request to associate contacts /crm/v4/objects/quotes/{quoteId}/associations/default/contacts/{contactId} PUT request to associate companies /crm/v4/objects/quotes/{quoteId}/associations/default/companies/{companyId} PUT request to associate discounts /crm/v4/objects/quotes/{quoteId}/associations/default/discounts/{discountId} PUT request to associate fees /crm/v4/objects/quotes/{quoteId}/associations/default/fees/{feeId} PUT request to associate taxes /crm/v4/objects/quotes/{quoteId}/associations/default/taxes/{taxId} #PUT request to associate line items curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quoteId}/associations/default/line_items/{lineItemId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #PUT request to associate a quote template curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quote_ID}/associations/default/quote_template/{quoteTemplateId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #PUT request to associate a deal curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quoteId}/associations/default/deals/{dealId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #PUT request to associate contacts curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quoteId}/associations/default/contacts/{contactId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #PUT request to associate a company curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quoteId}/associations/default/companies/{companyId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #PUT request to associate discounts curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quoteId}/associations/default/discounts/{discountId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #PUT request to associate fees curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quoteId}/associations/default/fees/{feeId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN' #PUT request to associate taxes curl --request PUT \ --url https://api.hubapi.com/crm/v4/objects/quotes/{quoteId}/associations/default/line_items/{taxId} \ --header 'authorization: Bearer YOUR_ACCESS_TOKEN'

As an example, if your quote has an ID of 123456, the requests to associate the quote might include the following:

  • Line items (IDs: 55555, 66666): 
    • /crm/v4/objects/quotes/123456/associations/default/line_items/55555
    • /crm/v4/objects/quotes/123456/associations/default/line_items/66666
  • Quote template (ID: 987654):  /crm/v4/objects/quotes/123456/associations/default/quote_template/987654
  • Deal (ID: 345345): /crm/v4/objects/quotes/123456/associations/default/deals/345345

Cada asociación exitosa devolverá una respuesta de 200 con detalles sobre la asociación. Las llamadas anteriores asociarán los objetos en ambas direcciones, con cada dirección teniendo su propio ID. Por ejemplo, si asocias la cotización con una plantilla de cotización, la respuesta describirá la asociación desde ambos extremos. En la respuesta de ejemplo a continuación, 286 es el ID de tipo de asociación de plantilla de cotización a cotización, y 285 es el ID de tipo de asociación de plantilla de cotización a cotización.

// Example response { "status": "COMPLETE", "results": [ { "from": { "id": "115045534742" }, "to": { "id": "102848290" }, "associationSpec": { "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 285 } }, { "from": { "id": "102848290" }, "to": { "id": "115045534742" }, "associationSpec": { "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 286 } } ], "startedAt": "2023-10-12T16:48:40.624Z", "completedAt": "2023-10-12T16:48:40.712Z" }

Nota: al asociar una cotización con una plantilla de cotización, ten en cuenta los siguientes límites:

  • Las plantillas de cotizaciones deben crearse antes de que puedan asociarse con una cotización.
  • Una cotización solo se puede asociar con una plantilla de cotización.
  • Esta API no admite cotizaciones preexistentes o propuestas. Solo se puede usar el tipo de plantilla CUSTOMIZABLE_QUOTE_TEMPLATE.

Asociar firmantes de cotizaciones

Si estás habilitando la cotización para firmas electrónicas, también deberás crear una asociación entre la cotización y los contactos que están firmando mediante el uso de una etiqueta de asociación específica de cotización a contacto.

En lugar de utilizar los puntos de terminación de asociación predeterminados que se muestran arriba, deberás realizar una solicitud PUT a la siguiente URL:

/crm/v4/objects/quote/{quoteId}/associations/contact/{contactId}

En el cuerpo de la solicitud, deberás especificar associationCategory y associationTypeId, como se muestra a continuación:

// Example request body [ { "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 702 } ]

Crear una cotización con asociaciones (solicitud única)

El siguiente cuerpo de solicitud creará una nueva cotización con asociaciones a una plantilla de cotización, un negocio, dos elementos de pedido y un contacto.

POST /crm/v3/objects/quote 

properties  object 

Quote details, which can be retrieved through the properties API. Required properties are: hs_title and hs_expiration_date.

⮑ hs_title  string (required)

The name of the quote.

⮑ hs_expiration_date  string (required)

The date that the quote expires.

⮑ hs_status  string

The quote status. Omitting this property on create will prevent users from being able to edit the quote in HubSpot.

associations  array

The quote's associated records. For a quote to be publishable, it must have an associated deal and quote template. Learn more about association type IDs.

// POST request to https://api.hubapi.com/crm/v3/objects/quote { "properties": { "hs_title": "CustomerName - annual SEO audit", "hs_expiration_date": "2023-09-30" }, "associations": [ { "to": { "id": 115045534742 }, "types": [{ "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 286 }] }, { "to": { "id": 14795354663 }, "types": [{ "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 64 }] }, { "to": { "id": 75895447 }, "types": [{ "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 67 }] }, { "to": { "id": 256143985 }, "types": [{ "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 67 }] } ] }

Actualizar estado de cotización

El estado de una cotización describe qué tan avanzado está en el proceso de creación, desde la configuración inicial hasta su publicación y acceso público. El estado de la cotización también puede reflejar el proceso de aprobación de la cotización, si las aprobaciones de cotizaciones están habilitadas para la cuenta. Al establecer el estado de una cotización, HubSpot completará automáticamente ciertas propiedades.

Puedes actualizar el estado de una cotización haciendo una solicitud de PATCH a /crm/v3/objects/quote/{quoteId}.

El estado de una cotización se basa en el campo hs_status. Ciertos estados de cotización permiten a los usuarios editar, publicar y usar la cotización en los workflows de aprobación de cotizaciones. A continuación se muestran los estados de cotización disponibles.

  • Sin estado: si no se proporciona ningún valor para el campo hs_status, la cotización estará en el estado Mínimo. La cotización aparecerá en la página de índice de la herramienta Cotizaciones, pero no se podrá editar directamente. Las cotizaciones en este estado todavía se pueden usar en la automatización, como la herramienta de secuencias, y también están disponibles para analizar dentro de la herramienta de informes.
  • DRAFT: permite editar la cotización en HubSpot. Este estado puede ser útil cuando la cotización no está completamente configurada o si prefieres permitir que los representantes de ventas completen el proceso de configuración de la cotización en HubSpot. 
  • APPROVAL_NOT_NEEDED: publica la cotización en una URL de acceso público (hs_quote_link) sin necesidad de aprobación.
  • PENDING_APPROVAL: indica que la cotización está a la espera de ser aprobada antes de que pueda ser publicada.
  • APPROVED: la cotización ha sido aprobada y ahora está publicada en una URL de acceso público (hs_quote_link).
  • REJECTED: indica que la cotización ha sido configurada pero no ha sido aprobada para su publicación, y debe editarse antes de que pueda enviarse de nuevo para su aprobación.

Nota: si habilitas firmas electrónicas en la cotización, no podrás publicarla si has superado tu límite mensual de firmas electrónicas.

Por ejemplo, la siguiente solicitud publicaría la cotización en una URL de acceso público.
// PATCH request to https://api.hubapi.com/crm/v3/objects/quote/{QUOTE_ID} { "properties": { "hs_status": "APPROVAL_NOT_NEEDED" } }

Nota: por opción predeterminada, HubSpot establecerá la propiedad hs_template_type de la cotización en CUSTOMIZABLE_QUOTE_TEMPLATE después de que actualices el estado de la cotización. Este tipo de plantilla es compatible con la API v3, mientras que los siguientes tipos de plantilla son plantillas preexistentes que ya no son compatibles:

  • QUOTE
  • PROPOSAL

Propiedades establecidas por estado de cotización

Actualizar el estado de la cotización actualizará las siguientes propiedades:

  • hs_quote_amount: se calcula en función de cualquier elemento de línea asociado, impuesto, descuento y tarifa.
  • hs_domain: se establece a partir de la plantilla de cotización asociada.
  • hs_slug: generado aleatoriamente si no se proporciona explícitamente uno.
  • hs_quote_total_preference: se establece en función de la configuración de tu cuenta. Si no has configurado este ajuste, por opción predeterminada será el valor del campo total_first_payment.
  • hs_timezone: es la zona horaria predeterminada de tu cuenta de HubSpot.
  • hs_locale: se establece a partir de la plantilla de cotización asociada.
  • hs_quote_number: se establece en función de la fecha y hora actuales, a menos que se proporcione una.
  • hs_language: se establece a partir de la plantilla de cotización asociada.
  • hs_currency: se establece en función del negocio asociado. Si no has asociado un negocio con la cotización, esta cambiará por opción predeterminada a la moneda predeterminada de tu cuenta de HubSpot.

Además, las propiedades a continuación se calcularán cuando la cotización se establece en un estado publicado:

  • hs_pdf_download_link: se rellena con una URL de un PDF para la cotización.
  • hs_locked: establecido en true. Para modificar cualquier propiedad después de haber publicado una cotización, primero debes actualizar el hs_status de la cotización a DRAFT, PENDING_APPROVAL o REJECTED.
  • hs_quote_link: la URL de acceso público de la cotización. Esta es una propiedad de solo lectura y no se puede configurar a través de la API después de la publicación.
  • hs_esign_num_signers_required: si has habilitado firmas electrónicas, muestra el número de firmas necesarias.

Alcances

Se requieren los siguientes alcances para que una aplicación cree una cotización publicable válida:

  • crm.objects.quotes.write, crm.objects.quotes.read, crm.objects.line_items.write, crm.objects.line_items.read, crm.objects.owners.read, crm.objects.contacts.write, crm.objects.contacts.read, crm.objects.deals.write, crm.objects.deals.read, crm.objects.companies.write, crm.objects.companies.read
  • crm.schemas.quote.read, crm.schemas.line_items.read, crm.schemas.contacts.read, crm.schemas.deals.read, crm.schemas.companies.read

¿Te resultó útil este artículo?
Con este formulario puedes enviar tu opinión sobre nuestros documentos para desarrolladores. Si tienes comentarios sobre el producto de HubSpot, puedes enviarlos al Foro de ideas.