Developer Hub
Esta traducción se ha generado automáticamente

Resumen de la atribución de reservas

Informe sobre la conversión publicitaria a partir de contenido patrocinado

Dado que los anunciantes utilizan los anuncios patrocinados para aumentar la visibilidad y las reservas, es fundamental informar sobre las conversiones que se generan o en las que influyen dichos anuncios para demostrar el valor de su inversión publicitaria. Ese valor se calcula en función de las reservas que se hacen después de que se hayan visto o pulsado los anuncios. Te contamos cómo funciona la atribución tanto en impression-driven como en click-driven, usando un método de atribución de 7 días de last-touch,.

Para integrarte con la API de anuncios patrocinados de Rapid Lodging, tienes que enviarnos la información de conversión atribuida a los clics en los anuncios patrocinados, incluso si la tarifa con la que se hizo la reserva tras el clic no era una tarifa de « Expedia Group ». Hay que facilitar la información de la reserva, independientemente de si el último clic antes de la reserva fue en un anuncio patrocinado o en un resultado de búsqueda orgánico.

Hay dos formas de enviarnos la información sobre las conversiones:

Information

Nota

Expedia Group utiliza la solución AWS Clean Rooms, que no está disponible en todas las regiones. Consulta con tu asesor B2B de Expedia Group para confirmar si cumples los requisitos.

Salas de limpieza de datos

Las salas limpias de datos (DCR) ofrecen un entorno seguro en el que analizar el rendimiento a partir de conjuntos de datos compartidos sin exponer los datos sin procesar de user-level. Esta solución también alivia la carga de trabajo del equipo de desarrollo de tu organización, ya que elimina la necesidad de crear y mantener la lógica que determina qué información de reserva debe enviarse a Expedia Group y cuál no.

Para la transferencia de datos utilizamos una solución de «clearn room» de Amazon Web Services (AWS). Te informamos de que...

Ejemplo de política de gestión de identidades y accesos de AWS

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CleanRoomsCollaborationAccess",
      "Effect": "Allow",
      "Action": [
        "cleanrooms:ListCollaborations",
        "cleanrooms:GetCollaboration",
        "cleanrooms:GetConfiguredTable",
        "cleanrooms:ListConfiguredTables",
        "cleanrooms:CreateMembership",
        "cleanrooms:GetMembership",
        "cleanrooms:ListMemberships",
        "cleanrooms:StartAnalysis",
        "cleanrooms:GetAnalysisTemplate",
        "cleanrooms:ListAnalysisTemplates",
        "cleanrooms:GetSchema",
        "cleanrooms:ListSchemas"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowReadAccessToGlueDataCatalog",
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:GetTable",
        "glue:GetTables",
        "glue:GetPartition",
        "glue:GetPartitions"
      ],
      "Resource": [
        "arn:aws:glue:REGION:YOUR_AWS_ACCOUNT_ID:catalog",
        "arn:aws:glue:REGION:YOUR_AWS_ACCOUNT_ID:database/YOUR_DATABASE_NAME",
        "arn:aws:glue:REGION:YOUR_AWS_ACCOUNT_ID:table/YOUR_DATABASE_NAME/YOUR_TABLE_NAME"
      ]
    },
    {
      "Sid": "AllowReadAccessToS3Data",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetBucketLocation",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::YOUR_BUCKET_NAME",
        "arn:aws:s3:::YOUR_BUCKET_NAME/YOUR_PREFIX/*"
      ]
    }
  ]
}

Lista de comprobación para el uso de salas limpias

Antes de enviar tus datos a una sala limpia, debes comprobar que se incluya la siguiente información:

  • La información de tu cuenta de AWS
  • Roles y permisos configurados para la gestión de identidades y accesos
  • Todos los ID de propiedad asignados a los ID de propiedad de Expedia Group's.
  • Tablas Glue preparadas y registradas, que definen el esquema para una interpretación precisa
  • Invitación para unirte a una colaboración
  • Esquemas validados
  • Números de cliente
  • Información de identificación personal (PII) cifrada (con hash), normalmente direcciones de correo electrónico

