কনভার্সন আপলোড করুন

Campaign Manager 360 API Conversions পরিষেবা ব্যবহার করে অফলাইন কনভার্সন আপলোড করার জন্য এই নির্দেশিকায় বিস্তারিত তথ্য দেওয়া হয়েছে। চালিয়ে যাওয়ার আগে, অফলাইন কনভার্সনের সাথে পরিচিত হতে এবং এই গাইডে আলোচনা করা ধারণাগুলি সম্পর্কে পরিচিত হতে, আপনাকে এক নজরে পর্যালোচনা করার সাজেশন দেওয়া হচ্ছে।

কনভার্সন রিসোর্স কনফিগার করুন

কনভার্সন আপলোড প্রসেসের প্রথম ধাপ হল এক বা একাধিক Conversion রিসোর্স অবজেক্ট তৈরি করা। এই অবজেক্টগুলির প্রতিটি একটি কনভার্সন ইভেন্টকে দেখায় এবং এতে কয়েকটি প্রয়োজনীয় ফিল্ড থাকে:

ফিল্ড বিবরণ
floodlightActivityId এই কনভার্সন যে ফ্লাডলাইট অ্যাক্টিভিটির সাথে যুক্ত হবে।
floodlightConfigurationId নির্দিষ্ট অ্যাক্টিভিটির মাধ্যমে ব্যবহার করা Floodlight কনফিগারেশন।
ordinal একই দিনে একই ডিভাইস বা ব্যবহারকারীর থেকে হওয়া কনভার্সন কীভাবে ডিডুপ্লিকেট করা হয় তা নিয়ন্ত্রণ করার জন্য একটি ভ্যালু ব্যবহার করা হয়। আরও তথ্যের জন্য প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন।
timestampMicros কনভার্সনের টাইমস্ট্যাম্প, Unix epoch থেকে মাইক্রোসেকেন্ডে।

এছাড়াও, প্রতিটি অবজেক্টে নিম্নলিখিত ফিল্ডের মধ্যে একটি অবশ্যই থাকতে হবে:

ফিল্ড বিবরণ
encryptedUserId %m ম্যাচ ম্যাক্রো বা ডেটা ট্রান্সফার থেকে পাওয়া একটি এনক্রিপ্ট করা ব্যবহারকারীর আইডি।
encryptedUserIdCandidates[] %m ম্যাচ ম্যাক্রো বা ডেটা ট্রান্সফার থেকে পাওয়া এনক্রিপ্ট করা ব্যবহারকারীর আইডির তালিকা। নির্দিষ্ট timestampMicros-এর আগে রেকর্ড করা Floodlight এক্সপোজার সহ এইসব আইডির প্রথমটি ব্যবহার করা হবে। কোনও আইডি আগে থেকে থাকা এক্সপোজারের সাথে ম্যাচ না করলে, একটি সমস্যা দেখানো হবে।
dclid Campaign Manager 360 বা Display & Video 360-এর মাধ্যমে জেনারেট করা ডিসপ্লে ক্লিক আইডেন্টিফায়ার।
gclid Google Ads বা Search Ads 360-এর মাধ্যমে জেনারেট করা Google ক্লিক শনাক্তকারী।
matchId বিজ্ঞাপনদাতার তৈরি করা অনন্য শনাক্তকারী যা Floodlight ট্যাগের মাধ্যমে Campaign Manager 360-এ পাস করা হয়।
mobileDeviceId IDFA বা AdID ফর্ম্যাটে এনক্রিপ্ট না করা মোবাইল আইডি অথবা কাজ করে এমন CTV ডিভাইস প্ল্যাটফর্ম (Roku, Fire TV, Android TV, Apple TV, Xbox, Samsung, Vizio) থেকে পাওয়া কানেক্ট করা টিভির বিজ্ঞাপন শনাক্তকারী (IFA)।

শেষে, প্রতিটি কনভার্সনের দুটি মেট্রিক আছে:

