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:
- Software as a Service (SaaS)
(
SOFTWARE_AS_A_SERVICE) - Servizi professionali
(
PROFESSIONAL_SERVICES) - Prodotti di dati sulla condivisione BigQuery (in precedenza Analytics
Hub) (
ANALYTICS_HUB_LISTING)
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:
Abilita l'API Commerce Producer: abilita il servizio
commerceproducer.googleapis.comnel tuo progetto:gcloud services enable commerceproducer.googleapis.comPer istruzioni su come attivare i servizi, vedi Attivazione dei servizi.
Configura le librerie client: scarica gli SDK e le librerie client richiesti. Per maggiori dettagli, vedi Librerie client.
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:
- Elenca servizi: elenca i servizi nel tuo progetto per trovare quello per cui creare l'offerta privata.
- 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.
- Scopri quale offerta modificare: chiama
resolveAmendmentTargetper scoprire se la nuova offerta deve modificare un'offerta esistente o meno. - Crea l'offerta
(
create PrivateOffer): chiama l'API per creare una nuova risorsaPrivateOffernello statoDRAFT, definendo i dettagli di base, l'account clientebilling_namee i modelli di prezzi personalizzati. - Allega un documento
(
create PrivateOfferDocument): crea una risorsaPrivateOfferDocumente 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 campodocumentRequirementdella risorsaService:- Per la maggior parte dei servizi, come i prodotti SaaS e i dati,
documentRequirementelenca siaSTANDARD_END_USER_LICENSE_AGREEMENT_V2(EULA standard) siaCUSTOM_END_USER_LICENSE_AGREEMENT(EULA personalizzato) comeOPTIONALperchédocumentRequirementesprime solo regole per tipo. Devi comunque allegareSTANDARD_END_USER_LICENSE_AGREEMENT_V2oCUSTOM_END_USER_LICENSE_AGREEMENT. - Per i servizi professionali, il
STATEMENT_OF_WORK(SOW) èREQUIRED,CUSTOM_END_USER_LICENSE_AGREEMENTèOPTIONALe i contratti di licenza con l'utente finale (EULA) standard sonoNOT_ALLOWED. STANDARD_END_USER_LICENSE_AGREEMENT_V1è sostituito daSTANDARD_END_USER_LICENSE_AGREEMENT_V2ed è sempreNOT_ALLOWEDper le nuove offerte.
- Per la maggior parte dei servizi, come i prodotti SaaS e i dati,
- Pubblica l'offerta
(
publish): chiama il metodopublishper finalizzare l'offerta e renderla disponibile per l'accettazione da parte del cliente. Puoi utilizzare il flagvalidate_onlyper 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 comeDRAFT,PUBLISHEDeACCEPTED.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 campodocumentRequirementdella risorsaService. Tieni presente cheSTANDARD_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 statoDRAFT.Service: il nome del servizio, che è una risorsa di sola lettura che rappresenta un prodotto. Quando questo valore è impostato, ti aiuta a trovare qualiStandardOfferssono 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_SERVICESoANALYTICS_HUB_LISTING) oPRODUCT_TYPE_UNSPECIFIEDper qualsiasi altro tipo di prodotto.documentRequirement: i livelli di requisiti per tipo (REQUIRED,OPTIONALoNOT_ALLOWED) per i documenti allegati alle offerte private sul servizio. Un tipo di documento non elencato non è consentito. PoichédocumentRequirementesprime solo regole per tipo, elenca siaSTANDARD_END_USER_LICENSE_AGREEMENT_V2siaCUSTOM_END_USER_LICENSE_AGREEMENTcomeOPTIONALper 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 unService, 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.adminoroles/commercepricemanagement.privateOffersAdmin- In alternativa, anche il ruolo di base
roles/editorconcede l'accesso.
- In alternativa, anche il ruolo di base
- Per le azioni di sola lettura:
roles/commerceproducer.vieweroroles/commercepricemanagement.viewer- In alternativa, anche il ruolo di base
roles/viewerconcede l'accesso.
- In alternativa, anche il ruolo di base
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_PRORATEDstandard_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_UNSPECIFIEDstandard_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_PRORATEDstandard_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:30standard_interval_price.price_model.usage.sku_discounts[0].sku:SKU1(selezionaSKU1per applicare uno sconto personalizzato)standard_interval_price.price_model.usage.sku_discounts[0].discount_percent:40(specifica uno sconto del 40% suSKU1per 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_PRORATEDstandard_interval_price.price_model.commitment.commitment_amount:100(USD)standard_interval_price.price_model.commitment.discount_percent:20standard_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:100custom_interval_price.installments[0].price_model.commitment.discount_percent:20custom_interval_price.installments[0].price_model.commitment.additional_credit:25custom_interval_price.installments[0].price_model.commitment.discard_previous_credit_balance:trueofalse(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:200custom_interval_price.installments[1].price_model.commitment.discount_percent:10custom_interval_price.installments[1].price_model.commitment.additional_credit:25custom_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:200custom_interval_price.installments[2].price_model.commitment.discount_percent:10custom_interval_price.installments[2].price_model.commitment.additional_credit:0custom_interval_price.installments[2].price_model.commitment.discard_previous_credit_balance:false(non scartare il saldo precedente per consentire il rollover).
- Rata 1: impegno di 100 $, sconto del 20% (il cliente paga 80 $), 25 $
crediti aggiuntivi (per un totale di 125 $).
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:IMMEDIATEterm.end_policy:AFTER_DURATIONterm.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:IMMEDIATEterm.end_policy:SCHEDULED_END_TIMEterm.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_TIMEterm.scheduled_start_time:2027-01-01term.end_policy:AFTER_DURATIONterm.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_TIMEterm.scheduled_start_time:2027-01-01term.end_policy:SCHEDULED_END_TIMEterm.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_OFFERterm.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
amendedPrivateOfferoamendedStandardOffernell'offerta che crei. requiredPrivateOffer: imposta il campoamendedPrivateOfferdella nuova offerta su questo valore. Formato:projects/PROJECT/locations/global/privateOffers/PRIVATE_OFFER_IDrequiredStandardOffer: imposta il campoamendedStandardOfferdella nuova offerta su questo valore. Formato:projects/PROJECT/locations/global/services/SERVICE/standardOffers/OFFER_IDoptionalOffers: un elenco di offerte idonee che puoi modificare. Formato:projects/PROJECT/locations/global/privateOffers/PRIVATE_OFFER_IDPuoi eseguire una delle seguenti azioni:
- Imposta sia
amendedPrivateOffercheamendedStandardOffersu vuoto. La nuova offerta non modifica un'altra offerta. - Imposta
amendedPrivateOffersu una delle risorse dell'elencooptionalOffers.
- Imposta sia
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"