Datos de conversión

Los datos que necesitan los anunciantes incluyen varios parámetros para cuantificar el valor de la reserva patrocinada.

CampoCampo obligatorioDescripciónValor de muestra
booking_date_timeFecha y hora en que se hizo la reserva, en formato de zona horaria UTC.2024-12-25T12:30:00Z
customer_idIdentificador único del usuario (se usa para relacionarlo con otros eventos de interacción publicitaria de este usuario). Este es el identificador que configura y proporciona siempre el editor, desde todas las solicitudes de anuncios hasta las reservas.e4dda90a-f31b-47f2-be4f-7e7289d224fa informe
property_idExpedia Group ID del alojamiento de la reserva. SOLO se aceptan los ID de propiedad de Expedia Group.8906878
number_of_room_nightsEl número total de noches reservadas, independientemente del número de habitaciones. Por ejemplo, si el viajero reservó 2 habitaciones para 3 noches, el número de pernoctaciones sería 3.3
number_of_roomsNúmero total de habitaciones reservadas.2
gross_booking_amountPrecio final que paga el viajero.200
currencyLa moneda en la que se ofrece el « gross_booking_amount ».GBP
customer_email_hash# Cifrado «SHA-256 » del correo electrónico del cliente. Se podría usar para establecer una conexión « cross-site » (entre Expedia Group y un editor concreto) y conseguir así una atribución del rendimiento más sólida. El valor puede ser nulo.

Punto de conexión de la API de notificaciones de reservas

Si decides no utilizar un DCR para comunicar las atribuciones de reservas a Expedia Group,, o si no cumples los requisitos para hacerlo, puedes utilizar en su lugar nuestro punto de conexión de notificación de reservas.

Detalles del punto de conexión

Al igual que un DCR, la API de notificaciones de reservas proporciona datos de reservas vinculados a una visita previa o a un beacon de clic activado en un anuncio patrocinado. Enviarás información de atribución a esta API al final del proceso de reserva de forma periódica. Te recomendamos que lo hagas a diario, pero también vale hacerlo en un plazo de 8 días desde que se haya visto o hecho clic en un anuncio patrocinado.

Solo envía una solicitud a la API de notificación de reservas cuando la reserva se haya confirmado correctamente.

Secuencia de acontecimientos

El orden es fundamental para los resultados del punto final de notificación de reservas. No cambies el orden de los pasos que se indican a continuación cuando realices una solicitud a la API de anuncios patrocinados de alojamiento.

  1. Cuando un viajero haga una búsqueda en tu web, harás dos solicitudes: una a la API de anuncios patrocinados de alojamiento para comprobar la disponibilidad y otra al punto final de disponibilidad de «Lodging Shopping» para ver la disponibilidad y las tarifas de Expedia Group. El orden no importa aquí, pero hay que llamar a las dos antes de seguir adelante.
  2. La API de anuncios patrocinados de alojamiento lleva a cabo una subasta para los anuncios patrocinados.
  3. Los resultados patrocinados aparecerán en la respuesta si hay inventario disponible. La respuesta también incluirá balizas de clic, visualización y renderización.

>> Más información sobre el seguimiento 4. Los anuncios patrocinados se muestran en tu página web en el orden de clasificación que nos envían desde Expedia Group. Tú eliges si quieres mostrar la tarifa de Expedia Group junto con el anuncio patrocinado o una tarifa de otra fuente. 5. La baliza de renderizado (si se usa) se activa en cuanto el navegador muestra los anuncios en la página. 6. El indicador de visualización se activa cuando el anuncio patrocinado aparece en el área de visualización. 7. El «click beacon» se activa cuando el usuario hace clic en el anuncio patrocinado que aparece en la página de resultados de búsqueda. 8. Solicita el punto final de notificación de reserva una vez que se haya completado y confirmado la reserva. No hace falta hacer nada si luego se cancela la reserva.

