프로모션 하위 API 개요

프로모션을 사용하여 Google에서 판매하는 제품의 특별 혜택을 소개하세요. 프로모션은 Google 검색, 쇼핑, Chrome 등 다양한 Google 서비스에 표시됩니다. 프로모션이 승인되려면 특정 기준을 충족해야 합니다. 자세한 내용은 프로모션 기준을 참고하세요.

제품에 프로모션을 추가하면 쇼핑객에게 특별 이벤트 링크가 표시됩니다. 예를 들어 '15% 할인' 또는 '무료 배송'이 표시됩니다. 혜택 링크를 통해 제품에 대한 관심을 끌어 쇼핑객이 구매하도록 유도할 수 있습니다. 모든 프로모션은 결제 또는 판매 시점에 적용됩니다.

자세한 내용은 프로모션 기본사항을 참고하세요.

기본 요건

프로모션을 표시하기 전에 비즈니스와 제품에 대한 구체적인 정보를 Google에 제공해야 합니다. 다음이 있어야 합니다.

또한 판매자 센터 계정을 프로모션 프로그램에 등록해야 합니다. 이미 등록되어 있는지 확실하지 않은 경우 판매자 센터를 확인하세요.

등록되어 있지 않은 경우 요청 양식을 작성하세요. 구현할 준비가 되면 프로모션팀에서 알려 드립니다.

자세한 내용은 참여 기준 및 정책을 참고하세요.

데이터 소스 만들기

accounts.dataSources.create 메서드를 사용하여 프로모션 데이터 소스를 만들 수 있습니다. 기존 프로모션 데이터 소스 를 사용할 수 있는 경우 accounts.dataSources.list 메서드를 사용하여 모든 데이터 소스를 가져옵니다. 그런 다음 프로모션 데이터 소스의 name 필드를 사용하여 프로모션을 만들 수 있습니다.

다음 요청은 프로모션을 추가하기 위한 데이터 소스를 만드는 방법을 보여줍니다.

POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources

{
  "displayName": "{DISPLAY_NAME}",
  "promotionDataSource": {
    "contentLanguage": "{CONTENT_LANGUAGE}",
    "targetCountry": "{TARGET_COUNTRY}"
  }
}

다음을 바꿉니다.

요청이 성공적으로 실행되면 새로 생성된 프로모션 데이터 소스에 대한 세부정보가 포함된 다음 응답이 표시됩니다.

{
  "name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
  "dataSourceId": "{DATASOURCE_ID}",
  "displayName": "{DISPLAY_NAME}",
  "promotionDataSource": {
    "targetCountry": "{TARGET_COUNTRY}",
    "contentLanguage": "{CONTENT_LANGUAGE}"
  },
  "input": "API"
}

프로모션 만들기

accounts.promotions.insert 메서드를 사용하여 프로모션을 만들거나 업데이트할 수 있습니다. accounts.promotions.insert 메서드는 promotions 리소스와 데이터 소스 이름을 입력으로 사용합니다. 성공하면 새 프로모션 또는 업데이트된 프로모션을 반환합니다.

프로모션을 만들려면 데이터 소스의 이름이 필요합니다. 요청에서 다음 필드의 값도 제공해야 합니다.

  • contentLanguage
  • redemptionChannel
  • promotionId
  • targetCountry
  • attributes.offerType
  • attributes.genericRedemptionCode
  • attributes.couponValueType
  • attributes.productApplicability
  • attributes.promotionEffectiveTimePeriod.endTime
  • attributes.promotionEffectiveTimePeriod.startTime
  • attributes.longTitle

Google은 프로모션을 검토하고 승인한 다음 배포합니다. 자세한 내용은 프로모션 승인 절차를 참고하세요.

프로모션 정책을 검토하여 생성하는 프로모션이 가치를 더하고 쇼핑 광고 정책을 준수하는지 확인하는 것이 좋습니다.

다음 요청은 온라인 프로모션을 만드는 방법을 보여줍니다.

HTTP

POST https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions:insert

{
"promotion": {
  "name": "{PROMOTION_NAME}",
  "promotionId": "{PROMOTION_ID}",
  "targetCountry": "{TARGET_COUNTRY}",
  "redemptionChannel": [
    "ONLINE"
  ],
  "contentLanguage": "{CONTENT_LANGUAGE}",
  "attributes": {
    "promotionDisplayTimePeriod": {
      "endTime": "{PROMOTION_END_TIME}",
      "startTime": "{PROMOTION_START_TIME}"
    },
    "offerType": "{OFFER_TYPE}",
    "longTitle": "{LONG_TITLE}"
  }
},
"dataSource": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}"
}

