Developer Hub
자동 생성된 번역입니다.

예약 기여도 개요

스폰서 콘텐츠의 광고 전환에 관한 보고서

광고주들은 스폰서 링크를 통해 노출과 예약을 늘리기 때문에, 스폰서 링크에 의해 유도되거나 영향을 받은 전환에 대한 보고는 광고 지출의 가치를 입증하는 데 필수적입니다. 해당 수치는 광고를 노출하거나 클릭한 후 발생한 예약에 따라 결정됩니다. 본 보고서에서는 ‘ impression-driven ’과 ‘ click-driven ’의 기여도 분석을 모두 다루며, ‘ last-touch, ’의 7일 기여도 분석 방법을 적용하였습니다.

Rapid Lodging 스폰서 광고 API와 연동하려면, 클릭 후 예약된 요금이 ‘ Expedia Group ’ 요금이 아니었던 경우에도 스폰서 광고 클릭으로 인한 전환 정보를 당사에 전송해야 합니다. 예약 전 가장 최근에 클릭한 항목이 유료 광고였는지, 아니면 자연 검색 결과였는지에 관계없이 예약 정보를 제공해야 합니다.

전환 정보를 당사에 전달하는 방법에는 두 가지가 있습니다:

Information

참고

Expedia Group AWS Clean Rooms 솔루션을 사용하며, 이 솔루션은 일부 지역에서는 제공되지 않습니다. Expedia Group 의 B2B 컨설턴트에게 문의하여 자격 요건을 확인해 주시기 바랍니다.

데이터 클린룸

데이터 클린룸(DCR)은 원시 user-level 데이터를 노출하지 않고도 공유 데이터 세트 전반에 걸친 성과를 분석할 수 있는 안전한 환경을 제공합니다. 또한 이 솔루션은 어떤 예약 정보를 Expedia Group 으로 전송해야 하고 어떤 정보는 전송하지 말아야 하는지에 대한 로직을 직접 구축하고 유지 관리할 필요가 없도록 함으로써, 귀사의 개발 팀의 업무 부담을 덜어줍니다.