ফিল্ড বিবরণ
quantity প্রয়োজনীয়। কনভার্সনের সাথে যুক্ত আইটেমের সংখ্যা। নির্দিষ্ট মেট্রিকের (যেমন, মোট কনভার্সন) জন্য কনভার্সন গণনা করতে হলে অন্তত ১টি কনভার্সন হতে হবে।
value কনভার্সনের সাথে যুক্ত ডলারের পরিমাণ। ফ্লাডলাইট কনফিগারেশনের মালিক বিজ্ঞাপনদাতার মুদ্রায় ব্যাখ্যা করা হয়েছে।

ঐচ্ছিক ফিল্ড রেফারেন্স ডকুমেন্টেশনে ডকুমেন্ট করা আছে।

নিচের উদাহরণে একটি সাধারণ কনভার্সন রিসোর্স অবজেক্ট তৈরি করার পদ্ধতি দেখানো হয়েছে:

C#

// Generate a timestamp in milliseconds since Unix epoch.
TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1);
long currentTimeInMilliseconds = (long) timeSpan.TotalMilliseconds;

// Find the Floodlight configuration ID based on the provided activity ID.
FloodlightActivity floodlightActivity =
    service.FloodlightActivities.Get(profileId, floodlightActivityId).Execute();
long floodlightConfigurationId = (long) floodlightActivity.FloodlightConfigurationId;

// Create the conversion.
Conversion conversion = new Conversion();
conversion.EncryptedUserId = conversionUserId;
conversion.FloodlightActivityId = floodlightActivityId;
conversion.FloodlightConfigurationId = floodlightConfigurationId;
conversion.Ordinal = currentTimeInMilliseconds.ToString();
conversion.TimestampMicros = currentTimeInMilliseconds * 1000;

Java

long currentTimeInMilliseconds = System.currentTimeMillis();

// Find Floodlight configuration ID based on the provided activity ID.
FloodlightActivity floodlightActivity = reporting.floodlightActivities()
    .get(profileId, floodlightActivityId).execute();
long floodlightConfigurationId = floodlightActivity.getFloodlightConfigurationId();

Conversion conversion = new Conversion();
conversion.setEncryptedUserId(encryptedUserId);
conversion.setFloodlightActivityId(floodlightActivityId);
conversion.setFloodlightConfigurationId(floodlightConfigurationId);
conversion.setOrdinal(String.valueOf(currentTimeInMilliseconds));
conversion.setTimestampMicros(currentTimeInMilliseconds * 1000);

PHP

$currentTimeInMicros = time() * 1000 * 1000;

// Find Floodlight configuration ID based on provided activity ID.
$activity = $this->service->floodlightActivities->get(
    $values['user_profile_id'],
    $values['floodlight_activity_id']
);
$floodlightConfigId = $activity->getFloodlightConfigurationId();

$conversion = new Google_Service_Dfareporting_Conversion();
$conversion->setEncryptedUserId($values['encrypted_user_id']);
$conversion->setFloodlightActivityId($values['floodlight_activity_id']);
$conversion->setFloodlightConfigurationId($floodlightConfigId);
$conversion->setOrdinal($currentTimeInMicros);
$conversion->setTimestampMicros($currentTimeInMicros);

Python

# Look up the Floodlight configuration ID based on activity ID.
floodlight_activity = (
    service.floodlightActivities()
    .get(profileId=str(profile_id), id=str(floodlight_activity_id))
    .execute()
)
floodlight_config_id = floodlight_activity['floodlightConfigurationId']

current_time_in_micros = int(time.time() * 1000000)

# Construct the conversion.
conversion = {
    'encryptedUserId': encrypted_user_id,
    'floodlightActivityId': floodlight_activity_id,
    'floodlightConfigurationId': floodlight_config_id,
    'ordinal': current_time_in_micros,
    'timestampMicros': current_time_in_micros
}

Ruby