cURL

  curl --request POST \
'https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions:insert?key=[YOUR_API_KEY]' \
--header 'Authorization: Bearer {ACCESS_TOKEN}' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"dataSource":"{DATASOURCE_ID}","promotion":{"name":"accounts/{ACCOUNT_ID}/promotions/{PROMOTION_ID}y","promotionId":"abc","contentLanguage":"en","targetCountry":"US","redemptionChannel":["ONLINE"]}}' \
--compressed

프로모션 ID 설정에 적용되는 규칙에 대한 자세한 내용은 프로모션 ID 속성의 최소 요구사항을 참고하세요.

필수 offerType 필드의 유효한 값은 NO_CODEGENERIC_CODE입니다. 이러한 값 중 하나를 제공하지 않으면 API 요청이 HTTP 400 응답 [offer_type] validation/missing_required: Invalid or missing required attribute: offer_type과 함께 실패합니다. 필수 필드를 제공하지 않으면 유사한 오류 메시지가 반환됩니다.

attributes.genericRedemptionCode 필드의 값을 제공하지 않으면 요청이 HTTP 400 응답 [genericRedemptionCode] No redemption code provided와 함께 실패합니다.

promotion.attributes.promotionDisplayTimePeriod.startTimepromotion.attributes.promotionDisplayTimePeriod.endTime 필드의 값은 yyyy-mm-ddThh:mm:ssZ 형식이어야 합니다. 이러한 필드의 값을 미래 날짜로 바꾸세요.

자세한 내용은 프로모션 데이터 사양을 참고하세요.

프로모션 생성에 관한 권장사항은 프로모션 권장 사항을 참고하세요.

프로모션 관련 속성 목록은 구조화된 데이터 속성 추가를 참고하세요.

프로모션 생성 요청이 성공적으로 실행된 후 API를 사용하여 프로모션을 가져오거나 판매자 센터에 프로모션이 표시되는 데 몇 분 정도 걸릴 수 있습니다.

다음은 여러 프로모션을 비동기식으로 삽입하는 데 사용할 수 있는 샘플입니다.

자바

import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.protobuf.Timestamp;
import com.google.shopping.merchant.promotions.v1.Attributes;
import com.google.shopping.merchant.promotions.v1.CouponValueType;
import com.google.shopping.merchant.promotions.v1.InsertPromotionRequest;
import com.google.shopping.merchant.promotions.v1.OfferType;
import com.google.shopping.merchant.promotions.v1.ProductApplicability;
import com.google.shopping.merchant.promotions.v1.Promotion;
import com.google.shopping.merchant.promotions.v1.PromotionsServiceClient;
import com.google.shopping.merchant.promotions.v1.PromotionsServiceSettings;
import com.google.shopping.merchant.promotions.v1.RedemptionChannel;
import com.google.shopping.type.CustomAttribute;
import com.google.shopping.type.Destination.DestinationEnum;
import com.google.type.Interval;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to insert multiple promotions asynchronously. */
public class InsertPromotionsAsyncSample {

  private static String generateRandomString() {
    String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    Random random = new Random();
    StringBuilder sb = new StringBuilder(8);
    for (int i = 0; i < 8; i++) {
      sb.append(characters.charAt(random.nextInt(characters.length())));
    }
    return sb.toString();
  }

