Creare e gestire offerte private utilizzando l'API

L'API Commerce Producer fornisce l'accesso programmatico alla creazione e alla pubblicazione di offerte private per partner e integratori. Questa API sostituisce le operazioni manuali nel Producer Portal, consentendo ai partner di creare, gestire e pubblicare offerte private direttamente dai loro sistemi interni o da piattaforme di terze parti.

Vantaggi principali

  • Scalabilità e automazione: il passaggio dai clic manuali sul portale al controllo programmatico consente ai partner di scalare il volume delle transazioni in modo più efficiente.
  • Efficienza operativa: l'integrazione dell'API riduce l'attrito del deal desk e aiuta a prevenire errori manuali nel processo di creazione delle offerte.
  • Time-to-market: creando l'integrazione con l'API durante l'anteprima, i partner sono pronti a essere pubblicati immediatamente al momento della disponibilità generale.

Pubblico di destinazione

Questa API è destinata ai partner ISV strategici e agli integratori del marketplace che vogliono automatizzare la creazione e la gestione delle offerte private. Quando elenchi o recuperi i servizi, l'API restituisce tutti i tuoi servizi. Il campo productType della risorsa Service identifica i seguenti tipi di prodotto:

I servizi di qualsiasi altro tipo di prodotto segnalano un productType di PRODUCT_TYPE_UNSPECIFIED. Nel tempo potrebbero essere aggiunti altri valori di productType, quindi la tua integrazione deve gestire i valori non riconosciuti e le modifiche al productType di un servizio esistente.

Prima di iniziare

Prima di utilizzare l'API Commerce Producer, completa i seguenti prerequisiti:

  1. Abilita l'API Commerce Producer: abilita il servizio commerceproducer.googleapis.com nel tuo progetto:

    gcloud services enable commerceproducer.googleapis.com
    

    Per istruzioni su come attivare i servizi, vedi Attivazione dei servizi.

  2. Configura le librerie client: scarica gli SDK e le librerie client richiesti. Per maggiori dettagli, vedi Librerie client.

  3. Riferimento API: per accedere al riferimento API, consulta il riferimento API Producer Commerce.

Flusso dell'API standard

La creazione e la pubblicazione di un'offerta privata a livello di programmazione richiedono una sequenza specifica di chiamate API. Il flusso standard è costituito dai seguenti passaggi:

  1. Elenca servizi: elenca i servizi nel tuo progetto per trovare quello per cui creare l'offerta privata.
  2. Elenca offerte standard: elenca le offerte standard attive nel servizio selezionato per trovare il nome della risorsa dell'offerta standard di base. Il nome della risorsa è obbligatorio per creare un'offerta privata.
    • Devi elencare le offerte standard non scadute.
    • Se visualizzi più offerte standard per lo stesso livello di servizio con durate diverse, puoi selezionarne una qualsiasi. Sono funzionalmente identiche perché la durata dell'offerta privata sostituisce la durata dell'offerta standard.
    • Puoi utilizzare solo offerte standard valide e non scadute.
  3. Scopri quale offerta modificare: chiama resolveAmendmentTarget per scoprire se la nuova offerta deve modificare un'offerta esistente o meno.
  4. Crea l'offerta (create PrivateOffer): chiama l'API per creare una nuova risorsa PrivateOffer nello stato DRAFT, definendo i dettagli di base, l'account cliente billing_name e i modelli di prezzi personalizzati.
  5. Allega un documento (create PrivateOfferDocument ): crea una risorsa PrivateOfferDocument e allegala alla bozza dell'offerta per specificare i termini o il contratto di licenza con l'utente finale. Prima di poter essere pubblicata, ogni offerta privata deve includere almeno un documento. Un'offerta privata può avere al massimo un documento di ogni tipo e non può avere sia un contratto EULA standard sia un contratto EULA personalizzato. Per controllare le regole dei documenti per tipo per un servizio, esamina il campo documentRequirement della risorsa Service:
    • Per la maggior parte dei servizi, come i prodotti SaaS e i dati, documentRequirement elenca sia STANDARD_END_USER_LICENSE_AGREEMENT_V2 (EULA standard) sia CUSTOM_END_USER_LICENSE_AGREEMENT (EULA personalizzato) come OPTIONAL perché documentRequirement esprime solo regole per tipo. Devi comunque allegare STANDARD_END_USER_LICENSE_AGREEMENT_V2 o CUSTOM_END_USER_LICENSE_AGREEMENT.
    • Per i servizi professionali, il STATEMENT_OF_WORK (SOW) è REQUIRED, CUSTOM_END_USER_LICENSE_AGREEMENT è OPTIONAL e i contratti di licenza con l'utente finale (EULA) standard sono NOT_ALLOWED.
    • STANDARD_END_USER_LICENSE_AGREEMENT_V1 è sostituito da STANDARD_END_USER_LICENSE_AGREEMENT_V2 ed è sempre NOT_ALLOWED per le nuove offerte.
  6. Pubblica l'offerta (publish): chiama il metodo publish per finalizzare l'offerta e renderla disponibile per l'accettazione da parte del cliente. Puoi utilizzare il flag validate_only per convalidare i dettagli dell'offerta senza pubblicarla.