데이터 전송을 위해 아마존 웹 서비스(AWS)의 클리어룸 솔루션을 사용하고 있습니다.

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/*"
      ]
    }
  ]
}

클린룸 사용 체크리스트

데이터를 클린룸으로 전송하기 전에 다음 정보가 포함되어 있는지 확인해야 합니다:

  • 귀하의 AWS 계정 정보
  • 신원 및 접근 관리 역할과 권한 구성
  • 모든 숙박 시설 ID가 Expedia Group's 숙박 시설 ID에 매핑되었습니다.
  • 정확한 해석을 위한 스키마를 정의하는 Glue 테이블을 작성하고 등록했습니다.
  • 협력 참여 요청
  • 검증된 스키마
  • 고객 ID
  • 암호화(해시 처리)된 PII(개인 식별 정보), 주로 이메일 주소

전환 데이터

광고주가 요구하는 데이터에는 스폰서십 예약의 가치를 보고하기 위한 여러 가지 지표가 포함됩니다.

필드필수 항목설명샘플 값
booking_date_time예약이 이루어진 날짜와 시간(UTC 시간대 형식).2024-12-25T12:30:00Z
customer_id사용자에 대한 고유 식별자(이 사용자의 다른 광고 상호작용 이벤트와 조인하는 데 사용됨). 이는 모든 광고 요청부터 예약에 이르기까지 게시자가 설정하고 일관되게 제공하는 ID입니다.e4dda90a-f31b-47f2-be4f-7e7289d224fa
property_idExpedia Group 숙박 시설 예약 번호. Expedia Group 숙박 시설 ID만 인정됩니다.8906878
number_of_room_nights객실 수와 관계없이 예약된 총 숙박 일수. 예를 들어, 여행자가 3박 동안 객실 2개를 예약했다면, 숙박 일수 값은 3이 됩니다.3
number_of_rooms예약된 객실 총 수.2
gross_booking_amount여행자가 최종적으로 지불한 금액.200.00
currencygross_booking_amount가 제공되는 통화.GBP
customer_email_hash# 고객 이메일의 ‘SHA-256 ’ 암호화. 더 정확한 성과 기여도 분석을 위해 cross-site 연결( Expedia Group 와 지정된 퍼블리셔 간)을 수행하는 데 사용할 수 있습니다. 값이 null일 수 있습니다.

예약 알림 API 엔드포인트

DCR을 사용하여 Expedia Group, 에 예약 기여도 정보를 전달하지 않기로 선택했거나 해당 자격 요건을 충족하지 못하는 경우, 대신 당사의 예약 알림 엔드포인트를 사용할 수 있습니다.

엔드포인트 세부 정보

DCR과 마찬가지로, 예약 알림 API는 이전 조회 내역이나 스폰서 목록에서 트리거된 클릭 비콘과 연계된 예약 데이터를 보고합니다. 예약 절차가 끝날 때마다 이 API로 귀속 정보를 정기적으로 전송하게 됩니다. 매일 진행하는 것을 권장하지만, 스폰서 게시물을 조회하거나 클릭한 날로부터 8일 이내라면 괜찮습니다.

예약이 성공적으로 확정된 경우에만 예약 알림 API에 요청을 전송하십시오.

사건의 경과

예약 알림 엔드포인트의 결과에서는 순서가 매우 중요합니다. Lodging Sponsored Listings API에 요청을 보낼 때, 아래에 나열된 이벤트 순서를 변경하지 마십시오.

  1. 여행자가 귀하의 사이트에서 검색을 수행하면, 귀하는 두 건의 요청을 보내게 됩니다. 하나는 숙박 스폰서드 리스팅 API에 대한 요청으로 예약 가능 여부를 확인하기 위한 것이며, 다른 하나는 ‘ Expedia Group ’의 예약 가능 여부와 요금을 확인하기 위한 ‘Lodging Shopping Availability’ 엔드포인트에 대한 요청입니다. 여기서는 순서는 중요하지 않지만, 다음 단계로 넘어가기 전에 두 가지 모두를 호출해야 합니다.
  2. ‘숙박 스폰서 광고’ API는 스폰서 광고에 대한 경매를 진행합니다.
  3. 사용 가능한 광고 공간이 있는 경우, 응답에 스폰서 검색 결과가 포함됩니다. 이 응답에는 클릭, 조회 및 렌더링 비콘도 포함됩니다.

>> 추적에 대해 더 알아보기 4. 스폰서 게시물은 귀사의 사이트에 다음에서 반환된 순위 순서대로 표시됩니다. Expedia Group. 스폰서 목록과 함께 ‘ Expedia Group ’ 요금을 표시할지, 아니면 다른 출처의 요금을 표시할지는 귀하가 선택할 수 있습니다. 5. 렌더 비콘(사용하는 경우)은 브라우저가 페이지에 광고를 렌더링하는 즉시 트리거됩니다. 6. 스폰서 게시물이 뷰포트에 들어오면 뷰 비콘이 트리거됩니다. 7. 여행자가 검색 결과 페이지에 표시된 스폰서 광고를 클릭하면 클릭 비콘이 작동합니다. 8. 예약이 완료되고 확정된 후, 예약 알림 엔드포인트를 호출하십시오. 그 후 예약이 취소되는 경우 별도의 조치가 필요하지 않습니다.

시퀀스 흐름도

시퀀스 흐름도 추적

|

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.

예시 예약 알림 요청

{ 

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

API 세부 정보

이 페이지에 소개된 엔드포인트를 살펴본 다음, 테스트 소프트웨어를 사용하여 예시와 스키마 정의가 실제 출력과 어떻게 다른지 확인해 보세요.

참고: 런치 매니저에서 이 엔드포인트를 호출할 때 헤더에 포함해야 할 구체적인 매개변수를 제공해 줄 것입니다. 해당 매개변수를 포함하지 않으면 호출이 거부됩니다.

이 페이지가 도움이 되었나요?
이 콘텐츠를 어떻게 개선하면 좋을까요?
더 나은 Developer Hub를 만드는 데 도움을 주셔서 감사합니다!