  private static Promotion createPromotion(String accountId) {
    String merchantPromotionId = generateRandomString();

    Attributes attributes =
        Attributes.newBuilder()
            .setProductApplicability(ProductApplicability.ALL_PRODUCTS)
            .setOfferType(OfferType.GENERIC_CODE)
            .setGenericRedemptionCode("ABCD1234")
            .setLongTitle("My promotion")
            .setCouponValueType(CouponValueType.PERCENT_OFF)
            .addPromotionDestinations(DestinationEnum.SHOPPING_ADS)
            .setPercentOff(10)
            // Note that promotions have a 6-month limit.
            // For more information, read here: https://support.google.com/merchants/answer/2906014
            // Also note that only promotions valid within the past 365 days are shown in the UI.
            .setPromotionEffectiveTimePeriod(
                Interval.newBuilder()
                    .setStartTime(Timestamp.newBuilder().setSeconds(1726842472))
                    .setEndTime(Timestamp.newBuilder().setSeconds(1726842473))
                    .build())
            .build();

    return Promotion.newBuilder()
        .setName(String.format("accounts/%s/merchantPromotions/%s", accountId, merchantPromotionId))
        .setPromotionId(merchantPromotionId)
        .setContentLanguage("fr")
        .setTargetCountry("CH")
        .addRedemptionChannel(RedemptionChannel.ONLINE)
        .setAttributes(attributes)
        // Custom attributes allow you to add additional information which is not available in
        // Attributes. For example, you might want to pilot experimental functionality.
        .addCustomAttributes(
            CustomAttribute.newBuilder()
                .setName("another example name")
                .setValue("another example value")
                .build())
        .build();
  }

  public static void asyncInsertPromotions(String accountId, String dataSourceId) throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates a channel provider. This provider manages a pool of gRPC channels
    // to enhance throughput for bulk operations. Each individual channel in the pool
    // can handle up to approximately 100 concurrent requests.
    //
    // Channel: A single connection pathway to the service.
    // Pool: A collection of multiple channels managed by this provider.
    //   Requests are distributed across the channels in the pool.
    //
    // We recommend estimating the number of concurrent requests you'll make, divide by 50 (50%
    // utilization of channel capacity), and set the pool size to that number.
    InstantiatingGrpcChannelProvider channelProvider =
        InstantiatingGrpcChannelProvider.newBuilder().setPoolSize(30).build();

    PromotionsServiceSettings merchantPromotionsServiceSettings =
        PromotionsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .setTransportChannelProvider(channelProvider)
            .build();

    try (PromotionsServiceClient merchantPromotionsServiceClient =
        PromotionsServiceClient.create(merchantPromotionsServiceSettings)) {

      // Arbitrarily creates five merchant promotions with random IDs.
      List<InsertPromotionRequest> requests = new ArrayList<>();
      for (int i = 0; i < 5; i++) {
        InsertPromotionRequest request =
            InsertPromotionRequest.newBuilder()
                .setParent(String.format("accounts/%s", accountId))
                .setPromotion(createPromotion(accountId))
                .setDataSource(String.format("accounts/%s/dataSources/%s", accountId, dataSourceId))
                .build();
        requests.add(request);
      }

      // Inserts the merchant promotions.
      List<ApiFuture<Promotion>> futures =
          requests.stream()
              .map(
                  request ->
                      merchantPromotionsServiceClient.insertPromotionCallable().futureCall(request))
              .collect(Collectors.toList());

      // Creates callback to handle the responses when all are ready.
      ApiFuture<List<Promotion>> responses = ApiFutures.allAsList(futures);
      ApiFutures.addCallback(
          responses,
          new ApiFutureCallback<List<Promotion>>() {
            @Override
            public void onSuccess(List<Promotion> results) {
              System.out.println("Inserted merchant promotions below:");
              System.out.println(results);
            }

            @Override
            public void onFailure(Throwable throwable) {
              System.out.println(throwable);
            }
          },
          MoreExecutors.directExecutor());
    } catch (Exception e) {
      System.out.println(e);
    }
  }


  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    asyncInsertPromotions(config.getAccountId().toString(), "<YOUR_DATA_SOURCE_ID>");
  }
}

다음은 시작하는 데 사용할 수 있는 샘플 프로모션입니다.

모든 제품 및 모든 매장에 적용되는 오프라인 프로모션

다음 샘플 요청은 판매자 센터 계정의 모든 제품과 연결된 비즈니스 프로필 계정에 추가된 모든 매장에 적용되는 오프라인 프로모션을 만드는 방법을 보여줍니다.

POST https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions:insert