# Look up the Floodlight configuration ID based on activity ID.
floodlight_activity = service.get_floodlight_activity(profile_id,
  floodlight_activity_id)
floodlight_config_id = floodlight_activity.floodlight_configuration_id

current_time_in_micros = DateTime.now.strftime('%Q').to_i * 1000

# Construct the conversion.
conversion = DfareportingUtils::API_NAMESPACE::Conversion.new(
  encrypted_user_id: encrypted_user_id,
  floodlight_activity_id: floodlight_activity_id,
  floodlight_configuration_id: floodlight_config_id,
  ordinal: current_time_in_micros,
  timestamp_micros: current_time_in_micros
)

এনক্রিপশন সংক্রান্ত তথ্য উল্লেখ করুন

আগের উদাহরণের মতো, আপনি যদি এনক্রিপ্ট করা ব্যবহারকারীর আইডিতে অফলাইন কনভার্সন অ্যাট্রিবিউট করার পরিকল্পনা করেন, তাহলে আপনার ইনসার্ট অনুরোধের অংশ হিসেবে সেগুলি কীভাবে এনক্রিপ্ট করা হয়েছে সে সম্পর্কে কিছু বিবরণ দিতে হবে। বিশেষ করে, আপনাকে যা জানতে হবে:

  1. এনক্রিপশন সোর্স, যা এনক্রিপ্ট করা আইডির ব্যাচ কোথা থেকে এসেছে তা বর্ণনা করে। %m ম্যাচ ম্যাক্রো থেকে সোর্স করা আইডির জন্য গ্রহণযোগ্য ভ্যালু হল AD_SERVING অথবা ডেটা ট্রান্সফার ফাইল থেকে সোর্স করা আইডির জন্য গ্রহণযোগ্য ভ্যালু হল DATA_TRANSFER।

  2. এনক্রিপশন এন্টিটি, যা ব্যবহারকারীর আইডি এনক্রিপ্ট করার জন্য ব্যবহৃত অনন্য মানের সেট। এই ভ্যালুগুলি সাধারণত Campaign Manager 360 অ্যাকাউন্টের সাথে সম্পর্কিত হয় যখন সোর্স হল ডেটা ট্রান্সফার, অথবা Campaign Manager 360 বিজ্ঞাপনদাতার সাথে সম্পর্কিত হয় যখন সোর্স হল %m ম্যাক্রো, তবে এটি সবসময় হয় না। আপনি নিশ্চিত না হলে, আরও তথ্যের জন্য আপনার Campaign Manager 360 অ্যাকাউন্ট প্রতিনিধি বা Campaign Manager 360 সহায়তা টিমের সাথে যোগাযোগ করুন।

প্রয়োজন হলে, কনভার্সন আপলোড প্রসেসের দ্বিতীয় ধাপ হল EncryptionInfo অবজেক্ট তৈরি করা যা এইসব ভ্যালু নির্দিষ্ট করে:

C#

// Create the encryption info.
EncryptionInfo encryptionInfo = new EncryptionInfo();
encryptionInfo.EncryptionEntityId = encryptionEntityId;
encryptionInfo.EncryptionEntityType = encryptionEntityType;
encryptionInfo.EncryptionSource = encryptionSource;

Java

// Create the encryption info.
EncryptionInfo encryptionInfo = new EncryptionInfo();
encryptionInfo.setEncryptionEntityId(encryptionEntityId);
encryptionInfo.setEncryptionEntityType(encryptionEntityType);
encryptionInfo.setEncryptionSource(encryptionSource);

PHP

$encryptionInfo = new Google_Service_Dfareporting_EncryptionInfo();
$encryptionInfo->setEncryptionEntityId($values['encryption_entity_id']);
$encryptionInfo->setEncryptionEntityType($values['encryption_entity_type']);
$encryptionInfo->setEncryptionSource($values['encryption_source']);

Python

