Feed Ketersediaan Janji Temu

Membuat dan mengupload feed ketersediaan janji temu

Saat membuat dan mengupload feed ketersediaan janji temu, ikuti petunjuk berikut:

  • Ikuti spesifikasi yang dijelaskan dalam feed ketersediaan janji temu untuk file data ketersediaan janji temu. Sebaiknya gunakan nama file data ketersediaan janji temu yang unik untuk setiap upload. Sertakan stempel waktu dalam nama file, misalnya, appointment availability_1633621547.json.
  • Dalam deskriptor kumpulan file, tetapkan kolom name ke appointment.availability. Untuk contoh file deskriptor, lihat contoh JSON. Sebaiknya gunakan nama file deskriptor unik untuk setiap upload. Sertakan stempel waktu dalam nama file, misalnya, appointment availability_1633621547.filesetdesc.json. File deskripsi harus diupload ke server SFTP generik.
  • Upload feed ke server SFTP generik setiap 30 menit sebagai refresh penuh.
  • Anda dapat menemukan detail server SFTP di bagian Konfigurasi > Feed di Partner Portal.
  • Memilih server feed

    Memilih server feed di Partner Portal
  • Lihat status penyerapan feed di bagian Feed > Histori di Partner Portal.

Mengupload Feed Inkremental

Ketersediaan janji temu juga mendukung feed inkremental, sehingga partner dapat mengupload hanya perubahan yang dilakukan pada ketersediaan mereka menggunakan upload feed.

Untuk mengupload feed inkremental, tetapkan is_incremental: true dalam setidaknya salah satu slot ketersediaan di feed Anda. Jika beberapa feed memiliki is_incremental yang ditetapkan ke true dan beberapa feed lainnya ditetapkan ke false, sistem akan memperlakukan semuanya sebagai inkremental.

Update inkremental menawarkan operasi berikut:

Tidak Ada Perubahan
Jangan sertakan ID ketersediaan untuk entitas yang tidak mengalami perubahan.
Ketersediaan Update
Untuk memperbarui satu ketersediaan, upload entri ketersediaan tertentu (availability_id yang sama) yang perlu diubah, dengan mengubah salah satu kolom yang dipilih.
Menghapus Ketersediaan
Jika entri ketersediaan tidak lagi tersedia atau harus dihapus, upload ketersediaan tersebut (availability_id yang sama) dengan spots_available disetel ke 0, dan sistem akan otomatis menghapusnya. Selain itu, untuk menghapus semua data penjual / entitas, tetapkan semua slot ketersediaannya spots_available ke 0 - tindakan ini akan menghapus penjual / entitas itu sendiri dari Ketersediaan.
Tambahkan Ketersediaan
Untuk slot ketersediaan baru, sertakan entri ketersediaan baru dengan availability_id baru yang unik di upload feed. Sistem memperlakukannya sama seperti jika disertakan dalam feed reguler.

Definisi

Definisi AppointmentAvailabilityFeed

message AppointmentAvailabilityFeed {
  repeated AppointmentAvailability data = 1;
}

Definisi AppointmentAvailability

// This represents the availability data for a bookable service provided by a
// merchant.
// For example, it can be a haircut/nail manicure service for a beauty salon or
// a massage service for a spa.
// The availability feed should be a list of this message.
message AppointmentAvailability {
  // An opaque string generated by the partner that identifies a service time
  // slot. Must be unique across all entities and service time slots.
  // Strongly recommended to only include URL-safe characters.
  // Required.
  string availability_id = 1;

  // An opaque string generated by the partner that identifies an Entity.
  // Must be unique across all entities.
  // Strongly recommended to only include URL-safe characters.
  // Required.
  string entity_id = 2;

  // An opaque string of ASCII characters from an aggregator partner which
  // uniquely identifies the Service (haircut, nail manicure, massage).
  // Strongly recommended to only include URL-safe characters.
  // Required.
  string service_id = 3;

  // The name of the service provider. For example, the name of the
  // hairdresser or the spa staff member.
  // Optional.
  string provider = 12;

  // Timestamp of when this availability slot starts in UTC.
  // Given in seconds since the unix epoch.
  // For example, 1735714800 seconds for 1 Jan 2025, 07:00:00 (UTC).
  // Required.
  int64 start_time_sec = 4;

  // The minimum number of minutes in advance before the start time that this
  // availability slot can be booked.
  // For example, if the start time is 10:00 AM and the min_advance_minutes is
  // 60, then the latest time this slot can be booked is 9:00 AM on the day of
  // the appointment.
  // If not set, it is assumed to be 0, meaning the slot can be booked at any
  // time before the start time.
  // Optional.
  int32 min_advance_minutes = 13;

  // Number of total spots and available spots of this booking availability.
  // Required.
  int32 spots_total = 5;
  // Required.
  int32 spots_available = 6;

  // The minimum number of spots that should be booked for this availability.
  // For example, a user has to book at least 2 spots for a time slot sometimes.
  // If set, spots_minimum_book should be less or equal to spots_available.
  // Optional.
  int32 spots_minimum_book = 7;

  // Link of this booking availability. Users will be redirected to partner
  // website to continue booking after clicking this link.
  // Required.
  string booking_link = 8;

  // Base price per person.
  // Required.
  google.type.Money base_price = 9;
  // Fee per person.
  // Required.
  google.type.Money fee_price = 10;

  // Whether the feed is incremental or not.
  // By default it is false, meaning the Availability feed will override the
  // previous data for the same entity_id.
  // If this is set to be true, the Availability feed will be proceeded as
  // incremental updates for the same entity_id.
  //    1) If it is a new availability_id, the entry is added.
  //    2) If it is an existing availability_id and the spots_available is 0,
  //       the entry is removed.
  //    3) If it is an existing availability_id and the spots_available is not
  //    0, the entry is updated.
  bool is_incremental = 11;
}

Referensi proto eksternal:

Contoh feed Ketersediaan Golf

Feed Ketersediaan Janji Temu

{
  "data": [
    {
      "availability_id": "availability_id_1",
      "entity_id": "entity_id_1",
      "service_id": "service_id_1",
      "start_time_sec": 1728257400,
      "spots_total": 4,
      "spots_available": 4,
      "spots_minimum_book": 2,
      "booking_link": "https://www.googleappointments.com/a_link_direct_to_booking_page",
      "base_price": {
        "currency_code": "USD",
        "units": 80,
        "nanos": 0
      },
      "fee_price": {
        "currency_code": "USD",
        "units": 1,
        "nanos": 750000000
      }
    },
    {
      "availability_id": "availability_id_2",
      "entity_id": "entity_id_2",
      "service_id": "service_id_2",
      "start_time_sec": 1728259200,
      "spots_total": 4,
      "spots_available": 4,
      "spots_minimum_book": 2,
      "booking_link": "https://googlegolfappointments.com/a_link_direct_to_booking_page",
      "base_price": {
        "currency_code": "USD",
        "units": 80,
        "nanos": 0
      },
      "fee_price" : {
        "currency_code": "USD",
        "units": 2,
        "nanos": 850000000
      }
    }
  ]
}

File Deskriptor

{
  "generation_timestamp": 1663347730,
  "name": "appointment.availability",
  "data_file": [
    "appointment_availability_1663347730.json"
  ]
}