{
  "promotion": {
    "promotionId": "buy_2_get_10_off",
    "contentLanguage": "en",
    "targetCountry": "US",
    "redemptionChannel": [
      "IN_STORE"
    ],
    "attributes": {
      "longTitle": "Buy 2 and get 10$ OFF purchase",
      "productApplicability": "ALL_PRODUCTS",
      "offerType": "NO_CODE",
      "couponValueType": "BUY_M_GET_MONEY_OFF",
      "promotionDisplayTimePeriod": {
        "startTime": "2024-2-06T00:47:44Z",
        "endTime": "2024-5-06T00:47:44Z"
      },
      "promotionEffectiveTimePeriod": {
        "startTime": "2024-2-06T00:47:44Z",
        "endTime": "2024-5-06T00:47:44Z"
      },
      "moneyOffAmount": {
        "amountMicros": "1000000",
        "currencyCode": "USD"
      },
      "minimumPurchaseQuantity": 2,
      "storeApplicability": "ALL_STORES",
      "promotionUrl": "http://promotionnew4url.com/",
      "promotionDestinations": [
        "LOCAL_INVENTORY_ADS"
      ],
    }
  },
  "dataSource": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}"
}

productApplicability 필드는 필수입니다. 프로모션이 모든 제품에 적용되는지 또는 특정 제품에만 적용되는지를 나타냅니다. 지원되는 값은 ALL_PRODUCTSSPECIFIC_PRODUCTS입니다. 자세한 내용은 프로모션 제품 선택 을 참고하세요.

couponValueType 필드는 필수입니다. 실행 중인 프로모션 유형을 나타냅니다. 지원되는 값 목록은 쿠폰 값 유형을 참고하세요. 선택한 쿠폰 값 유형에 따라 일부 속성이 필요합니다.

minimumPurchaseQuantity 필드를 사용하면 프로모션 혜택을 사용하기 위해 필요한 최소 구매 수량의 값을 설정할 수 있습니다. 자세한 내용은 프로모션 최소 구매 수량을 참고하세요.

마찬가지로 minimumPurchaseAmount 필드를 사용하여 프로모션을 사용하기 위해 필요한 최소 구매액을 설정할 수 있습니다. 자세한 내용은 최소 구매액을 참고하세요.

지역 프로모션을 만드는 데 필요한 값에 대한 자세한 내용은 지역 프로모션의 데이터 소스 사양을 참고하세요.

쿠폰 사용 코드가 있는 선택된 제품에 적용되는 온라인 프로모션

다음 샘플 요청은 쿠폰 사용 코드가 있는 선택된 제품에 적용되는 온라인 프로모션을 만드는 방법을 보여줍니다.

POST https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions:insert

{
 "promotion": {
   "promotionId": "25_pct_off",
   "contentLanguage": "en",
   "targetCountry": "US",
   "redemptionChannel": [
     "ONLINE"
   ],
   "attributes": {
     "longTitle": "10% off on selected items",
     "productApplicability": "SPECIFIC_PRODUCTS",
     "offerType": "GENERIC_CODE",
     "genericRedemptionCode": "SPRINGSALE",
     "couponValueType": "PERCENT_OFF",
     "promotionDisplayTimePeriod": {
       "startTime": "2024-2-06T00:47:44Z",
       "endTime": "2024-5-06T00:47:44Z"
     },
     "promotionEffectiveTimePeriod": {
       "startTime": "2024-2-06T00:47:44Z",
       "endTime": "2024-5-06T00:47:44Z"
     },
     "percentOff": 25,
     "promotionDestinations": [
       "FREE_LISTINGS"
     ],
     "itemIdInclusion": [
       "1499860100",
       "1499860101",
       "1499860102",
       "1499860103",
       "1499860104"
     ],
   }
 },
 "dataSource": "accounts/{ACCOUNT_ID}/dataSources/1000000573361824"
}

프로모션 보기

프로모션을 보려면 accounts.promotions.get을 사용하세요. 이 GET 요청은 읽기 전용입니다. merchantId 및 프로모션 ID가 필요합니다. GET 메서드는 상응하는 프로모션 리소스를 반환합니다.

예를 들면 다음과 같습니다.

HTTP

GET https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions/{PROMOTION_ID}

cURL

  curl \
   'https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions/{PROMOTION_ID}?key=[YOUR_API_KEY]' \
   --header 'Authorization: Bearer {ACCESS_TOKEN}' \
   --header 'Accept: application/json' \
   --compressed

다음을 바꿉니다.

  • {ACCOUNT_ID}: 판매자 센터 계정의 고유 식별자입니다.
  • {PROMOTION_ID}: 가져오려는 프로모션의 고유 식별자입니다. 형식은 {CHANNEL} ~{CONTENT_LANGUAGE}~ {TARGET_COUNTRY}~{PROMOTION_ID} 입니다.

새로 생성된 프로모션을 API를 사용하여 가져오는 데 몇 분 정도 걸립니다.