# Construct the encryption info.
encryption_info = {
    'encryptionEntityId': encryption_entity_id,
    'encryptionEntityType': encryption_entity_type,
    'encryptionSource': encryption_source
}

Ruby

# Construct the encryption info.
encryption_info = DfareportingUtils::API_NAMESPACE::EncryptionInfo.new(
  encryption_entity_id: encryption[:entity_id],
  encryption_entity_type: encryption[:entity_type],
  encryption_source: encryption[:source]
)

মনে রাখবেন যে প্রতিটি যোগ করার অনুরোধে শুধুমাত্র একটি EncryptionInfo অবজেক্ট থাকতে পারে। এর অর্থ হল, কোনও নির্দিষ্ট অনুরোধে অন্তর্ভুক্ত সব কনভার্সন অবশ্যই একই সোর্স থেকে উৎপন্ন হতে হবে এবং একই এনক্রিপশন এন্টিটি ব্যবহার করতে হবে।

যোগ করার অনুরোধ জেনারেট করুন

এই প্রসেসের শেষ ধাপ হল batchinsert-এ কল করে আপনার কনভার্সন আপলোড করা। এই পদ্ধতি একটি ConversionsBatchInsertRequest অবজেক্ট গ্রহণ করে, যা আপলোড করার জন্য কনভার্সনের সেটকে তাদের সংশ্লিষ্ট এনক্রিপশন তথ্যের সাথে একত্রিত করে (প্রয়োজন হলে):

C#

// Insert the conversion.
ConversionsBatchInsertRequest request = new ConversionsBatchInsertRequest();
request.Conversions = new List<Conversion>() { conversion };
request.EncryptionInfo = encryptionInfo;

ConversionsBatchInsertResponse response =
    service.Conversions.Batchinsert(request, profileId).Execute();

Java

ConversionsBatchInsertRequest request = new ConversionsBatchInsertRequest();
request.setConversions(ImmutableList.of(conversion));
request.setEncryptionInfo(encryptionInfo);

ConversionsBatchInsertResponse response = reporting.conversions()
    .batchinsert(profileId, request).execute();

PHP

$batch = new Google_Service_Dfareporting_ConversionsBatchInsertRequest();
$batch->setConversions([$conversion]);
$batch->setEncryptionInfo($encryptionInfo);

$result = $this->service->conversions->batchinsert(
    $values['user_profile_id'],
    $batch
);

Python

# Insert the conversion.
request_body = {
    'conversions': [conversion],
    'encryptionInfo': encryption_info
}
request = service.conversions().batchinsert(
    profileId=str(profile_id), body=request_body
)
response = request.execute()

Ruby

# Construct the batch insert request.
batch_insert_request =
  DfareportingUtils::API_NAMESPACE::ConversionsBatchInsertRequest.new(
    conversions: [conversion],
    encryption_info: encryption_info
  )

# Insert the conversion.
result = service.batchinsert_conversion(profile_id, batch_insert_request)

মনে রাখবেন, Campaign Manager 360 আপনার অনুরোধে প্রতিটি কনভার্সন যোগ করার চেষ্টা করে, পুরো ব্যাচকে একবারে যোগ করার চেষ্টা করে না। কোনও ব্যাচের কিছু কনভার্সন যোগ করা না গেলেও, অন্যগুলি যোগ করা যেতে পারে। তাই, প্রতিটি কনভার্সনের স্ট্যাটাস নির্ধারণ করতে, আপনাকে ফেরত পাঠানো ConversionsBatchInsertResponse পরীক্ষা করার সাজেশন দেওয়া হচ্ছে:

C#

// Handle the batchinsert response.
if (!response.HasFailures.Value) {
  Console.WriteLine("Successfully inserted conversion for encrypted user ID {0}.",
      conversionUserId);
} else {
  Console.WriteLine("Error(s) inserting conversion for encrypted user ID {0}:",
      conversionUserId);

  ConversionStatus status = response.Status[0];
  foreach(ConversionError error in status.Errors) {
    Console.WriteLine("\t[{0}]: {1}", error.Code, error.Message);
  }
}

