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

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

রূপান্তর রিসোর্স কনফিগার করুন

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

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

অতিরিক্তভাবে, প্রতিটি বস্তুতে নিম্নলিখিত ক্ষেত্রগুলির মধ্যে একটি থাকতে হবে:

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

যখন প্রয়োজন হয়, তখন রূপান্তর আপলোড প্রক্রিয়ার দ্বিতীয় ধাপ হলো এই মানগুলি নির্দিষ্ট করে এমন একটি 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 ক্ষেত্রটি প্রদত্ত ব্যাচের কোনও রূপান্তর ব্যর্থ হয়েছে কিনা তা দ্রুত নির্ধারণ করতে ব্যবহার করা যেতে পারে।

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

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