오프라인 프로모션 보기

다음 샘플 요청은 프로모션 ID가 in_store~en~US~buy_2_get_10_off인 오프라인 프로모션을 가져옵니다.

GET https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions/in_store~en~US~buy_2_get_10_off

요청이 성공하면 다음 응답이 표시됩니다.

{
 "name": "accounts/{ACCOUNT_ID}/promotions/in_store~en~US~buy_2_get_10_off",
 "promotionId": "buy_2_get_10_off",
 "contentLanguage": "en",
 "targetCountry": "US",
 "redemptionChannel": [
   "IN_STORE"
 ],
 "attributes": {
   "longTitle": "Buy 2 and get 10$ OFF purchase",
   "productApplicability": "ALL_PRODUCTS",
   "offerType": "NO_CODE",
   "couponValueType": "BUY_M_GET_MONEY_OFF",
   "promotionDisplayTimePeriod": {
     "startTime": "2024-2-06T00:47:44Z",
     "endTime": "2024-5-06T00:47:44Z"
   },
   "promotionEffectiveTimePeriod": {
     "startTime": "2024-2-06T00:47:44Z",
     "endTime": "2024-5-06T00:47:44Z"
   },
   "moneyOffAmount": {
     "amountMicros": "1000000",
     "currencyCode": "USD"
   },
   "minimumPurchaseQuantity": 2,
   "storeApplicability": "ALL_STORES",
   "promotionUrl": "http://promotionnew4url.com/",
   "promotionDestinations": [
     "LOCAL_INVENTORY_ADS"
   ],
 }
 "dataSource": "accounts/{ACCOUNT_ID}/dataSources/1000000573361824"
}

이 샘플의 moneyOffAmount 필드는 프로모션에서 제공되는 할인을 제공합니다. 자세한 내용은 프로모션의 금액 할인액을 참고하세요.

이 샘플의 promotionUrl 필드는 쇼핑객이 프로모션에 대한 자세한 정보를 확인할 수 있는 매장 웹사이트 링크를 제공합니다. 지역 인벤토리 광고 프로모션에는 promotionUrl 필드를 포함하지 않으면 오류가 반환됩니다.

온라인 프로모션 보기

다음 샘플 요청은 프로모션 ID가 online~en~US~25_pct_off인 온라인 프로모션을 가져옵니다.

GET https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions/online~en~US~25_pct_off
{
 "name": "accounts/{ACCOUNT_ID}/promotions/online~en~US~25_pct_off",
 "promotionId": "25_pct_off",
 "contentLanguage": "en",
 "targetCountry": "US",
 "redemptionChannel": [
   "ONLINE"
 ],
 "attributes": {
   "longTitle": "10% off on selected items",
   "productApplicability": "SPECIFIC_PRODUCTS",
   "offerType": "GENERIC_CODE",
   "genericRedemptionCode": "WINTERGIFT",
   "couponValueType": "PERCENT_OFF",
   "promotionDisplayTimePeriod": {
     "startTime": "2024-2-06T00:47:44Z",
     "endTime": "2024-5-06T00:47:44Z"
   },
   "promotionEffectiveTimePeriod": {
     "startTime": "2024-2-06T00:47:44Z",
     "endTime": "2024-5-06T00:47:44Z"
   },
   "percentOff": 25,
   "promotionDestinations": [
     "FREE_LISTINGS"
   ],
   "itemIdInclusion": [
     "1499860100",
     "1499860101",
     "1499860102",
     "1499860103",
     "1499860104"
   ],
 }
 "dataSource": "accounts/{ACCOUNT_ID}/dataSources/{dataSource}"
}

이 샘플에 사용된 itemIdInclusion 필드는 프로모션 대상 제품을 언급합니다. 자세한 내용은 프로모션 제품 ID를 참고하세요.

프로모션 나열

promotions.list 메서드를 사용하여 생성된 모든 프로모션을 볼 수 있습니다.

다음은 샘플 요청입니다.

HTTP

GET https://merchantapi.googleapis.com/promotions/v1/{ACCOUNT_ID}/promotions

cURL

  curl \
   'https://merchantapi.googleapis.com/promotions/v1/accounts/{ACCOUNT_ID}/promotions?key=[YOUR_API_KEY]' \
   --header 'Authorization: Bearer {ACCESS_TOKEN}' \
   --header 'Accept: application/json' \
   --compressed