Termini e concetti chiave

  • PrivateOffer: la risorsa principale che rappresenta un'offerta personalizzata estesa a un cliente specifico. Supporta stati come DRAFT, PUBLISHED e ACCEPTED.
  • PrivateOfferDocument: un documento non strutturato allegato a una bozza di offerta privata, ad esempio un Contratto di licenza con l'utente finale (EULA) standard (STANDARD_END_USER_LICENSE_AGREEMENT_V2), un Contratto di licenza con l'utente finale (EULA) personalizzato (CUSTOM_END_USER_LICENSE_AGREEMENT) o una dichiarazione di lavoro (STATEMENT_OF_WORK). Ogni offerta privata deve includere almeno un documento prima di poter essere pubblicata. Un'offerta privata può avere al massimo un documento di ogni tipo e non può avere sia un contratto EULA standard sia un contratto EULA personalizzato. I tipi di documenti richiesti, facoltativi o non consentiti dipendono dal campo documentRequirement della risorsa Service. Tieni presente che STANDARD_END_USER_LICENSE_AGREEMENT_V1 è stato sostituito e non è consentito per le nuove offerte. Questi documenti sono immutabili una volta che l'offerta esce dallo stato DRAFT.
  • Service: il nome del servizio, che è una risorsa di sola lettura che rappresenta un prodotto. Quando questo valore è impostato, ti aiuta a trovare quali StandardOffers sono disponibili per questo prodotto. L'elenco o il recupero dei servizi restituisce tutti i tuoi servizi e include i seguenti campi:
    • productType: il tipo di prodotto commercializzato dal servizio (SOFTWARE_AS_A_SERVICE, PROFESSIONAL_SERVICES o ANALYTICS_HUB_LISTING) o PRODUCT_TYPE_UNSPECIFIED per qualsiasi altro tipo di prodotto.
    • documentRequirement: i livelli di requisiti per tipo (REQUIRED, OPTIONAL o NOT_ALLOWED) per i documenti allegati alle offerte private sul servizio. Un tipo di documento non elencato non è consentito. Poiché documentRequirement esprime solo regole per tipo, elenca sia STANDARD_END_USER_LICENSE_AGREEMENT_V2 sia CUSTOM_END_USER_LICENSE_AGREEMENT come OPTIONAL per i servizi a cui devi allegare uno di questi due tipi di EULA.
  • Sku: uno SKU (codice identificativo dell'articolo) che rappresenta l'unità atomica di prezzi e fatturazione. Ogni addebito al cliente è associato e ha origine da esattamente uno SKU.
  • SkuGroup: una risorsa che rappresenta un gruppo di SKU.
  • StandardOffer: quando viene selezionato un Service, questo ti consente di determinare il livello di servizio in base al quale creare offerte private. Le offerte standard devono essere valide e non scadute per essere utilizzate come offerta standard di base.

Librerie client

Utilizza le Google Cloud librerie client per interagire con l'API.

  • SDK disponibili: Google fornisce librerie generate automaticamente per Ruby, Java, Python, Go, C#, PHP e Node.js.
  • Download dell'SDK: i pacchetti della libreria client sono disponibili su GitHub.
  • Indicazioni generali: per saperne di più sull'utilizzo delle Google Cloud librerie client, consulta Librerie client di Cloud per linguaggio.
  • Equivalenti dell'interfaccia utente: per capire come queste operazioni vengono mappate nella consoleGoogle Cloud , leggi Crea un'offerta privata per un cliente.

Limitazioni

L'API presenta le seguenti limitazioni:

  • Visibilità della UI per le bozze: le offerte che crei o aggiorni utilizzando l'API non sono visualizzabili o modificabili nella UI del Producer Portal finché non le pubblichi. Allo stesso modo, se crei un'offerta in Producer Portal, ma la modifichi utilizzando l'API, non puoi visualizzare o modificare la bozza in Producer Portal.

Ruoli e autorizzazioni

Per interagire con l'API Commerce Producer, devi disporre dei seguenti ruoli Identity and Access Management (IAM) nel progetto del produttore:

  • Per le azioni di lettura e scrittura: roles/commerceproducer.admin o roles/commercepricemanagement.privateOffersAdmin
    • In alternativa, anche il ruolo di base roles/editor concede l'accesso.
  • Per le azioni di sola lettura: roles/commerceproducer.viewer o roles/commercepricemanagement.viewer
    • In alternativa, anche il ruolo di base roles/viewer concede l'accesso.

Configurare prezzi e pianificazioni

Utilizza le seguenti configurazioni per impostare i modelli di prezzi e gli orari per le tue offerte private.

Configurare i modelli di prezzi

Per configurare modelli di prezzo diversi, imposta i campi nella risorsa PrivateOffer come descritto negli esempi seguenti:

  • Tariffa fissa, addebito mensile di 100 $, con uno sconto del 20% sull'utilizzo:
    • standard_interval_price.standard_interval: MONTHLY_NOT_PRORATED
    • standard_interval_price.price_model.flat_fee.flat_fee_override: 100 (USD)
    • standard_interval_price.price_model.usage.default_discount_percent: 20
  • Solo utilizzo, sconto per utilizzo del 20%:
    • standard_interval_price.standard_interval: STANDARD_INTERVAL_UNSPECIFIED
    • standard_interval_price.price_model.usage.default_discount_percent: 20
  • Sconto per impegno di utilizzo (CUD) con sconto per utilizzo predefinito del 30% (addebito trimestrale di 100 $e credito trimestrale di 100 $; lo sconto si applica all'utilizzo) e uno sconto personalizzato del 40% sulla SKU1, impegno trimestrale, con rollover dei crediti (i crediti inutilizzati del trimestre precedente vengono trasferiti al trimestre successivo):
    • standard_interval_price.standard_interval: QUARTERLY_NOT_PRORATED
    • standard_interval_price .price_model.commitment.commitment_amount: 100 (USD)
    • standard_interval_price .price_model.commitment.discard_previous_credit_balance: false (non eliminare il saldo precedente per consentire il riporto del credito)
    • standard_interval_price.price_model.usage.default_discount_percent: 30
    • standard_interval_price .price_model.usage.sku_discounts[0].sku: SKU1 (seleziona SKU1 per applicare uno sconto personalizzato)
    • standard_interval_price .price_model.usage.sku_discounts[0].discount_percent: 40 (specifica uno sconto del 40% su SKU1 per ignorare lo sconto predefinito del 30%)
  • Sconto per impegno di utilizzo con impegno mensile di 100 $, sconto del 20% sull'abbonamento (il cliente paga un addebito mensile di 80 $e riceve un credito mensile di 100 $), nessun riporto del credito (i crediti inutilizzati del mese precedente non vengono riportati al mese successivo):
    • standard_interval_price.standard_interval: MONTHLY_NOT_PRORATED
    • standard_interval_price .price_model.commitment.commitment_amount: 100 (USD)
    • standard_interval_price.price_model.commitment.discount_percent: 20
    • standard_interval_price .price_model.commitment.discard_previous_credit_balance: true (elimina il saldo precedente per evitare il riporto del credito)
  • Rate personalizzate: utilizza custom_interval_price.installments. Continuano a essere applicate le regole per i modelli a tariffa fissa e CUD.
  • Tre rate (esempio):
    • Rata 1: impegno di 100 $, sconto del 20% (il cliente paga 80 $), 25 $ crediti aggiuntivi (per un totale di 125 $).
      • custom_interval_price .installments[0].price_model.commitment.commitment_amount: 100
      • custom_interval_price .installments[0].price_model.commitment.discount_percent: 20
      • custom_interval_price .installments[0].price_model.commitment.additional_credit: 25
      • custom_interval_price .installments[0].price_model.commitment .discard_previous_credit_balance: true o false (i crediti non utilizzati non esistono ancora perché questa è la prima rata).
    • Rata 2: impegno di 200 $, sconto del 10% (il cliente paga 180 $), 25 $ di credito aggiuntivo (per un credito totale di 225 $). I crediti inutilizzati della prima rata non verranno trasferiti alla seconda rata.
      • custom_interval_price .installments[1].price_model.commitment.commitment_amount: 200
      • custom_interval_price .installments[1].price_model.commitment.discount_percent: 10
      • custom_interval_price .installments[1].price_model.commitment.additional_credit: 25
      • custom_interval_price .installments[1].price_model.commitment .discard_previous_credit_balance: true (scarta il saldo precedente per evitare il rollover).
    • Rata 3: impegno di 200 $, sconto del 10% (il cliente paga 180 $), 0 $ credito aggiuntivo (per un credito totale di 200 $). I crediti non utilizzati della seconda rata verranno trasferiti alla terza rata.
      • custom_interval_price .installments[2].price_model.commitment.commitment_amount: 200
      • custom_interval_price .installments[2].price_model.commitment.discount_percent: 10
      • custom_interval_price .installments[2].price_model.commitment.additional_credit: 0
      • custom_interval_price .installments[2].price_model.commitment .discard_previous_credit_balance: false (non scartare il saldo precedente per consentire il rollover).

Configurare le pianificazioni orarie

Nota: nell'interfaccia utente, i campi contenenti "ora di inizio", ad esempio l'ora di inizio della rata, rappresentano l'inizio della giornata. Ad esempio, se inserisci 2026-12-31, l'ora di inizio è le 00:00 del fuso orario del Pacifico del giorno 2026-12-31. Nell'API, specifichi le ore 00:00 del giorno 2026-12-31, in modo che le date nell'UI e nell'API corrispondano.

Tuttavia, i campi dell'interfaccia utente contenenti "ora di fine", come il termine per l'accettazione dell'offerta, rappresentano la fine della giornata. Ad esempio, se imposti la scadenza su 2026-12-31, la scadenza effettiva è alle 00:00 (ora del Pacifico) del 2027-01-01. L'API mostra la data come 2027-01-01, il che significa che le date dell'interfaccia utente e dell'API non corrispondono.

Per configurare orari diversi, imposta i campi nella risorsa PrivateOffer come descritto negli esempi seguenti:

  • Offerta con inizio immediato e durata:
    • term.start_policy: IMMEDIATE
    • term.end_policy: AFTER_DURATION
    • term.duration_months: 12
    • Se utilizzi rate personalizzate, la prima rata non deve impostare un orario di inizio.
  • Offerta con inizio immediato e termine in una data specifica:
    • term.start_policy: IMMEDIATE
    • term.end_policy: SCHEDULED_END_TIME
    • term.scheduled_end_time: 2029-01-01
    • Se utilizzi rate personalizzate, la prima rata non deve impostare un orario di inizio.
  • Offerta che inizia in una data programmata, con una durata:
    • term.start_policy: SCHEDULED_START_TIME
    • term.scheduled_start_time: 2027-01-01
    • term.end_policy: AFTER_DURATION
    • term.duration_months: 12
    • Se utilizzi rate personalizzate, l'ora di inizio della prima rata deve corrispondere a questa ora di inizio pianificata.
  • Offerta che inizia in una data pianificata e termina in una data specifica:
    • term.start_policy: SCHEDULED_START_TIME
    • term.scheduled_start_time: 2027-01-01
    • term.end_policy: SCHEDULED_END_TIME
    • term.scheduled_end_time: 2029-01-01
    • Se utilizzi rate personalizzate, l'ora di inizio della prima rata deve corrispondere a questa ora di inizio pianificata.
  • Offerta che termina quando termina l'offerta modificata:
    • term.end_policy: MATCH_AMENDED_OFFER
    • term.duration_months: 12 (deve corrispondere alla durata dell'offerta modificata).

Comandi per ogni passaggio

Utilizza i seguenti comandi curl per eseguire ogni passaggio del flusso di lavoro.

Passaggio 1: elenca i servizi

Elenca tutti i servizi nel tuo progetto. Utilizza questo comando per trovare il nome del servizio necessario per elencare le offerte standard.

curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
   "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services"

Per recuperare la visualizzazione completa di un singolo servizio, esegui questo comando:

curl -G -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/SERVICE_NAME" \
  --data-urlencode 'view=SERVICE_VIEW_FULL'

Passaggio 2: elenca le offerte standard

Prima di creare un'offerta privata, devi associarla a un'offerta standard impostando il campo baseStandardOffer. Per trovare le offerte standard attive, elenca le offerte standard e filtra per expire_time. Imposta expire_time su ora per assicurarti che tutte le offerte standard scadute vengano filtrate.

curl -G -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/SERVICE_NAME/standardOffers" \
  --data-urlencode 'filter=expire_time > "2026-05-27T11:30:00-04:00"'

Per recuperare la visualizzazione completa di un'offerta standard, esegui questo comando:

curl -G -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/SERVICE_NAME/standardOffers/OFFER_ID" \
  --data-urlencode 'view=STANDARD_OFFER_VIEW_FULL'

Passaggio 3: determina quale offerta modificare

Per determinare quale offerta modificare, chiama il metodo resolveAmendmentTarget. A seconda della risposta, puoi impostare il campo amendedPrivateOffer o amendedStandardOffer nella nuova offerta.

curl -G \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers:resolveAmendmentTarget" \
  --data-urlencode "targetBillingAccount=billingAccounts/CUSTOMER_BILLING_ACCOUNT" \
  --data-urlencode "baseStandardOffer=projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/SERVICE_NAME/standardOffers/OFFER_ID"

Quando chiami resolveAmendmentTarget, devi fornire i seguenti parametri di query:

  • targetBillingAccount: l'account di fatturazione Cloud del cliente per cui vuoi creare l'offerta privata nel passaggio 4.
  • baseStandardOffer: l'offerta standard di base selezionata nel passaggio 2.

L'elenco seguente descrive le possibili risposte di resolveAmendmentTarget e come gestirle nel passaggio 4:

  • Risposta vuota: non impostare amendedPrivateOffer o amendedStandardOffer nell'offerta che crei.
  • requiredPrivateOffer: imposta il campo amendedPrivateOffer della nuova offerta su questo valore. Formato: projects/PROJECT/locations/global/privateOffers/PRIVATE_OFFER_ID
  • requiredStandardOffer: imposta il campo amendedStandardOffer della nuova offerta su questo valore. Formato: projects/PROJECT/locations/global/services/SERVICE/standardOffers/OFFER_ID
  • optionalOffers: un elenco di offerte idonee che puoi modificare. Formato: projects/PROJECT/locations/global/privateOffers/PRIVATE_OFFER_ID

    Puoi eseguire una delle seguenti azioni:

    • Imposta sia amendedPrivateOffer che amendedStandardOffer su vuoto. La nuova offerta non modifica un'altra offerta.
    • Imposta amendedPrivateOffer su una delle risorse dell'elenco optionalOffers.
  • Errore 4XX: non puoi procedere al passaggio 4. Il messaggio di errore indica il motivo. Ad esempio, ciò potrebbe verificarsi quando più abbonamenti sono disattivati e un acquisto è in attesa. Devi attendere l'attivazione o il rifiuto dell'acquisto in attesa prima di continuare.

Passaggio 4: crea un'offerta privata

Crea una bozza di offerta privata. Il seguente comando crea un'offerta privata bozza con due rate e un inizio immediato. Sostituisci i segnaposto con i dettagli dell'offerta, ad esempio date, sconti e ID offerta standard.

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
  "title": "Your title",
  "acceptDeadlineTime": {
    "year": 2026,
    "month": 4,
    "day": 24,
    "timeZone": {
      "id": "America/Los_Angeles"
    }
  },
  "singleProductOffer": {
    "baseStandardOffer": "projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/YOUR_SERVICE_NAME/standardOffers/STANDARD_OFFER_ID_FROM_EARLIER",
    "customIntervalPrice": {
      "installments": [
        {
          "priceModel": {
            "commitment": {
              "commitmentAmount": {
                "currencyCode": "USD",
                "units": 500
              },
              "discountPercent": {
                "value": "30"
              }
            }
          }
        },
        {
          "startTime": {
            "year": 2026,
            "month": 5,
            "day": 17,
            "timeZone": {
              "id": "America/Los_Angeles"
            }
          },
          "priceModel": {
            "commitment": {
              "commitmentAmount": {
                "currencyCode": "USD",
                "units": 800
              },
              "discountPercent": {
                "value": "20"
              }
            }
          }
        }
      ]
    }
  },
  "customer": {
    "entityTitle": "customer title",
    "contact": "customer contact",
    "targetBillingAccount": "billingAccounts/CUSTOMER_BILLING_ACCOUNT"
  },
  "partnerContact": {
    "contact": "partner contact",
    "email": "partner@email.com"
  },
  "term": {
    "startPolicy": "IMMEDIATE",
    "endPolicy": "AFTER_DURATION",
    "durationMonths": 2,
    "maxRenewalCount": 0
  },
  "offerDealType": "NEW"
}' \
"https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers"

Per verificare la creazione, elenca le offerte private nel tuo progetto:

curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers"

Per elencare le offerte private e filtrare in base all'ora di aggiornamento, esegui questo comando.

curl -G -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers" \
  --data-urlencode 'filter=update_time > "2026-06-25T11:30:00-04:00"' \
  --data-urlencode 'orderBy=update_time desc'

Per recuperare un'offerta privata specifica:

curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers/PRIVATE_OFFER_ID"

Per recuperare la visualizzazione completa di un'offerta privata, che include campi aggiuntivi, esegui questo comando:

curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" "https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers/PRIVATE_OFFER_ID?view=PRIVATE_OFFER_VIEW_FULL"

Passaggio 5: crea un documento di offerta privata

Per pubblicare un'offerta privata, devi allegare un documento, ad esempio un Contratto di licenza con l'utente finale (EULA) o un capitolato (SOW). Il seguente comando crea e allega un Contratto di licenza con l'utente finale standard:

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
  "documentType": "STANDARD_END_USER_LICENSE_AGREEMENT_V2"
}' \
"https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers/PRIVATE_OFFER_ID/documents"

Passaggio 6: pubblica l'offerta privata

Pubblica l'offerta privata per renderla disponibile all'accettazione da parte del cliente. Sostituisci PRIVATE_OFFER_ID con l'ID della tua offerta in bozza.

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{}' \
"https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers/PRIVATE_OFFER_ID:publish"

Esempi di configurazioni di offerte private

I seguenti esempi mostrano come configurare diversi tipi di offerte private.

Avvio immediato, più rate, sconto sull'impegno

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
  "singleProductOffer": {
    "baseStandardOffer": "projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/YOUR_SERVICE_NAME/standardOffers/STANDARD_OFFER_ID",
    "customIntervalPrice": {
      "installments": [
        {
          # This installment is set to start immediately since it does not have a startTime
          "priceModel": {
            "commitment": {
              "commitmentAmount": {
                "currencyCode": "USD",
                "units": 100
              },
              "discountPercent": {
                # The discount % set here will apply to the subscription cost. In this case, customer will
                # pay $90 and get $100 in credit for this installment.
                "value": "10"
              }
            }
          }
        },
        {
          "startTime": {
            "year": 2026,
            "month": 5,
            "day": 17,
            "timeZone": {
              "id": "America/Los_Angeles"
            }
          },
          "priceModel": {
            "commitment": {
              "commitmentAmount": {
                "currencyCode": "USD",
                "units": 800
              },
              "discountPercent": {
                "value": "20"
              }
            }
          }
        }
      ]
    }
  },
  "term": {
    "startPolicy": "IMMEDIATE",
    "endPolicy": "AFTER_DURATION",
    "durationMonths": 2,
    "maxRenewalCount": 0
  }
}' \
"https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers"

