রূপান্তর আপলোড করুন

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

রূপান্তর সংস্থানগুলি কনফিগার করুন

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

মাঠ বর্ণনা
floodlightActivityId যে ফ্লাডলাইট অ্যাক্টিভিটির সাথে এই রূপান্তরটি যুক্ত থাকবে।
floodlightConfigurationId নির্দিষ্ট অ্যাক্টিভিটি দ্বারা ব্যবহৃত ফ্লাডলাইট কনফিগারেশন।
ordinal একই দিনে একই ডিভাইস বা ব্যবহারকারীর করা কনভার্সনগুলো থেকে ডুপ্লিকেটগুলো কীভাবে বাদ দেওয়া হবে, তা নিয়ন্ত্রণ করতে ব্যবহৃত একটি মান। আরও তথ্যের জন্য প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী (FAQ) দেখুন।
timestampMicros ইউনিক্স ইপক থেকে মাইক্রোসেকেন্ডে রূপান্তরের টাইমস্ট্যাম্প।

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

মাঠ বর্ণনা
encryptedUserId %m ম্যাচ ম্যাক্রো অথবা ডেটা ট্রান্সফার থেকে প্রাপ্ত একটি একক এনক্রিপ্টেড ইউজার আইডি।
encryptedUserIdCandidates[] %m ম্যাচ ম্যাক্রো বা ডেটা ট্রান্সফার থেকে প্রাপ্ত এনক্রিপ্টেড ইউজার আইডিগুলোর একটি তালিকা। নির্দিষ্ট timestampMicros এর আগে রেকর্ড করা ফ্ল্যাডলাইট এক্সপোজার আছে এমন আইডিগুলোর মধ্যে প্রথমটি ব্যবহার করা হবে। যদি কোনো আইডিই বিদ্যমান কোনো এক্সপোজারের সাথে না মেলে, তাহলে একটি ত্রুটি দেখানো হবে।
dclid ক্যাম্পেইন ম্যানেজার ৩৬০ অথবা ডিসপ্লে অ্যান্ড ভিডিও ৩৬০ দ্বারা জেনারেট করা একটি ডিসপ্লে ক্লিক আইডেন্টিফায়ার
gclid গুগল অ্যাডস বা সার্চ অ্যাডস ৩৬০ দ্বারা তৈরি একটি গুগল ক্লিক আইডেন্টিফায়ার
matchId বিজ্ঞাপনদাতা কর্তৃক তৈরি একটি অনন্য শনাক্তকারী, যা একটি ফ্ল্যাডলাইট ট্যাগের মাধ্যমে ক্যাম্পেইন ম্যানেজার ৩৬০-এ পাঠানো হয়।
mobileDeviceId IDFA বা AdID ফরম্যাটে একটি এনক্রিপ্টবিহীন মোবাইল আইডি অথবা একটি সমর্থিত CTV ডিভাইস প্ল্যাটফর্ম (Roku, Fire TV, Android TV, Apple TV, Xbox, Samsung, Vizio) থেকে প্রাপ্ত বিজ্ঞাপনের জন্য একটি কানেক্টেড টিভি আইডেন্টিফায়ার (IFA)।

অবশেষে, প্রতিটি রূপান্তরের দুটি মেট্রিক রয়েছে:

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

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

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

সি#

// 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;

জাভা

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);

পিএইচপি

$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);

পাইথন

# 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
}

রুবি

# 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. এনক্রিপশন এনটিটি হলো ব্যবহারকারীর আইডি এনক্রিপ্ট করার জন্য ব্যবহৃত কিছু অনন্য মানের একটি সেট। যখন উৎস ডেটা ট্রান্সফার হয়, তখন এই মানগুলো সাধারণত একটি ক্যাম্পেইন ম্যানেজার ৩৬০ অ্যাকাউন্টের সাথে সম্পর্কিত থাকে, অথবা যখন উৎস %m ম্যাক্রো হয়, তখন এগুলো একজন ক্যাম্পেইন ম্যানেজার ৩৬০ বিজ্ঞাপনদাতার সাথে সম্পর্কিত থাকে, কিন্তু সবসময় এমনটা হয় না। আপনি যদি নিশ্চিত না হন, তাহলে আরও তথ্যের জন্য আপনার ক্যাম্পেইন ম্যানেজার ৩৬০ অ্যাকাউন্ট প্রতিনিধি বা ক্যাম্পেইন ম্যানেজার ৩৬০ সাপোর্টের সাথে যোগাযোগ করুন।

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

সি#

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

জাভা

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

পিএইচপি

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

পাইথন

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

রুবি

# 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 অবজেক্ট গ্রহণ করে, যা আপলোড করার জন্য কনভার্সনগুলোর সেটকে তাদের সংশ্লিষ্ট এনক্রিপশন তথ্যের (প্রয়োজনে) সাথে একত্রিত করে।

সি#

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

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

জাভা

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

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

পিএইচপি

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

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

পাইথন

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

রুবি

# 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)

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

সি#

// 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);
  }
}

জাভা

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());
  }
}

পিএইচপি

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());
    }
}

পাইথন

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']))

রুবি

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 ফিল্ডটি ব্যবহার করা যেতে পারে।

রূপান্তরগুলি প্রক্রিয়া করা হয়েছে কিনা যাচাই করুন

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