Diagrama de flujo de secuencias

Diagrama de flujo de seguimiento

|

Definición de la notificación de reserva de OpenAPI

openapi: 3.0.1
info:
  title: Booking Notification API
  version: v1
  description: Booking Notification API to capture booking notification data. The endpoint should be called whenever an ad of the 
    same property was viewed or clicked during the same session. For example, if the traveler saw an ad for a specific property,
    but clicked and booked the organic tile, the booking notification endpoint should still be called.
  contact:
    name: Media Solutions
    email: MediaSolutionsAPI1@expedia.com
tags:
  - name: Booking Notification
    description: API to post booking data
servers:
  - url: https://test.ean.com/v1
  - url: https://api.ean.com/v1
paths:
  /ads/booking-notification:
    post:
      tags:
        - Booking Notification
      description: Endpoint to capture booking notification data such as the booking date, the number of nights booked, the id of the property booked,
        the gross booked amount, and the currency of the gross booked amount.
      summary: Endpoint to capture booking data.
      operationId: booking-notification
      parameters:
        - name: Accept
          in: header
          description: Specifies the response format that the client would like to receive back. This must be application/json
          required: true
          schema:
            type: string
          example: 'application/json'
        - name: Accept-Encoding
          in: header
          description: Specifies the response encoding that the client would like to receive back. This must be gzip.
          required: true
          schema:
            type: string
          example: 'gzip'
        - name: User-Agent
          in: header
          description: The User-Agent header string from the customer's request, as captured by your integration.
          required: true
          schema:
            type: string
          example: 'Mozilla/5.0 (Linux; Android 13; SM-S901B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36'
        - name: Content-Type
          in: header
          description: This parameter is to specify what format the request body is in. The only supported value is application/json.
          required: true
          schema:
            type: string
            example: application/json
        - name: Customer-Ip
          in: header
          description: IP address of the customer, as captured by your integration.
            Ensure your integration passes the customer's IP, not your own. This value helps
            determine their location for ad relevancy.
            Also used for fraud recovery and other important analytics.
          required: true
          schema:
            type: string
            format: ipv4
          example: 127.0.0.1
        - name: Customer-Session-Id
          in: header
          description: Insert your own unique value for each user session, beginning with the first API call. Continue to pass the
            same value for each subsequent API call during the user's session, using a new value for every new customer
            session. This should match the initial request and all subsequent requests to retrieve ads for the user's session.
          required: false
          schema:
            type: string
          example: '7f9a24ea-2145-4819-a7b7-2a4cbe1165ab'
        - name: Customer-Id
          in: header
          description: An obfuscated unique identifier for each customer. This should not contain any personal information such as email, first or last name.
          required: true
          schema:
            type: string
          example: '7f9a24ea-2145-4819-a7b7-2a4cbe1165ab'
        - name: billing_terms
          in: query
          description: This parameter is to specify the terms of how a resulting booking should be billed. If this field is
            needed, the value for this will be provided to you separately.
          schema:
            type: string
        - name: partner_point_of_sale
          in: query
          description: This parameter is to specify what point of sale is being used to shop and book. If this field is needed,
            the value for this will be provided to you separately.
          schema:
            type: string
        - name: payment_terms
          in: query
          description: This parameter is to specify what terms should be used when being paid for a resulting booking. If this
            field is needed, the value for this will be provided to you separately.
          schema:
            type: string
        - name: platform_name
          in: query
          description: This parameter is to specify what platform is being used to shop and book. If this field is needed, the
            value for this will be provided to you separately.
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BookingRequest'
      responses:
        '204':
          description: No content - Successfully received the booking data.
          content: {}
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: 'invalid_input'
                message: 'An invalid request was sent in, please check the nested errors for details.'
                errors:
                  - type: 'item_id.required'
                    message: 'The item_id is required'
                    fields:
                      - name: 'item_id'
                        type: 'query'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: 'request_unauthenticated'
                message: 'Data required to authenticate your request is missing or inaccurate. 
                  Ensure that your request follows the guidelines in our documentation.'
                fields:
                  - name: 'apikey'
                    type: 'header'
                    value: 'jaj3982k239dka328e'
                  - name: 'signature'
                    type: 'header'
                    value: '129d75332614a5bdbe0c7eb540e95a65f9d85a5b53dabb38d19b37fad6312a2bd25c12ee5a82831d55112087e1b'
                  - name: 'timestamp'
                    type: 'header'
                    value: '198284729'
                  - name: 'servertimestamp'
                    type: 'server'
                    value: '198284729'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: 'request_unauthorized'
                message: 'Your request could not be authorized.'
        '426':
          description: Upgrade Required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: 'upgrade_required'
                message: 'This service requires the use of TLS.'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: 'too_many_requests'
                message: 'You have reached your capacity for this type of request.'
        '500':
          description: Unknown Internal Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: 'unknown_internal_error'
                message: 'An internal server error has occurred.'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: 'service_unavailable'
                message: 'This service is currently unavailable.'