Avvio immediato, più rate, sconto sull'utilizzo con override delle metriche

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
  "singleProductOffer": {
    "baseStandardOffer": "projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/YOUR_SERVICE_NAME/standardOffers/STANDARD_OFFER_ID",
    "customIntervalPrice": {
      "installments": [
        {
          # This installment starts immediately (no startTime is set).
          "priceModel": {
            "usage": {
              "defaultDiscountPercent": {
                # This is the default discount percentage on the usage skus.
                "value": "20"
              },
              "skuDiscounts": [
                {
                  # Sku IDs are retrieved from the standard offer.
                  "sku": "projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/YOUR_SERVICE_NAME/skus/SKU1_ID",
                  "discountPercent": {
                    "value": "50"
                  }
                },
                {
                  "sku": "projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/YOUR_SERVICE_NAME/skus/SKU2_ID",
                  "discountPercent": {
                    "value": "30"
                  }
                }
              ]
            },
            "commitment": {
              # The customer receives usage discounts: they pay $200 for this
              # installment, receive $200 in credit, and get 20% discount on
              # usage skus except SKU1 and SKU2.
              "commitmentAmount": {
                "currencyCode": "USD",
                "units": "200"
              }
            }
          }
        },
        {
          "startTime": {
            "year": 2026,
            "month": 5,
            "day": 14,
            "timeZone": {
              "id": "America/Los_Angeles"
            }
          },
          "priceModel": {
            "usage": {
              "defaultDiscountPercent": {
                "value": "20"
              }
            },
            "commitment": {
              "commitmentAmount": {
                "currencyCode": "USD",
                "units": "10000"
              }
            }
          }
        }
      ]
    }
  },
  "term": {
    "startPolicy": "IMMEDIATE",
    "endPolicy": "AFTER_DURATION",
    "durationMonths": 2,
    "maxRenewalCount": 0
  }
}' \
"https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers"