Java

if (!response.getHasFailures()) {
  System.out.printf("Successfully inserted conversion for encrypted user ID %s.%n",
      encryptedUserId);
} else {
  System.out.printf("Error(s) inserting conversion for encrypted user ID %s:%n",
      encryptedUserId);

  // Retrieve the conversion status and report any errors found. If multiple conversions
  // were included in the original request, the response would contain a status for each.
  ConversionStatus status = response.getStatus().get(0);
  for (ConversionError error : status.getErrors()) {
    System.out.printf("\t[%s]: %s.%n", error.getCode(), error.getMessage());
  }
}

PHP

if (!$result->getHasFailures()) {
    printf(
        'Successfully inserted conversion for encrypted user ID %s.',
        $values['encrypted_user_id']
    );
} else {
    printf(
        'Error(s) inserting conversion for encrypted user ID %s:<br><br>',
        $values['encrypted_user_id']
    );

    $status = $result->getStatus()[0];
    foreach ($status->getErrors() as $error) {
        printf('[%s] %s<br>', $error->getCode(), $error->getMessage());
    }
}

Python

if not response['hasFailures']:
  print(
      'Successfully inserted conversion for encrypted user ID %s.'
      % encrypted_user_id
  )
else:
  print(
      'Error(s) inserting conversion for encrypted user ID %s.'
      % encrypted_user_id
  )

  status = response['status'][0]
  for error in status['errors']:
    print('\t[%s]: %s' % (error['code'], error['message']))

Ruby

if result.has_failures
  puts format('Error(s) inserting conversion for encrypted user ID %s.',
    encrypted_user_id)

  status = result.status[0]
  status.errors.each do |error|
    puts format("\t[%s]: %s", error.code, error.message)
  end
else
  puts format('Successfully inserted conversion for encrypted user ID %s.',
    encrypted_user_id)
end

আসল অনুরোধে অন্তর্ভুক্ত প্রতিটি কনভার্সনের জন্য উত্তরের status ফিল্ডে একটি ConversionStatus অবজেক্ট থাকবে। আপনি যদি শুধুমাত্র সেইসব কনভার্সন সম্পর্কে জানতে চান যেগুলি যোগ করা যায়নি, তাহলে hasFailures ফিল্ড ব্যবহার করে দ্রুত নির্ধারণ করতে পারবেন যে প্রদত্ত ব্যাচে কোনও কনভার্সন যোগ করা যায়নি কিনা। প্রতিটি ত্রুটি কোড কীভাবে ম্যানেজ করতে হয় এবং কোন কোন ব্যর্থ কনভার্সন আবার চেষ্টা করতে হবে (INTERNAL এবং NOT_FOUND) সেই বিষয়ে নির্দেশনার জন্য, প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন।

কনভার্সন প্রসেস করা হয়েছে কিনা তা যাচাই করুন

আপলোড করা কনভার্সন সাধারণত ২৪ ঘণ্টার মধ্যে প্রসেস করা হবে এবং রিপোর্ট করার জন্য উপলভ্য হবে। আপনার আপলোড করা কনভার্সন প্রসেস করা হয়েছে কিনা তা যাচাই করতে, Floodlight ইম্প্রেশন রিপোর্ট রান করার সাজেশন দেওয়া হয়। অন্যান্য অ্যাট্রিবিউশন রিপোর্টের মতো নয়, এগুলি ডিফল্ট হিসেবে অ্যাট্রিবিউট করা (বিজ্ঞাপনের সাথে সম্পর্কিত) এবং অ্যাট্রিবিউট না করা কনভার্সন, দুটিই দেখাবে। এর ফলে, আপনার পাঠানো কনভার্সন Campaign Manager 360-তে পৌঁছেছে কিনা তা দ্রুত চেক করার জন্য এটি আদর্শ।