/// <summary> /// Creates a new <see cref="AdGroupCriterion"/> configured for an /// <code>ADD</code> operation. /// </summary> /// <param name="node">The node whose criterion should be added.</param> /// <param name="adGroupId">The ad group ID of the criterion.</param> /// <param name="idGenerator">The temporary ID generator for new nodes.</param> /// <returns>An <see cref="AdGroupCriterion"/> object for <code>ADD</code> /// operation.</returns> internal static AdGroupCriterion CreateCriterionForAdd(ProductPartitionNode node, long adGroupId, TemporaryIdGenerator idGenerator) { PreconditionUtilities.CheckNotNull(node, ShoppingMessages.NodeCannotBeNull); AdGroupCriterion adGroupCriterion; if (node.IsExcludedUnit) { adGroupCriterion = new NegativeAdGroupCriterion(); } else { adGroupCriterion = new BiddableAdGroupCriterion() { biddingStrategyConfiguration = node.GetBiddingConfig() }; } adGroupCriterion.adGroupId = adGroupId; adGroupCriterion.criterion = node.GetCriterion(); adGroupCriterion.criterion.id = node.ProductPartitionId; if (node.Parent != null) { (adGroupCriterion.criterion as ProductPartition).parentCriterionId = node.Parent.ProductPartitionId; } return adGroupCriterion; }
/// <summary> /// Creates a new <see cref="AdGroupCriterion"/> configured for an /// <code>ADD</code> operation. /// </summary> /// <param name="node">The node whose criterion should be added.</param> /// <param name="adGroupId">The ad group ID of the criterion.</param> /// <param name="idGenerator">The temporary ID generator for new nodes.</param> /// <returns>An <see cref="AdGroupCriterion"/> object for <code>ADD</code> /// operation.</returns> internal static AdGroupCriterion CreateCriterionForAdd(ProductPartitionNode node, long adGroupId, TemporaryIdGenerator idGenerator) { PreconditionUtilities.CheckNotNull(node, ShoppingMessages.NodeCannotBeNull); AdGroupCriterion adGroupCriterion; if (node.IsExcludedUnit) { adGroupCriterion = new NegativeAdGroupCriterion(); } else { adGroupCriterion = new BiddableAdGroupCriterion() { biddingStrategyConfiguration = node.GetBiddingConfig() }; } adGroupCriterion.adGroupId = adGroupId; adGroupCriterion.criterion = node.GetCriterion(); adGroupCriterion.criterion.id = node.ProductPartitionId; if (node.Parent != null) { (adGroupCriterion.criterion as ProductPartition).parentCriterionId = node.Parent.ProductPartitionId; } return(adGroupCriterion); }
/// <summary> /// Runs the code example. /// </summary> /// <param name="user">The AdWords user.</param> /// <param name="adGroupId">Id of the ad group to which criteria are /// added.</param> public void Run(AdWordsUser user, long adGroupId) { // Get the AdGroupCriterionService. AdGroupCriterionService adGroupCriterionService = (AdGroupCriterionService) user.GetService(AdWordsService.v201506.AdGroupCriterionService); // Create biddable ad group criterion for gender Gender genderTarget = new Gender(); // Criterion Id for male. The IDs can be found here // https://developers.google.com/adwords/api/docs/appendix/genders genderTarget.id = 10; BiddableAdGroupCriterion genderBiddableAdGroupCriterion = new BiddableAdGroupCriterion(); genderBiddableAdGroupCriterion.adGroupId = adGroupId; genderBiddableAdGroupCriterion.criterion = genderTarget; // Create negative ad group criterion for age range AgeRange ageRangeNegative = new AgeRange(); // Criterion Id for age 18 to 24. The IDs can be found here // https://developers.google.com/adwords/api/docs/appendix/ages ageRangeNegative.id = 503001; NegativeAdGroupCriterion ageRangeNegativeAdGroupCriterion = new NegativeAdGroupCriterion(); ageRangeNegativeAdGroupCriterion.adGroupId = adGroupId; ageRangeNegativeAdGroupCriterion.criterion = ageRangeNegative; // Create operations. AdGroupCriterionOperation genderBiddableAdGroupCriterionOperation = new AdGroupCriterionOperation(); genderBiddableAdGroupCriterionOperation.operand = genderBiddableAdGroupCriterion; genderBiddableAdGroupCriterionOperation.@operator = Operator.ADD; AdGroupCriterionOperation ageRangeNegativeAdGroupCriterionOperation = new AdGroupCriterionOperation(); ageRangeNegativeAdGroupCriterionOperation.operand = ageRangeNegativeAdGroupCriterion; ageRangeNegativeAdGroupCriterionOperation.@operator = Operator.ADD; AdGroupCriterionOperation[] operations = new AdGroupCriterionOperation[] { genderBiddableAdGroupCriterionOperation, ageRangeNegativeAdGroupCriterionOperation}; try { // Add ad group criteria. AdGroupCriterionReturnValue result = adGroupCriterionService.mutate(operations); // Display ad group criteria. if (result != null && result.value != null) { foreach (AdGroupCriterion adGroupCriterionResult in result.value) { Console.WriteLine("Ad group criterion with ad group id \"{0}\", criterion id " + "\"{1}\", and type \"{2}\" was added.", adGroupCriterionResult.adGroupId, adGroupCriterionResult.criterion.id, adGroupCriterionResult.criterion.CriterionType); } } else { Console.WriteLine("No ad group criteria were added."); } } catch (Exception ex) { throw new System.ApplicationException("Failed to create ad group criteria.", ex); } }
internal override void ProcessMappingsFromRowValues(RowValues values) { NegativeAdGroupCriterion = new NegativeAdGroupCriterion { Criterion = new GenderCriterion() { Type = typeof(GenderCriterion).Name, }, Type = typeof(NegativeAdGroupCriterion).Name }; values.ConvertToEntity(this, Mappings); }
/// <summary> /// Sets the Add action for a new AdGroupCriterion corresponding to the specified ProductCondition, /// and adds it to the helper's list of BulkAdGroupProductPartition. /// </summary> /// <param name="parent">The parent of the product partition unit that you want to add.</param> /// <param name="condition">The condition or product filter for the new product partition.</param> /// <param name="bidAmount">The bid amount for the new product partition.</param> /// <param name="isNegative">Indicates whether or not to add a NegativeAdGroupCriterion. /// The default value is false, in which case a BiddableAdGroupCriterion will be added.</param> /// <returns>The BulkAdGroupProductPartition that was added to the list of PartitionActions.</returns> public BulkAdGroupProductPartition AddUnit( BulkAdGroupProductPartition parent, ProductCondition condition, double bidAmount, bool isNegative, string clientId ) { AdGroupCriterion adGroupCriterion; if (isNegative) { adGroupCriterion = new NegativeAdGroupCriterion(); } else { adGroupCriterion = new BiddableAdGroupCriterion() { CriterionBid = new FixedBid() { Bid = new Bid() { Amount = bidAmount } }, DestinationUrl = "http://www.contoso.com/womenshoesale/?season=spring&promocode=PROMO123", }; } adGroupCriterion.Criterion = new ProductPartition() { // If the root node is a unit, it would not have a parent ParentCriterionId = parent != null && parent.AdGroupCriterion != null ? parent.AdGroupCriterion.Id : null, Condition = condition, PartitionType = ProductPartitionType.Unit }; adGroupCriterion.AdGroupId = this.adGroupId; var partitionAction = new BulkAdGroupProductPartition() { ClientId = clientId, AdGroupCriterion = adGroupCriterion }; this.partitionActions.Add(partitionAction); return(partitionAction); }
internal override void ProcessMappingsFromRowValues(RowValues values) { AdGroupCriterion = new NegativeAdGroupCriterion() { Criterion = new Webpage() { Parameter = new WebpageParameter(), Type = typeof(Webpage).Name, }, Type = typeof(NegativeAdGroupCriterion).Name }; values.ConvertToEntity(this, Mappings); }
/// <summary> /// Creates the criterion for product partition. /// </summary> /// <param name="partitionId">The product partition ID.</param> /// <param name="parentPartitionId">The proudct partition ID for parent node.</param> /// <param name="caseValue">The case value.</param> /// <param name="isUnit">True, if the node is UNIT node, false otherwise.</param> /// <param name="isExcluded">True, if the node is EXCLUDE node, false otherwise.</param> /// <param name="bid">The bid to be set on a node, if it is UNIT.</param> /// <returns>An ad group criterion node for the product partition.</returns> internal static AdGroupCriterion CreateCriterionForProductPartition(long partitionId, long parentPartitionId, ProductDimension caseValue, bool isUnit, bool isExcluded, long bid) { AdGroupCriterion adGroupCriterion; ProductPartition partition = new ProductPartition() { id = partitionId, parentCriterionId = parentPartitionId, caseValue = caseValue, partitionType = isUnit ? ProductPartitionType.UNIT : ProductPartitionType.SUBDIVISION }; if (isExcluded) { NegativeAdGroupCriterion negative = new NegativeAdGroupCriterion(); adGroupCriterion = negative; } else { BiddableAdGroupCriterion biddable = new BiddableAdGroupCriterion(); biddable.userStatus = UserStatus.ENABLED; BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration(); if (isUnit && bid != 0) { CpcBid cpcBid = new CpcBid() { bid = new Money() { microAmount = bid }, cpcBidSource = BidSource.CRITERION }; biddingConfig.bids = new Bids[] { cpcBid }; } biddable.biddingStrategyConfiguration = biddingConfig; adGroupCriterion = biddable; } adGroupCriterion.criterion = partition; return(adGroupCriterion); }
/// <summary> /// Sets the Add action for a new AdGroupCriterion corresponding to the specified ProductCondition, /// and adds it to the helper's list of AdGroupCriterionAction. /// </summary> /// <param name="parent">The parent of the product partition unit that you want to add.</param> /// <param name="condition">The condition or product filter for the new product partition.</param> /// <param name="bidAmount">The bid amount for the new product partition.</param> /// <param name="isNegative">Indicates whether or not to add a NegativeAdGroupCriterion. /// The default value is false, in which case a BiddableAdGroupCriterion will be added.</param> /// <returns>The ad group criterion that was added to the list of PartitionActions.</returns> public AdGroupCriterion AddUnit( AdGroupCriterion parent, ProductCondition condition, double bidAmount, bool isNegative ) { AdGroupCriterion adGroupCriterion; if (isNegative) { adGroupCriterion = new NegativeAdGroupCriterion(); } else { adGroupCriterion = new BiddableAdGroupCriterion() { CriterionBid = new FixedBid() { Bid = new Bid() { Amount = bidAmount } } }; } adGroupCriterion.Criterion = new ProductPartition() { // If the root node is a unit, it would not have a parent ParentCriterionId = parent != null ? parent.Id : null, Condition = condition, PartitionType = ProductPartitionType.Unit }; adGroupCriterion.AdGroupId = this.adGroupId; var partitionAction = new AdGroupCriterionAction() { Action = ItemAction.Add, AdGroupCriterion = adGroupCriterion }; this.partitionActions.Add(partitionAction); return(adGroupCriterion); }
/// <summary> /// Creates the unit. /// </summary> /// <param name="parent">The node that should be this node's parent. /// </param> /// <param name="value">The value being paritioned on.</param> /// <param name="bidAmount">The amount to bid for matching products, /// in micros.</param> /// <param name="isNegative">True, if this is negative criterion, false /// otherwise.</param> /// <returns>A new unit node.</returns> public ProductPartition CreateUnit(ProductPartition parent, ProductDimension value, long bidAmount, bool isNegative) { ProductPartition unit = new ProductPartition(); unit.partitionType = ProductPartitionType.UNIT; // The root node has neither a parent nor a value. if (parent != null) { unit.parentCriterionId = parent.id; unit.caseValue = value; } AdGroupCriterion criterion; if (isNegative) { criterion = new NegativeAdGroupCriterion(); } else { BiddingStrategyConfiguration biddingStrategyConfiguration = new BiddingStrategyConfiguration(); CpcBid cpcBid = new CpcBid(); cpcBid.bid = new Money(); cpcBid.bid.microAmount = bidAmount; biddingStrategyConfiguration.bids = new Bids[] { cpcBid }; criterion = new BiddableAdGroupCriterion(); (criterion as BiddableAdGroupCriterion).biddingStrategyConfiguration = biddingStrategyConfiguration; } criterion.adGroupId = this.adGroupId; criterion.criterion = unit; this.CreateAddOperation(criterion); return(unit); }
/// <summary> /// Sets the Add action for a new AdGroupCriterion corresponding to the specified ProductCondition, /// and adds it to the helper's list of AdGroupCriterionAction. /// </summary> /// <param name="parent">The parent of the product partition unit that you want to add.</param> /// <param name="condition">The condition or product filter for the new product partition.</param> /// <param name="bidAmount">The bid amount for the new product partition.</param> /// <param name="isNegative">Indicates whether or not to add a NegativeAdGroupCriterion. /// The default value is false, in which case a BiddableAdGroupCriterion will be added.</param> /// <returns>The ad group criterion that was added to the list of PartitionActions.</returns> public AdGroupCriterion AddUnit( AdGroupCriterion parent, ProductCondition condition, double bidAmount, bool isNegative ) { AdGroupCriterion adGroupCriterion; if (isNegative) { adGroupCriterion = new NegativeAdGroupCriterion(); } else { adGroupCriterion = new BiddableAdGroupCriterion() { CriterionBid = new FixedBid() { Bid = new Bid() { Amount = bidAmount } } }; } adGroupCriterion.Criterion = new ProductPartition() { // If the root node is a unit, it would not have a parent ParentCriterionId = parent != null ? parent.Id : null, Condition = condition, PartitionType = ProductPartitionType.Unit }; adGroupCriterion.AdGroupId = this.adGroupId; var partitionAction = new AdGroupCriterionAction() { Action = ItemAction.Add, AdGroupCriterion = adGroupCriterion }; this.partitionActions.Add(partitionAction); return adGroupCriterion; }
/// <summary> /// Runs the code example. /// </summary> /// <param name="user">The AdWords user.</param> /// <param name="adGroupId">Id of the ad group to which criteria are /// added.</param> public void Run(AdWordsUser user, long adGroupId) { using (AdGroupCriterionService adGroupCriterionService = (AdGroupCriterionService)user.GetService(AdWordsService.v201809 .AdGroupCriterionService)) { // Create biddable ad group criterion for gender Gender genderTarget = new Gender { // Criterion Id for male. The IDs can be found here // https://developers.google.com/adwords/api/docs/appendix/genders id = 10 }; BiddableAdGroupCriterion genderBiddableAdGroupCriterion = new BiddableAdGroupCriterion { adGroupId = adGroupId, criterion = genderTarget }; // Create negative ad group criterion for age range AgeRange ageRangeNegative = new AgeRange { // Criterion Id for age 18 to 24. The IDs can be found here // https://developers.google.com/adwords/api/docs/appendix/ages id = 503001 }; NegativeAdGroupCriterion ageRangeNegativeAdGroupCriterion = new NegativeAdGroupCriterion { adGroupId = adGroupId, criterion = ageRangeNegative }; // Create operations. AdGroupCriterionOperation genderBiddableAdGroupCriterionOperation = new AdGroupCriterionOperation { operand = genderBiddableAdGroupCriterion, @operator = Operator.ADD }; AdGroupCriterionOperation ageRangeNegativeAdGroupCriterionOperation = new AdGroupCriterionOperation { operand = ageRangeNegativeAdGroupCriterion, @operator = Operator.ADD }; AdGroupCriterionOperation[] operations = new AdGroupCriterionOperation[] { genderBiddableAdGroupCriterionOperation, ageRangeNegativeAdGroupCriterionOperation }; try { // Add ad group criteria. AdGroupCriterionReturnValue result = adGroupCriterionService.mutate(operations); // Display ad group criteria. if (result != null && result.value != null) { foreach (AdGroupCriterion adGroupCriterionResult in result.value) { Console.WriteLine( "Ad group criterion with ad group id \"{0}\", criterion id " + "\"{1}\", and type \"{2}\" was added.", adGroupCriterionResult.adGroupId, adGroupCriterionResult.criterion.id, adGroupCriterionResult.criterion.CriterionType); } } else { Console.WriteLine("No ad group criteria were added."); } } catch (Exception e) { throw new System.ApplicationException("Failed to create ad group criteria.", e); } } }
/// <summary> /// Sets the Add action for a new AdGroupCriterion corresponding to the specified ProductCondition, /// and adds it to the helper's list of BulkAdGroupProductPartition. /// </summary> /// <param name="parent">The parent of the product partition unit that you want to add.</param> /// <param name="condition">The condition or product filter for the new product partition.</param> /// <param name="bidAmount">The bid amount for the new product partition.</param> /// <param name="isNegative">Indicates whether or not to add a NegativeAdGroupCriterion. /// The default value is false, in which case a BiddableAdGroupCriterion will be added.</param> /// <returns>The BulkAdGroupProductPartition that was added to the list of PartitionActions.</returns> public BulkAdGroupProductPartition AddUnit( BulkAdGroupProductPartition parent, ProductCondition condition, double bidAmount, bool isNegative, string clientId ) { AdGroupCriterion adGroupCriterion; if (isNegative) { adGroupCriterion = new NegativeAdGroupCriterion(); } else { adGroupCriterion = new BiddableAdGroupCriterion() { CriterionBid = new FixedBid() { Bid = new Bid() { Amount = bidAmount } }, DestinationUrl = "http://www.contoso.com/womenshoesale/?season=spring&promocode=PROMO123", }; } adGroupCriterion.Criterion = new ProductPartition() { // If the root node is a unit, it would not have a parent ParentCriterionId = parent != null && parent.AdGroupCriterion != null ? parent.AdGroupCriterion.Id : null, Condition = condition, PartitionType = ProductPartitionType.Unit }; adGroupCriterion.AdGroupId = this.adGroupId; var partitionAction = new BulkAdGroupProductPartition() { ClientId = clientId, AdGroupCriterion = adGroupCriterion }; this.partitionActions.Add(partitionAction); return partitionAction; }
/// <summary> /// Creates the unit. /// </summary> /// <param name="parent">The node that should be this node's parent. /// </param> /// <param name="value">The value being paritioned on.</param> /// <param name="bidAmount">The amount to bid for matching products, /// in micros.</param> /// <param name="isNegative">True, if this is negative criterion, false /// otherwise.</param> /// <returns>A new unit node.</returns> public ProductPartition CreateUnit(ProductPartition parent, ProductDimension value, long bidAmount, bool isNegative) { ProductPartition unit = new ProductPartition(); unit.partitionType = ProductPartitionType.UNIT; // The root node has neither a parent nor a value. if (parent != null) { unit.parentCriterionId = parent.id; unit.caseValue = value; } AdGroupCriterion criterion; if (isNegative) { criterion = new NegativeAdGroupCriterion(); } else { BiddingStrategyConfiguration biddingStrategyConfiguration = new BiddingStrategyConfiguration(); CpcBid cpcBid = new CpcBid(); cpcBid.bid = new Money(); cpcBid.bid.microAmount = bidAmount; biddingStrategyConfiguration.bids = new Bids[] { cpcBid }; criterion = new BiddableAdGroupCriterion(); (criterion as BiddableAdGroupCriterion).biddingStrategyConfiguration = biddingStrategyConfiguration; } criterion.adGroupId = this.adGroupId; criterion.criterion = unit; this.CreateAddOperation(criterion); return unit; }
public async override Task RunAsync(AuthorizationData authorizationData) { try { ApiEnvironment environment = ((OAuthDesktopMobileAuthCodeGrant)authorizationData.Authentication).Environment; AdInsightExampleHelper AdInsightExampleHelper = new AdInsightExampleHelper( OutputStatusMessageDefault: this.OutputStatusMessage); AdInsightExampleHelper.AdInsightService = new ServiceClient <IAdInsightService>( authorizationData: authorizationData, environment: environment); CampaignManagementExampleHelper CampaignManagementExampleHelper = new CampaignManagementExampleHelper( OutputStatusMessageDefault: this.OutputStatusMessage); CampaignManagementExampleHelper.CampaignManagementService = new ServiceClient <ICampaignManagementService>( authorizationData: authorizationData, environment: environment); // To get started with dynamic search ads, first you'll need to add a new Campaign // with its type set to DynamicSearchAds. When you create the campaign, you'll need to // include a DynamicSearchAdsSetting that specifies the target website domain and language. var campaigns = new[] { new Campaign { BudgetType = Microsoft.BingAds.V13.CampaignManagement.BudgetLimitType.DailyBudgetStandard, DailyBudget = 50, CampaignType = CampaignType.DynamicSearchAds, Languages = new string[] { "All" }, Name = "Women's Shoes " + DateTime.UtcNow, TimeZone = "PacificTimeUSCanadaTijuana", Settings = new [] { new DynamicSearchAdsSetting { DomainName = "contoso.com", Language = "English" } }, }, }; OutputStatusMessage("-----\nAddCampaigns:"); AddCampaignsResponse addCampaignsResponse = await CampaignManagementExampleHelper.AddCampaignsAsync( accountId : authorizationData.AccountId, campaigns : campaigns); long?[] campaignIds = addCampaignsResponse.CampaignIds.ToArray(); Microsoft.BingAds.V13.CampaignManagement.BatchError[] campaignErrors = addCampaignsResponse.PartialErrors.ToArray(); OutputStatusMessage("CampaignIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(campaignIds); OutputStatusMessage("PartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchError(campaignErrors); // Create a new ad group within the dynamic search ads campaign. var adGroups = new[] { new AdGroup { Name = "Women's Red Shoe Sale", StartDate = null, EndDate = new Date { Month = 12, Day = 31, Year = DateTime.UtcNow.Year + 1 }, CpcBid = new Bid { Amount = 0.09 }, } }; OutputStatusMessage("-----\nAddAdGroups:"); AddAdGroupsResponse addAdGroupsResponse = await CampaignManagementExampleHelper.AddAdGroupsAsync( campaignId : (long)campaignIds[0], adGroups : adGroups, returnInheritedBidStrategyTypes : false); long?[] adGroupIds = addAdGroupsResponse.AdGroupIds.ToArray(); Microsoft.BingAds.V13.CampaignManagement.BatchError[] adGroupErrors = addAdGroupsResponse.PartialErrors.ToArray(); OutputStatusMessage("AdGroupIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupIds); OutputStatusMessage("PartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchError(adGroupErrors); // You can add one or more Webpage criteria to each ad group that helps determine // whether or not to serve dynamic search ads. var adGroupCriterions = new List <AdGroupCriterion>(); var adGroupWebpagePositivePageContent = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new FixedBid { Amount = 0.50 }, Criterion = new Webpage { Parameter = new WebpageParameter { Conditions = new[] { new WebpageCondition { Argument = "flowers", Operand = WebpageConditionOperand.PageContent, } }, CriterionName = "Ad Group Webpage Positive Page Content Criterion" }, }, }; adGroupCriterions.Add(adGroupWebpagePositivePageContent); // To discover the categories that you can use for Webpage criteria (positive or negative), // use the GetDomainCategories operation with the Ad Insight service. OutputStatusMessage("-----\nGetDomainCategories:"); var getDomainCategoriesResponse = await AdInsightExampleHelper.GetDomainCategoriesAsync( categoryName : null, domainName : DOMAIN_NAME, language : LANGUAGE); var categories = getDomainCategoriesResponse.Categories; OutputStatusMessage("Categories:"); AdInsightExampleHelper.OutputArrayOfDomainCategory(categories); // If any categories are available let's use one as a condition. if (categories.Count > 0) { var adGroupWebpagePositiveCategory = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new FixedBid { Amount = 0.50 }, Criterion = new Webpage { Parameter = new WebpageParameter { Conditions = new[] { new WebpageCondition { Argument = categories[0].CategoryName, Operand = WebpageConditionOperand.Category, } }, CriterionName = "Ad Group Webpage Positive Category Criterion" }, } }; adGroupCriterions.Add(adGroupWebpagePositiveCategory); } // If you want to exclude certain portions of your website, you can add negative Webpage // criterion at the campaign and ad group level. var adGroupWebpageNegativeUrl = new NegativeAdGroupCriterion { AdGroupId = (long)adGroupIds[0], Criterion = new Webpage { Parameter = new WebpageParameter { // You can choose whether you want the criterion argument to match partial URLs, // page content, page title, or categories that Bing thinks applies to your website. Conditions = new[] { new WebpageCondition { Argument = DOMAIN_NAME, Operand = WebpageConditionOperand.Url, } }, // If you do not specify any name, then it will be set to a concatenated list of conditions. CriterionName = null } }, }; adGroupCriterions.Add(adGroupWebpageNegativeUrl); OutputStatusMessage("-----\nAddAdGroupCriterions:"); CampaignManagementExampleHelper.OutputArrayOfAdGroupCriterion(adGroupCriterions); AddAdGroupCriterionsResponse addAdGroupCriterionsResponse = await CampaignManagementExampleHelper.AddAdGroupCriterionsAsync( adGroupCriterions : adGroupCriterions, criterionType : AdGroupCriterionType.Webpage); long?[] adGroupCriterionIds = addAdGroupCriterionsResponse.AdGroupCriterionIds.ToArray(); OutputStatusMessage("AdGroupCriterionIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupCriterionIds); BatchErrorCollection[] adGroupCriterionErrors = addAdGroupCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("NestedPartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchErrorCollection(adGroupCriterionErrors); // The negative Webpage criterion at the campaign level applies to all ad groups // within the campaign; however, if you define ad group level negative Webpage criterion, // the campaign criterion is ignored for that ad group. var campaignCriterions = new List <CampaignCriterion>(); var campaignWebpageNegative = new NegativeCampaignCriterion { CampaignId = (long)campaignIds[0], Criterion = new Webpage { Parameter = new WebpageParameter { Conditions = new[] { new WebpageCondition { Argument = DOMAIN_NAME + "\\seattle", Operand = WebpageConditionOperand.Url, } }, CriterionName = "Campaign Negative Webpage Url Criterion" } } }; campaignCriterions.Add(campaignWebpageNegative); OutputStatusMessage("-----\nAddCampaignCriterions:"); CampaignManagementExampleHelper.OutputArrayOfCampaignCriterion(campaignCriterions); AddCampaignCriterionsResponse addCampaignCriterionsResponse = await CampaignManagementExampleHelper.AddCampaignCriterionsAsync( campaignCriterions : campaignCriterions, criterionType : CampaignCriterionType.Webpage); long?[] campaignCriterionIds = addCampaignCriterionsResponse.CampaignCriterionIds.ToArray(); OutputStatusMessage("CampaignCriterionIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(campaignCriterionIds); BatchErrorCollection[] campaignCriterionErrors = addCampaignCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("NestedPartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchErrorCollection(campaignCriterionErrors); // Finally you must add at least one DynamicSearchAd into the ad group. The ad title and display URL // are generated automatically based on the website domain and language that you want to target. var ads = new Ad[] { new DynamicSearchAd { Text = "Find New Customers & Increase Sales! Start Advertising on Contoso Today.", Path1 = "seattle", Path2 = "shoe sale", // You cannot set FinalUrls for dynamic search ads. // The Final URL will be a dynamically selected landing page. // The final URL is distinct from the path that customers will see and click on in your ad. FinalUrls = null, }, }; OutputStatusMessage("-----\nAddAds:"); AddAdsResponse addAdsResponse = await CampaignManagementExampleHelper.AddAdsAsync( adGroupId : (long)adGroupIds[0], ads : ads); long?[] adIds = addAdsResponse.AdIds.ToArray(); Microsoft.BingAds.V13.CampaignManagement.BatchError[] adErrors = addAdsResponse.PartialErrors.ToArray(); OutputStatusMessage("AdIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(adIds); OutputStatusMessage("PartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchError(adErrors); // Delete the campaign and everything it contains e.g., ad groups and ads. OutputStatusMessage("-----\nDeleteCampaigns:"); await CampaignManagementExampleHelper.DeleteCampaignsAsync( accountId : authorizationData.AccountId, campaignIds : new[] { (long)campaignIds[0] }); OutputStatusMessage(string.Format("Deleted Campaign Id {0}", campaignIds[0])); } // Catch authentication exceptions catch (OAuthTokenRequestException ex) { OutputStatusMessage(string.Format("Couldn't get OAuth tokens. Error: {0}. Description: {1}", ex.Details.Error, ex.Details.Description)); } // Catch Campaign Management service exceptions catch (FaultException <Microsoft.BingAds.V13.CampaignManagement.AdApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.Errors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <Microsoft.BingAds.V13.CampaignManagement.ApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <Microsoft.BingAds.V13.CampaignManagement.EditorialApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (Exception ex) { OutputStatusMessage(ex.Message); } }
public async override Task RunAsync(AuthorizationData authorizationData) { try { ApiEnvironment environment = ((OAuthDesktopMobileAuthCodeGrant)authorizationData.Authentication).Environment; CampaignManagementExampleHelper CampaignManagementExampleHelper = new CampaignManagementExampleHelper( OutputStatusMessageDefault: this.OutputStatusMessage); CampaignManagementExampleHelper.CampaignManagementService = new ServiceClient <ICampaignManagementService>( authorizationData: authorizationData, environment: environment); // Create an Audience campaign with one ad group. var campaigns = new[] { new Campaign { BudgetType = BudgetLimitType.DailyBudgetStandard, // CampaignType must be set for Audience campaigns CampaignType = CampaignType.Audience, DailyBudget = 50, Description = "Red shoes line.", // Languages must be set for Audience campaigns Languages = new string[] { "All" }, Name = "Women's Shoes " + DateTime.UtcNow, TimeZone = "PacificTimeUSCanadaTijuana", }, }; OutputStatusMessage("-----\nAddCampaigns:"); AddCampaignsResponse addCampaignsResponse = await CampaignManagementExampleHelper.AddCampaignsAsync( accountId : authorizationData.AccountId, campaigns : campaigns, includeDynamicSearchAdsSource : false); long?[] campaignIds = addCampaignsResponse.CampaignIds.ToArray(); BatchError[] campaignErrors = addCampaignsResponse.PartialErrors.ToArray(); OutputStatusMessage("CampaignIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(campaignIds); OutputStatusMessage("PartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchError(campaignErrors); // Add an ad group within the campaign. var adGroups = new[] { new AdGroup { Name = "Women's Red Shoe Sale", StartDate = null, EndDate = new Date { Month = 12, Day = 31, Year = DateTime.UtcNow.Year + 1 }, CpcBid = new Bid { Amount = 0.09 }, // Network cannot be set for ad groups in Audience campaigns Network = null, Settings = new[] { new TargetSetting { // Sets the "target and bid" option for CompanyName, Industry, and JobFunction. // Microsoft will only deliver ads to people who meet at least one of your criteria. // By default the "bid only" option is set for Audience, Age, and Gender. // Microsoft will deliver ads to all audiences, ages, and genders, if they meet // your company name, industry, or job function criteria. Details = new [] { new TargetSettingDetail { CriterionTypeGroup = CriterionTypeGroup.CompanyName, TargetAndBid = true }, new TargetSettingDetail { CriterionTypeGroup = CriterionTypeGroup.Industry, TargetAndBid = true }, new TargetSettingDetail { CriterionTypeGroup = CriterionTypeGroup.JobFunction, TargetAndBid = true }, } } }, } }; OutputStatusMessage("-----\nAddAdGroups:"); AddAdGroupsResponse addAdGroupsResponse = await CampaignManagementExampleHelper.AddAdGroupsAsync( campaignId : (long)campaignIds[0], adGroups : adGroups, returnInheritedBidStrategyTypes : false); long?[] adGroupIds = addAdGroupsResponse.AdGroupIds.ToArray(); BatchError[] adGroupErrors = addAdGroupsResponse.PartialErrors.ToArray(); OutputStatusMessage("AdGroupIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupIds); OutputStatusMessage("PartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchError(adGroupErrors); // Whether or not the "target and bid" option has been set for a given // criterion type group, you can set bid adjustments for specific criteria. var adGroupCriterions = new List <AdGroupCriterion>(); var adGroupCompanyNameCriterion = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new BidMultiplier { Multiplier = 15 }, Criterion = new ProfileCriterion { ProfileId = 808251207, // Microsoft ProfileType = ProfileType.CompanyName }, }; adGroupCriterions.Add(adGroupCompanyNameCriterion); var adGroupIndustryCriterion = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new BidMultiplier { Multiplier = 20 }, Criterion = new ProfileCriterion { ProfileId = 807658654, // Computer & Network Security ProfileType = ProfileType.Industry }, }; adGroupCriterions.Add(adGroupIndustryCriterion); var adGroupJobFunctionCriterion = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new BidMultiplier { Multiplier = 25 }, Criterion = new ProfileCriterion { ProfileId = 807658477, // Engineering ProfileType = ProfileType.JobFunction }, }; adGroupCriterions.Add(adGroupJobFunctionCriterion); // Exclude ages twenty-five through thirty-four. var adGroupNegativeAgeCriterion = new NegativeAdGroupCriterion { AdGroupId = (long)adGroupIds[0], Criterion = new AgeCriterion { AgeRange = AgeRange.TwentyFiveToThirtyFour }, }; adGroupCriterions.Add(adGroupNegativeAgeCriterion); OutputStatusMessage("-----\nAddAdGroupCriterions:"); CampaignManagementExampleHelper.OutputArrayOfAdGroupCriterion(adGroupCriterions); AddAdGroupCriterionsResponse addAdGroupCriterionsResponse = await CampaignManagementExampleHelper.AddAdGroupCriterionsAsync( adGroupCriterions : adGroupCriterions, criterionType : AdGroupCriterionType.Targets); long?[] adGroupCriterionIds = addAdGroupCriterionsResponse.AdGroupCriterionIds.ToArray(); OutputStatusMessage("AdGroupCriterionIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupCriterionIds); BatchErrorCollection[] adGroupCriterionErrors = addAdGroupCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("NestedPartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchErrorCollection(adGroupCriterionErrors); // Delete the campaign and everything it contains e.g., ad groups and ads. OutputStatusMessage("-----\nDeleteCampaigns:"); await CampaignManagementExampleHelper.DeleteCampaignsAsync( accountId : authorizationData.AccountId, campaignIds : new[] { (long)campaignIds[0] }); OutputStatusMessage(string.Format("Deleted Campaign Id {0}", campaignIds[0])); } // Catch authentication exceptions catch (OAuthTokenRequestException ex) { OutputStatusMessage(string.Format("Couldn't get OAuth tokens. Error: {0}. Description: {1}", ex.Details.Error, ex.Details.Description)); } // Catch Campaign Management service exceptions catch (FaultException <AdApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.Errors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <ApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <EditorialApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (Exception ex) { OutputStatusMessage(ex.Message); } }
/// <summary> /// Creates the criterion for product partition. /// </summary> /// <param name="partitionId">The product partition ID.</param> /// <param name="parentPartitionId">The proudct partition ID for parent node.</param> /// <param name="caseValue">The case value.</param> /// <param name="isUnit">True, if the node is UNIT node, false otherwise.</param> /// <param name="isExcluded">True, if the node is EXCLUDE node, false otherwise.</param> /// <param name="bid">The bid to be set on a node, if it is UNIT.</param> /// <returns>An ad group criterion node for the product partition.</returns> internal static AdGroupCriterion CreateCriterionForProductPartition(long partitionId, long parentPartitionId, ProductDimension caseValue, bool isUnit, bool isExcluded, long bid) { AdGroupCriterion adGroupCriterion; ProductPartition partition = new ProductPartition() { id = partitionId, parentCriterionId = parentPartitionId, caseValue = caseValue, partitionType = isUnit ? ProductPartitionType.UNIT : ProductPartitionType.SUBDIVISION }; if (isExcluded) { NegativeAdGroupCriterion negative = new NegativeAdGroupCriterion(); adGroupCriterion = negative; } else { BiddableAdGroupCriterion biddable = new BiddableAdGroupCriterion(); biddable.userStatus = UserStatus.ENABLED; BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration(); if (isUnit && bid != 0) { CpcBid cpcBid = new CpcBid() { bid = new Money() { microAmount = bid }, cpcBidSource = BidSource.CRITERION }; biddingConfig.bids = new Bids[] { cpcBid }; } biddable.biddingStrategyConfiguration = biddingConfig; adGroupCriterion = biddable; } adGroupCriterion.criterion = partition; return adGroupCriterion; }
public async override Task RunAsync(AuthorizationData authorizationData) { try { ApiEnvironment environment = ((OAuthDesktopMobileAuthCodeGrant)authorizationData.Authentication).Environment; CampaignManagementExampleHelper CampaignManagementExampleHelper = new CampaignManagementExampleHelper( OutputStatusMessageDefault: this.OutputStatusMessage); CampaignManagementExampleHelper.CampaignManagementService = new ServiceClient <ICampaignManagementService>( authorizationData: authorizationData, environment: environment); // Setup a campaign with one ad group. var campaigns = new[] { new Campaign { Name = "Women's Shoes " + DateTime.UtcNow, BudgetId = null, DailyBudget = 50, BudgetType = BudgetLimitType.DailyBudgetStandard, Languages = new string[] { "All" }, TimeZone = "PacificTimeUSCanadaTijuana", }, }; OutputStatusMessage("-----\nAddCampaigns:"); AddCampaignsResponse addCampaignsResponse = await CampaignManagementExampleHelper.AddCampaignsAsync( accountId : authorizationData.AccountId, campaigns : campaigns); long?[] campaignIds = addCampaignsResponse.CampaignIds.ToArray(); BatchError[] campaignErrors = addCampaignsResponse.PartialErrors.ToArray(); OutputStatusMessage("CampaignIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(campaignIds); OutputStatusMessage("PartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchError(campaignErrors); // Add an ad group within the campaign. var adGroups = new[] { new AdGroup { Name = "Women's Red Shoe Sale", StartDate = null, EndDate = new Date { Month = 12, Day = 31, Year = DateTime.UtcNow.Year + 1 }, CpcBid = new Bid { Amount = 0.09 }, } }; OutputStatusMessage("-----\nAddAdGroups:"); AddAdGroupsResponse addAdGroupsResponse = await CampaignManagementExampleHelper.AddAdGroupsAsync( campaignId : (long)campaignIds[0], adGroups : adGroups, returnInheritedBidStrategyTypes : false); long?[] adGroupIds = addAdGroupsResponse.AdGroupIds.ToArray(); BatchError[] adGroupErrors = addAdGroupsResponse.PartialErrors.ToArray(); OutputStatusMessage("AdGroupIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupIds); OutputStatusMessage("PartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchError(adGroupErrors); // When you first create a campaign or ad group using the Bing Ads API, it will not have any // target criteria. Effectively, the brand new campaign and ad group target all ages, days, hours, // devices, genders, and locations. As a best practice, you should consider at a minimum // adding a campaign location criterion corresponding to the customer market country. var campaignCriterions = new List <CampaignCriterion>(); var campaignLocationCriterion = new BiddableCampaignCriterion { CampaignId = (long)campaignIds[0], Criterion = new LocationCriterion { // United States LocationId = 190, Type = "LocationCriterion" }, CriterionBid = new BidMultiplier { Multiplier = 20 }, }; campaignCriterions.Add(campaignLocationCriterion); OutputStatusMessage("-----\nAddCampaignCriterions:"); var addCampaignCriterionsResponse = await CampaignManagementExampleHelper.AddCampaignCriterionsAsync( campaignCriterions : campaignCriterions, criterionType : CampaignCriterionType.Targets); long?[] campaignCriterionIds = addCampaignCriterionsResponse.CampaignCriterionIds.ToArray(); OutputStatusMessage("CampaignCriterionIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(campaignCriterionIds); BatchErrorCollection[] campaignCriterionErrors = addCampaignCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("NestedPartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchErrorCollection(campaignCriterionErrors); // A negative location criterion is an excluded location. // Ads in this ad group will not be shown to people in Redmond, WA. var adGroupCriterions = new List <AdGroupCriterion>(); var adGroupNegativeAgeCriterion = new NegativeAdGroupCriterion { AdGroupId = (long)adGroupIds[0], Criterion = new LocationCriterion { // Redmond|Washington|United States LocationId = 67555, Type = "LocationCriterion" }, }; adGroupCriterions.Add(adGroupNegativeAgeCriterion); OutputStatusMessage("-----\nAddAdGroupCriterions:"); var addAdGroupCriterionsResponse = await CampaignManagementExampleHelper.AddAdGroupCriterionsAsync( adGroupCriterions : adGroupCriterions, criterionType : AdGroupCriterionType.Targets); long?[] adGroupCriterionIds = addAdGroupCriterionsResponse.AdGroupCriterionIds.ToArray(); OutputStatusMessage("AdGroupCriterionIds:"); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupCriterionIds); BatchErrorCollection[] adGroupCriterionErrors = addAdGroupCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("NestedPartialErrors:"); CampaignManagementExampleHelper.OutputArrayOfBatchErrorCollection(adGroupCriterionErrors); // Delete the campaign and everything it contains e.g., ad groups and ads. OutputStatusMessage("-----\nDeleteCampaigns:"); await CampaignManagementExampleHelper.DeleteCampaignsAsync( accountId : authorizationData.AccountId, campaignIds : new[] { (long)campaignIds[0] }); OutputStatusMessage(string.Format("Deleted Campaign Id {0}", campaignIds[0])); } // Catch authentication exceptions catch (OAuthTokenRequestException ex) { OutputStatusMessage(string.Format("Couldn't get OAuth tokens. Error: {0}. Description: {1}", ex.Details.Error, ex.Details.Description)); } // Catch Campaign Management service exceptions catch (FaultException <AdApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.Errors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <ApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <EditorialApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (Exception ex) { OutputStatusMessage(ex.Message); } }
/// <summary> /// Sets the Add action for a new AdGroupCriterion corresponding to the specified ProductCondition, /// and adds it to the helper's list of BulkAdGroupProductPartition. /// </summary> /// <param name="parent">The parent of the product partition unit that you want to add.</param> /// <param name="condition">The condition or product filter for the new product partition.</param> /// <param name="bidAmount">The bid amount for the new product partition.</param> /// <param name="isNegative">Indicates whether or not to add a NegativeAdGroupCriterion. /// The default value is false, in which case a BiddableAdGroupCriterion will be added.</param> /// <returns>The BulkAdGroupProductPartition that was added to the list of PartitionActions.</returns> public BulkAdGroupProductPartition AddUnit( BulkAdGroupProductPartition parent, ProductCondition condition, double bidAmount, bool isNegative, string clientId ) { AdGroupCriterion adGroupCriterion; if (isNegative) { adGroupCriterion = new NegativeAdGroupCriterion(); } else { adGroupCriterion = new BiddableAdGroupCriterion() { CriterionBid = new FixedBid() { Amount = bidAmount }, // This destination URL is used if specified; otherwise, the destination URL is determined // by the corresponding value of the 'Link' that you specified for the product offer // in your Bing Merchant Center catalog. DestinationUrl = null, // You could use a tracking template which would override the campaign level // tracking template. Tracking templates defined for lower level entities // override those set for higher level entities. // In this example we are using the campaign level tracking template. TrackingUrlTemplate = null, // Set custom parameters that are specific to this criterion, // and can be used by the criterion, ad group, campaign, or account level tracking template. // In this example we are using the campaign level tracking template. UrlCustomParameters = new CustomParameters { Parameters = new[] { new CustomParameter() { Key = "promoCode", Value = "PROMO1" }, new CustomParameter() { Key = "season", Value = "summer" }, } } }; } adGroupCriterion.Criterion = new ProductPartition() { // If the root node is a unit, it would not have a parent ParentCriterionId = parent != null && parent.AdGroupCriterion != null ? parent.AdGroupCriterion.Id : null, Condition = condition, PartitionType = ProductPartitionType.Unit }; adGroupCriterion.AdGroupId = this.adGroupId; var partitionAction = new BulkAdGroupProductPartition() { ClientId = clientId, AdGroupCriterion = adGroupCriterion }; this.partitionActions.Add(partitionAction); return(partitionAction); }
public async override Task RunAsync(AuthorizationData authorizationData) { try { AdInsightService = new ServiceClient <IAdInsightService>(authorizationData); CampaignService = new ServiceClient <ICampaignManagementService>(authorizationData); // To get started with dynamic search ads, first you'll need to add a new Campaign // with its type set to DynamicSearchAds. When you create the campaign, you'll need to // include a DynamicSearchAdsSetting that specifies the target website domain and language. var campaigns = new[] { new Campaign { CampaignType = CampaignType.DynamicSearchAds, Settings = new [] { new DynamicSearchAdsSetting { DomainName = "contoso.com", Language = "English" } }, Name = "Women's Shoes " + DateTime.UtcNow, Description = "Red shoes line.", // You must choose to set either the shared budget ID or daily amount. // You can set one or the other, but you may not set both. BudgetId = null, DailyBudget = 50, BudgetType = Microsoft.BingAds.V10.CampaignManagement.BudgetLimitType.DailyBudgetStandard, // You can set your campaign bid strategy to Enhanced CPC (EnhancedCpcBiddingScheme) // and then, at any time, set an individual ad group bid strategy to // Manual CPC (ManualCpcBiddingScheme). BiddingScheme = new EnhancedCpcBiddingScheme { }, TimeZone = "PacificTimeUSCanadaTijuana", DaylightSaving = true, // Used with CustomParameters defined in lower level entities such as ads. TrackingUrlTemplate = "http://tracker.example.com/?season={_season}&promocode={_promocode}&u={lpurl}" }, }; AddCampaignsResponse addCampaignsResponse = await AddCampaignsAsync(authorizationData.AccountId, campaigns); long?[] campaignIds = addCampaignsResponse.CampaignIds.ToArray(); Microsoft.BingAds.V10.CampaignManagement.BatchError[] campaignErrors = addCampaignsResponse.PartialErrors.ToArray(); OutputCampaignsWithPartialErrors(campaigns, campaignIds, campaignErrors); // Next, create a new AdGroup within the dynamic search ads campaign. var adGroups = new[] { new AdGroup { Name = "Women's Red Shoe Sale", AdDistribution = AdDistribution.Search, BiddingModel = BiddingModel.Keyword, PricingModel = PricingModel.Cpc, StartDate = null, EndDate = new Date { Month = 12, Day = 31, Year = DateTime.UtcNow.Year + 1 }, SearchBid = new Bid { Amount = 0.09 }, Language = "English", // For ad groups you can use either of the InheritFromParentBiddingScheme or ManualCpcBiddingScheme objects. // If you do not set this element, then InheritFromParentBiddingScheme is used by default. BiddingScheme = new ManualCpcBiddingScheme { }, } }; AddAdGroupsResponse addAdGroupsResponse = await AddAdGroupsAsync((long)campaignIds[0], adGroups); long?[] adGroupIds = addAdGroupsResponse.AdGroupIds.ToArray(); Microsoft.BingAds.V10.CampaignManagement.BatchError[] adGroupErrors = addAdGroupsResponse.PartialErrors.ToArray(); OutputAdGroupsWithPartialErrors(adGroups, adGroupIds, adGroupErrors); // You can add one or more Webpage criterion to each ad group that helps determine // whether or not to serve dynamic search ads. var adGroupCriterions = new List <AdGroupCriterion>(); var adGroupWebpagePositivePageContent = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new FixedBid { Bid = new Bid { Amount = 0.50 } }, Criterion = new Webpage { Parameter = new WebpageParameter { Conditions = new[] { new WebpageCondition { Argument = "flowers", Operand = WebpageConditionOperand.PageContent, } }, CriterionName = "Ad Group Webpage Positive Page Content Criterion" }, }, // DestinationUrl and FinalUrls are not supported with Webpage criterion. // The Final URL is dynamically created at the ad level. DestinationUrl = null, FinalUrls = null, // You could use a tracking template which would override the campaign level // tracking template. Tracking templates defined for lower level entities // override those set for higher level entities. // In this example we are using the campaign level tracking template. TrackingUrlTemplate = null, // Set custom parameters that are specific to this webpage criterion, // and can be used by the criterion, ad group, campaign, or account level tracking template. // In this example we are using the campaign level tracking template. UrlCustomParameters = new CustomParameters { Parameters = new[] { new CustomParameter() { Key = "promoCode", Value = "PROMO1" }, new CustomParameter() { Key = "season", Value = "summer" }, } } }; adGroupCriterions.Add(adGroupWebpagePositivePageContent); // To discover the categories that you can use for Webpage criterion (positive or negative), // use the GetDomainCategories operation with the Ad Insight service. var getDomainCategoriesResponse = await GetDomainCategoriesAsync(DOMAIN_NAME, LANGUAGE); var categories = getDomainCategoriesResponse.Categories; // If any categories are available let's use one as a condition. if (categories.Count > 0) { var adGroupWebpagePositiveCategory = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new FixedBid { Bid = new Bid { Amount = 0.50 } }, Criterion = new Webpage { Parameter = new WebpageParameter { Conditions = new[] { new WebpageCondition { Argument = categories[0].CategoryName, Operand = WebpageConditionOperand.Category, } }, CriterionName = "Ad Group Webpage Positive Category Criterion" }, } }; adGroupCriterions.Add(adGroupWebpagePositiveCategory); } // If you want to exclude certain portions of your website, you can add negative Webpage // criterion at the campaign and ad group level. var adGroupWebpageNegativeUrl = new NegativeAdGroupCriterion { AdGroupId = (long)adGroupIds[0], Criterion = new Webpage { Parameter = new WebpageParameter { // You can choose whether you want the criterion argument to match partial URLs, // page content, page title, or categories that Bing thinks applies to your website. Conditions = new[] { new WebpageCondition { Argument = DOMAIN_NAME, Operand = WebpageConditionOperand.Url, } }, // If you do not specify any name, then it will be set to a concatenated list of conditions. CriterionName = null } }, }; adGroupCriterions.Add(adGroupWebpageNegativeUrl); OutputStatusMessage("Adding Ad Group Webpage Criterion . . . \n"); OutputAdGroupCriterions(adGroupCriterions); AddAdGroupCriterionsResponse addAdGroupCriterionsResponse = await AddAdGroupCriterionsAsync(adGroupCriterions, CriterionType.Webpage); long?[] adGroupCriterionIds = addAdGroupCriterionsResponse.AdGroupCriterionIds.ToArray(); OutputStatusMessage("New Ad Group Criterion Ids:\n"); OutputIds(adGroupCriterionIds); BatchErrorCollection[] adGroupCriterionErrors = addAdGroupCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("\nAddAdGroupCriterions Errors:\n"); OutputBatchErrorCollections(adGroupCriterionErrors); // The negative Webpage criterion at the campaign level applies to all ad groups // within the campaign; however, if you define ad group level negative Webpage criterion, // the campaign criterion is ignored for that ad group. var campaignCriterions = new List <CampaignCriterion>(); var campaignWebpageNegative = new NegativeCampaignCriterion { CampaignId = (long)campaignIds[0], Criterion = new Webpage { Parameter = new WebpageParameter { Conditions = new[] { new WebpageCondition { Argument = DOMAIN_NAME + "\\seattle", Operand = WebpageConditionOperand.Url, } }, CriterionName = "Campaign Negative Webpage Url Criterion" } } }; campaignCriterions.Add(campaignWebpageNegative); OutputStatusMessage("Adding Campaign Webpage Criterion . . . \n"); OutputCampaignCriterions(campaignCriterions); AddCampaignCriterionsResponse addCampaignCriterionsResponse = await AddCampaignCriterionsAsync(campaignCriterions, CampaignCriterionType.Webpage); long?[] campaignCriterionIds = addCampaignCriterionsResponse.CampaignCriterionIds.ToArray(); OutputStatusMessage("\nNew Campaign Criterion Ids:\n"); OutputIds(campaignCriterionIds); BatchErrorCollection[] campaignCriterionErrors = addCampaignCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("\nAddCampaignCriterions Errors:\n"); OutputBatchErrorCollections(campaignCriterionErrors); // Finally you can add a DynamicSearchAd into the ad group. The ad title and display URL // are generated automatically based on the website domain and language that you want to target. var ads = new Ad[] { new DynamicSearchAd { Text = "Find New Customers & Increase Sales! Start Advertising on Contoso Today.", Path1 = "seattle", Path2 = "shoe sale", // You cannot set FinalUrls. The Final URL will be a dynamically selected landing page. // The final URL is distinct from the path that customers will see and click on in your ad. FinalUrls = null, // You could use a tracking template which would override the campaign level // tracking template. Tracking templates defined for lower level entities // override those set for higher level entities. // In this example we are using the campaign level tracking template. TrackingUrlTemplate = null, // Set custom parameters that are specific to this ad, // and can be used by the ad, webpage, ad group, campaign, or account level tracking template. // In this example we are using the campaign level tracking template. UrlCustomParameters = new CustomParameters { Parameters = new[] { new CustomParameter() { Key = "promoCode", Value = "PROMO1" }, new CustomParameter() { Key = "season", Value = "summer" }, } } }, }; AddAdsResponse addAdsResponse = await AddAdsAsync((long)adGroupIds[0], ads); long?[] adIds = addAdsResponse.AdIds.ToArray(); Microsoft.BingAds.V10.CampaignManagement.BatchError[] adErrors = addAdsResponse.PartialErrors.ToArray(); OutputAdsWithPartialErrors(ads, adIds, adErrors); // Retrieve the Webpage criterion for the campaign. var getCampaignCriterionsByIdsResponse = await GetCampaignCriterionsByIdsAsync( (long)campaignIds[0], null, CampaignCriterionType.Webpage ); OutputStatusMessage("Retrieving the Campaign Webpage Criterions that we added . . . \n"); campaignCriterions = getCampaignCriterionsByIdsResponse.CampaignCriterions.ToList(); OutputCampaignCriterions(campaignCriterions); // Retrieve the Webpage criterion for the ad group and then test some update scenarios. var getAdGroupCriterionsByIdsResponse = await GetAdGroupCriterionsByIdsAsync( (long)adGroupIds[0], null, CriterionType.Webpage ); OutputStatusMessage("Retrieving the Ad Group Webpage Criterions that we added . . . \n"); adGroupCriterions = getAdGroupCriterionsByIdsResponse.AdGroupCriterions.ToList(); OutputAdGroupCriterions(adGroupCriterions); // You can update the bid for BiddableAdGroupCriterion var updateBid = new FixedBid { Bid = new Bid { Amount = 0.75 } }; // You can update the Webpage criterion name but cannot update the conditions. // To update the conditions you must delete the criterion and add a new criterion. // This update attempt will return an error. var updateCriterionAttemptFailure = new Webpage { Parameter = new WebpageParameter { Conditions = new[] { new WebpageCondition { Argument = "Books", Operand = WebpageConditionOperand.PageContent, } }, CriterionName = "Update Attempt Failure" }, }; var updateCriterionAttemptSuccess = new Webpage { Parameter = new WebpageParameter { CriterionName = "Update Attempt Success" }, }; foreach (var adGroupCriterion in adGroupCriterions) { var biddableAdGroupCriterion = adGroupCriterion as BiddableAdGroupCriterion; if (biddableAdGroupCriterion != null) { ((BiddableAdGroupCriterion)(adGroupCriterion)).CriterionBid = updateBid; ((BiddableAdGroupCriterion)(adGroupCriterion)).Criterion = updateCriterionAttemptSuccess; } else { var negativeAdGroupCriterion = adGroupCriterion as NegativeAdGroupCriterion; if (negativeAdGroupCriterion != null) { ((NegativeAdGroupCriterion)(adGroupCriterion)).Criterion = updateCriterionAttemptFailure; } } } OutputStatusMessage("Updating Ad Group Webpage Criterion . . . \n"); OutputAdGroupCriterions(adGroupCriterions); UpdateAdGroupCriterionsResponse updateAdGroupCriterionsResponse = await UpdateAdGroupCriterionsAsync(adGroupCriterions, CriterionType.Webpage); adGroupCriterionErrors = updateAdGroupCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("UpdateAdGroupCriterions Errors:\n"); OutputBatchErrorCollections(adGroupCriterionErrors); // Delete the campaign, ad group, criterion, and ad that were previously added. // You should remove this operation if you want to view the added entities in the // Bing Ads web application or another tool. await DeleteCampaignsAsync(authorizationData.AccountId, new[] { (long)campaignIds[0] }); OutputStatusMessage(string.Format("\nDeleted Campaign Id {0}\n", campaignIds[0])); } // Catch authentication exceptions catch (OAuthTokenRequestException ex) { OutputStatusMessage(string.Format("Couldn't get OAuth tokens. Error: {0}. Description: {1}", ex.Details.Error, ex.Details.Description)); } // Catch Campaign Management service exceptions catch (FaultException <Microsoft.BingAds.V10.CampaignManagement.AdApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.Errors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <Microsoft.BingAds.V10.CampaignManagement.ApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <Microsoft.BingAds.V10.CampaignManagement.EditorialApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (Exception ex) { OutputStatusMessage(ex.Message); } }
public async override Task RunAsync(AuthorizationData authorizationData) { try { CampaignManagementExampleHelper CampaignManagementExampleHelper = new CampaignManagementExampleHelper(this.OutputStatusMessage); CampaignManagementExampleHelper.CampaignManagementService = new ServiceClient <ICampaignManagementService>(authorizationData); // Setup an Audience campaign with one ad group and a responsive ad. var campaigns = new[] { new Campaign { // CampaignType must be set for Audience campaigns CampaignType = CampaignType.Audience, // Languages must be set for Audience campaigns Languages = new string[] { "All" }, Name = "Women's Shoes " + DateTime.UtcNow, Description = "Red shoes line.", DailyBudget = 50, BudgetType = BudgetLimitType.DailyBudgetStandard, TimeZone = "PacificTimeUSCanadaTijuana", }, }; var adGroups = new[] { new AdGroup { Name = "Women's Red Shoe Sale", StartDate = null, EndDate = new Date { Month = 12, Day = 31, Year = DateTime.UtcNow.Year + 1 }, CpcBid = new Bid { Amount = 0.09 }, // Language cannot be set for ad groups in Audience campaigns Language = null, // Network cannot be set for ad groups in Audience campaigns Network = null, Settings = new[] { new TargetSetting { // By including the corresponding TargetSettingDetail, // this example sets the "target and bid" option for // CompanyName, Industry, and JobFunction. We will only deliver ads to // people who meet at least one of your criteria. // By default the "bid only" option is set for Audience, Age, and Gender. // We will deliver ads to all audiences, ages, and genders, if they meet // your company name, industry, or job function criteria. Details = new [] { new TargetSettingDetail { CriterionTypeGroup = CriterionTypeGroup.CompanyName, TargetAndBid = true }, new TargetSettingDetail { CriterionTypeGroup = CriterionTypeGroup.Industry, TargetAndBid = true }, new TargetSettingDetail { CriterionTypeGroup = CriterionTypeGroup.JobFunction, TargetAndBid = true }, } } }, } }; var ads = new Ad[] { new ResponsiveAd { // Not applicable for responsive ads AdFormatPreference = null, BusinessName = "Contoso", CallToAction = CallToAction.AddToCart, // Not applicable for responsive ads DevicePreference = null, EditorialStatus = null, FinalAppUrls = null, FinalMobileUrls = new[] { "http://mobile.contoso.com/womenshoesale" }, FinalUrls = new[] { "http://www.contoso.com/womenshoesale" }, ForwardCompatibilityMap = null, Headline = "Fast & Easy Setup", Id = null, LandscapeImageMediaId = LandscapeImageMediaId, LandscapeLogoMediaId = LandscapeLogoMediaId, LongHeadline = "Find New Customers & Increase Sales!", SquareImageMediaId = SquareImageMediaId, SquareLogoMediaId = SquareLogoMediaId, Status = null, Text = "Find New Customers & Increase Sales! Start Advertising on Contoso Today.", TrackingUrlTemplate = null, Type = null, UrlCustomParameters = null, } }; // Add the campaign, ad group, and ad AddCampaignsResponse addCampaignsResponse = await CampaignManagementExampleHelper.AddCampaignsAsync(authorizationData.AccountId, campaigns); long?[] campaignIds = addCampaignsResponse.CampaignIds.ToArray(); BatchError[] campaignErrors = addCampaignsResponse.PartialErrors.ToArray(); CampaignManagementExampleHelper.OutputArrayOfLong(campaignIds); CampaignManagementExampleHelper.OutputArrayOfBatchError(campaignErrors); AddAdGroupsResponse addAdGroupsResponse = await CampaignManagementExampleHelper.AddAdGroupsAsync( (long)campaignIds[0], adGroups, false); long?[] adGroupIds = addAdGroupsResponse.AdGroupIds.ToArray(); BatchError[] adGroupErrors = addAdGroupsResponse.PartialErrors.ToArray(); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupIds); CampaignManagementExampleHelper.OutputArrayOfBatchError(adGroupErrors); AddAdsResponse addAdsResponse = await CampaignManagementExampleHelper.AddAdsAsync((long)adGroupIds[0], ads); long?[] adIds = addAdsResponse.AdIds.ToArray(); BatchError[] adErrors = addAdsResponse.PartialErrors.ToArray(); CampaignManagementExampleHelper.OutputArrayOfLong(adIds); CampaignManagementExampleHelper.OutputArrayOfBatchError(adErrors); // Whether or not the "target and bid" option has been set for a given // criterion type group, you can set bid adjustments for specific criteria. var adGroupCriterions = new List <AdGroupCriterion>(); var adGroupCompanyNameCriterion = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new FixedBid { Amount = 0.50 }, Criterion = new ProfileCriterion { ProfileId = 808251207, // Microsoft ProfileType = ProfileType.CompanyName }, }; adGroupCriterions.Add(adGroupCompanyNameCriterion); var adGroupIndustryCriterion = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new FixedBid { Amount = 0.50 }, Criterion = new ProfileCriterion { ProfileId = 807658654, // Computer & Network Security ProfileType = ProfileType.Industry }, }; adGroupCriterions.Add(adGroupIndustryCriterion); var adGroupJobFunctionCriterion = new BiddableAdGroupCriterion { AdGroupId = (long)adGroupIds[0], CriterionBid = new FixedBid { Amount = 0.50 }, Criterion = new ProfileCriterion { ProfileId = 807658477, // Engineering ProfileType = ProfileType.JobFunction }, }; adGroupCriterions.Add(adGroupJobFunctionCriterion); // Exclude ages twenty-five through thirty-four. var adGroupNegativeAgeCriterion = new NegativeAdGroupCriterion { AdGroupId = (long)adGroupIds[0], Criterion = new AgeCriterion { AgeRange = AgeRange.TwentyFiveToThirtyFour }, }; adGroupCriterions.Add(adGroupNegativeAgeCriterion); OutputStatusMessage("Adding Ad Group Criteria . . . \n"); CampaignManagementExampleHelper.OutputArrayOfAdGroupCriterion(adGroupCriterions); AddAdGroupCriterionsResponse addAdGroupCriterionsResponse = await CampaignManagementExampleHelper.AddAdGroupCriterionsAsync( adGroupCriterions, AdGroupCriterionType.Targets); long?[] adGroupCriterionIds = addAdGroupCriterionsResponse.AdGroupCriterionIds.ToArray(); OutputStatusMessage("New Ad Group Criterion Ids:\n"); CampaignManagementExampleHelper.OutputArrayOfLong(adGroupCriterionIds); BatchErrorCollection[] adGroupCriterionErrors = addAdGroupCriterionsResponse.NestedPartialErrors.ToArray(); OutputStatusMessage("\nAddAdGroupCriterions Errors:\n"); CampaignManagementExampleHelper.OutputArrayOfBatchErrorCollection(adGroupCriterionErrors); // Delete the campaign, ad group, criteria, and ad that were previously added. // You should remove this line if you want to view the added entities in the // Bing Ads web application or another tool. await CampaignManagementExampleHelper.DeleteCampaignsAsync(authorizationData.AccountId, new[] { (long)campaignIds[0] }); OutputStatusMessage(string.Format("\nDeleted Campaign Id {0}\n", campaignIds[0])); } // Catch authentication exceptions catch (OAuthTokenRequestException ex) { OutputStatusMessage(string.Format("Couldn't get OAuth tokens. Error: {0}. Description: {1}", ex.Details.Error, ex.Details.Description)); } // Catch Campaign Management service exceptions catch (FaultException <Microsoft.BingAds.V12.CampaignManagement.AdApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.Errors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <Microsoft.BingAds.V12.CampaignManagement.ApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (FaultException <Microsoft.BingAds.V12.CampaignManagement.EditorialApiFaultDetail> ex) { OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message)))); } catch (Exception ex) { OutputStatusMessage(ex.Message); } }