Avvio immediato, solo pagamento a consumo (PAYG)

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
  "singleProductOffer": {
    "baseStandardOffer": "projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/YOUR_SERVICE_NAME/standardOffers/STANDARD_OFFER_ID",
    "standardIntervalPrice": {
      "priceModel": {
        "usage": {
          "defaultDiscountPercent": {
            # This is the default discount percentage on the usage skus.
            "value": "34"
          }
        }
      }
    }
  },
  "term": {
    "startPolicy": "IMMEDIATE",
    "endPolicy": "AFTER_DURATION",
    "durationMonths": 3,
    "maxRenewalCount": 0
  }
}' \
"https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers"

Avvio pianificato, intervallo mensile, tariffa fissa e utilizzo

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
  "singleProductOffer": {
    "baseStandardOffer": "projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/services/YOUR_SERVICE_NAME/standardOffers/STANDARD_OFFER_ID",
    "standardIntervalPrice": {
      "standardInterval": "MONTHLY_NOT_PRORATED",
      "priceModel": {
        "usage": {
          "defaultDiscountPercent": {
            # This is the default discount percentage on the usage skus.
            "value": "20"
          }
        },
        "flatFee": {
          "flatFeeOverride": {
            "currencyCode": "USD",
            "units": "400"
          }
        }
      }
    },
    "features": [
      {
        "displayName": "Feature display name",
        "value": "Feature value"
      }
    ]
  },
  "term": {
    "startPolicy": "SCHEDULED_START_TIME",
    "scheduledStartTime": {
      "year": 2026,
      "month": 5,
      "day": 6,
      "timeZone": {
        "id": "America/Los_Angeles"
      }
    },
    "endPolicy": "AFTER_DURATION",
    "durationMonths": 12,
    "maxRenewalCount": 1
  }
}' \
"https://commerceproducer.googleapis.com/v1beta/projects/YOUR_PROJECT_ID_OR_NUMBER/locations/global/privateOffers"