components:
  schemas:
    BookingRequest:
      type: object
      required:
        - total
        - property_id
        - number_of_nights
        - creation_date_time
      properties:
        property_id:
          description: The property id that was booked.
          type: string
          example: 24323423
        number_of_nights:
          description: The total number of room nights booked. If multiple rooms were booked, this is rooms multiplied by nights.
          type: integer
          format: int32
          minimum: 1
          maximum: 20
          example: 10
        total:
          $ref: '#/components/schemas/Total'
        creation_date_time:
          description: The date and time of the booking in UTC.
          type: string
          format: date-time
          example: 2024-12-25T12:30:00Z
    Total:
      type: object
      required:
        - value
        - currency
      properties:
        value:
          description: The value.
          type: number
          format: float
          example: 34343.56
        currency:
          description: The currency of the value.
          type: string
          minLength: 3
          maxLength: 3
          example: USD
    Error:
      type: object
      properties:
        type:
          type: string
          description: The error type.
        message:
          type: string
          description: A human readable message giving details about this error.
        fields:
          type: array
          description: Details about the specific fields that had an error.
          items:
            $ref: '#/components/schemas/Field'
        errors:
          type: array
          description: An array of all the actual errors that occurred.
          items:
            $ref: '#/components/schemas/ErrorIndividual'
      description: The overall class of error that occurred.
    Field:
      type: object
      properties:
        name:
          type: string
          description: The field that had an error.
        type:
          type: string
          description: The type of the field that had an error.
        value:
          type: string
          description: The value of the field that had an error.
      description: An individual field that had an error.
    ErrorIndividual:
      type: object
      properties:
        type:
          type: string
          description: The error type.
        message:
          type: string
          description: A human readable message giving details about this error.
        fields:
          type: array
          description: Details about the specific fields that had an error.
          items:
            $ref: '#/components/schemas/Field'
      description: An individual error.

Ejemplo de solicitud de notificación de reserva

{ 

  "property_id": "24323423", 
  "number_of_nights": 10, 
  "total": { 
    "value": 34343.56, 
    "currency": "USD" 
  }, 
  "creation_date_time": "2024-12-25T12:30:00Z" 
}

Detalles de la API

Echa un vistazo a los puntos finales de esta página y, a continuación, usa un programa de pruebas para ver cómo se comparan los ejemplos y las definiciones de esquema con los resultados reales.

Nota: Tu gestor de lanzamientos te facilitará los parámetros específicos que debes incluir en el encabezado al realizar la llamada a este punto final. Si no incluyes esos parámetros, tus llamadas serán rechazadas.

¿Te ha resultado útil esta página?
¿Cómo podemos mejorar este contenido?
¡Gracias por ayudarnos a mejorar!