응답에는 계정의 모든 프로모션 목록이 포함됩니다. 각 프로모션에 대해 promotionId, redemptionChannel, dataSource, promotionStatus 등의 세부정보를 확인할 수 있습니다.

프로모션 상태 보기

프로모션의 상태를 보려면 promotionStatus 속성을 참고하세요. promotions.get 또는 promotions.list 메서드에서 반환됩니다.

promotionStatus 필드는 다음 값을 가질 수 있습니다.

  • IN_REVIEW: 프로모션이 아직 검토 중입니다.
  • REJECTED: 프로모션이 비승인되었습니다.
  • LIVE: 프로모션이 승인되었으며 활성 상태입니다.
  • STOPPED: 프로모션이 계정에서 중지되었습니다.
  • EXPIRED: 프로모션이 더 이상 활성 상태가 아닙니다.
  • PENDING: 프로모션이 중지되지 않았고 모든 검토가 승인되었지만 활성 날짜가 미래입니다.
  • STATE_UNSPECIFIED: 알 수 없는 프로모션 상태입니다.

생성한 프로모션의 승인 절차를 이해하려면 프로모션 승인 절차를 참고하세요.

샘플 프로모션 상태

다음 샘플은 성공한 요청과 실패한 요청 간의 차이점을 보여줍니다.

제품 매핑 누락

다음 응답 본문은 제품 매핑이 누락되어 비승인된 온라인 프로모션을 보여줍니다.

  "promotionStatus": {
    "destinationStatuses": [
      {
        "reportingContext": "FREE_LISTINGS",
        "status": "REJECTED"
      }
    ],
    "itemLevelIssues": [
      {
        "code": "promotion_sku_unmapped",
        "severity": "DISAPPROVED",
        "resolution": "merchant_action",
        "reportingContext": "FREE_LISTINGS",
        "description": "Unmapped",
        "detail": "This promotion couldn't be tested during review because it doesn't apply to any products that are currently in your Products feed",
        "documentation": "https://support.google.com/merchants/answer/2906014",
        "applicableCountries": [
          "US"
        ]
      },
      {
        "code": "promotion_sku_additional_requirements",
        "severity": "DISAPPROVED",
        "resolution": "merchant_action",
        "reportingContext": "FREE_LISTINGS",
        "description": "Promotion conditions not allowed",
        "detail": "This promotion has additional requirements that are not allowed such as requiring customers to verify additional details like phone number or ID before showing the promotion details",
        "documentation": "https://support.google.com/merchants/answer/2906014",
        "applicableCountries": [
          "US"
        ]
      }
    ]
  }

비승인된 프로모션 문제 해결 및 향후 비승인을 방지하는 방법을 알아보려면 비승인된 프로모션 문제 해결을 참고하세요.

생성한 프로모션이 승인되지 않으면 거부 이유와 문제를 해결하는 방법을 안내하는 이메일을 받게 됩니다.

프로모션 평가 중

다음 응답 본문은 아직 평가 중인 프로모션을 보여줍니다.

  "promotionStatus": {
    "destinationStatuses": [
      {
        "reportingContext": "FREE_LISTINGS",
        "status": "PENDING"
      },
      {
        "destination": "SHOPPING_ADS",
        "status": "PENDING"
      }
    ],
    "itemLevelIssues": []
  }

승인되고 활성 상태인 프로모션

다음 응답 본문은 쇼핑객에게 표시되는 프로모션을 보여줍니다.

  "promotionStatus": {
    "destinationStatuses": [
      {
        "reportingContext": "FREE_LISTINGS",
        "status": "LIVE"
      },
      {
        "destination": "SHOPPING_ADS",
        "status": "LIVE"
 }  ],
    "itemLevelIssues": []
  }

자세한 내용은 프로모션 상태 FAQ를 참고하세요.

프로모션 삭제

API를 사용하여 프로모션을 삭제할 수는 없습니다. 프로모션을 삭제하려면 판매자 센터 UI에 액세스해야 합니다. 자세한 내용은 다음 자료를 참고하세요. 프로모션 수정 또는 프로모션 상태 변경

기존 프로모션을 종료하려면 accounts.promotions.insert 메서드를 사용하여 attributes.promotionEffectiveTimePeriod.endTime 필드를 과거의 시간으로 업데이트하면 됩니다.

자세히 알아보기