I'm trying to create an AccountBudgetProposal using the Google Ads API (v14), but I keep encountering the following error:
Request with ID "xxxx" failed with status "INVALID_ARGUMENT" and includes the following errors:
Error with message "You are not allowed to make changes to budgets."
On field: operation
Steps I've taken:
Verified Permissions:
- My account has "Standard" access level, which I believe should be sufficient.
- Confirmed that I have appropriate permissions to make changes to budgets.
Checked Billing Setup Status:
- Verified that the billing_setup_id is active and correctly formatted.
- Used the following code to check the status of the billing setup:
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
def get_billing_setup_status(client, customer_id, billing_setup_id):
ga_service = client.get_service("GoogleAdsService")
query = f"""
SELECT
billing_setup.id,
billing_setup.status
FROM billing_setup
WHERE billing_setup.resource_name = 'customers/{customer_id}/billingSetups/{billing_setup_id}'
"""
try:
response = ga_service.search(customer_id=customer_id, query=query)
for row in response:
billing_setup = row.billing_setup
status = billing_setup.status
status_name = client.enums.BillingSetupStatusEnum.BillingSetupStatus(status).name
print(f"Billing setup ID: {
billing_setup.id}, Status: {status_name}")
return status_name
except GoogleAdsException as ex:
print(f'Request with ID "{ex.request_id}" failed with status "{ex.error.code().name}" and includes the following errors:')
for error in ex.failure.errors:
print(f'\tError with message "{error.message}".')
if error.location:
for field_path_element in error.location.field_path_elements:
print(f'\t\tOn field: {field_path_element.field_name}')
return None
if __name__ == "__main__":
google_ads_client = GoogleAdsClient.load_from_storage('path_to_google_ads.yaml', version='v14')
customer_id = 'your_customer_id' # Replace with your customer ID
billing_setup_id = 'your_billing_setup_id' # Replace with your billing setup ID
billing_setup_status = get_billing_setup_status(google_ads_client, customer_id, billing_setup_id)
if billing_setup_status == "ACTIVE":
print(f"Billing setup {billing_setup_id} is active.")
else:
print(f"Billing setup {billing_setup_id} is not active or not found.")
Creating Account Budget Proposal:- Attempted to create the AccountBudgetProposal using the following code:
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
def create_account_budget_proposal(client, customer_id, billing_setup_id):
account_budget_proposal_service = client.get_service("AccountBudgetProposalService")
account_budget_proposal_operation = client.get_type("AccountBudgetProposalOperation")
proposal = account_budget_proposal_operation.create
proposal.proposal_type = client.enums.AccountBudgetProposalTypeEnum.CREATE
proposal.billing_setup = f'customers/{customer_id}/billingSetups/{billing_setup_id}'
proposal.proposed_name = "Account Budget Proposal (example)"
proposal.proposed_start_time_type = client.enums.TimeTypeEnum.NOW
proposal.proposed_end_time_type = client.enums.TimeTypeEnum.FOREVER
proposal.proposed_spending_limit_micros = 100000000 # Example amount: $100,000.00
try:
account_budget_proposal_response = account_budget_proposal_service.mutate_account_budget_proposals(
customer_id=customer_id,
operations=[account_budget_proposal_operation],
)
print(f"Created account budget proposal '{account_budget_proposal_response.results[0].resource_name}'.")
except GoogleAdsException as ex:
print(f'Request with ID "{ex.request_id}" failed with status "{ex.error.code().name}" and includes the following errors:')
for error in ex.failure.errors:
print(f'\tError with message "{error.message}".')
if error.location:
for field_path_element in error.location.field_path_elements:
print(f'\t\tOn field: {field_path_element.field_name}')
sys.exit(1)
if __name__ == "__main__":
google_ads_client = GoogleAdsClient.load_from_storage('path_to_google_ads.yaml', version='v14')
customer_id = 'your_customer_id' # Replace with your customer ID
billing_setup_id = 'your_billing_setup_id' # Replace with your billing setup ID
billing_setup_status = get_billing_setup_status(google_ads_client, customer_id, billing_setup_id)
if billing_setup_status == "ACTIVE":
create_account_budget_proposal(google_ads_client, customer_id, billing_setup_id)
else:
print("The billing setup ID is not active or not found. Please check the billing setup ID and try again.")
Questions:
- Are there any specific permissions required beyond "Standard" to make changes to budgets?
- Is there any additional configuration needed for billing_setup_id to be accepted?
- Could there be any other reason why I am encountering this error despite having the correct permissions and an active billing setup?
Any help or insights would be greatly appreciated. Thank you!