コンタクト管理

コンタクト管理はユーザーとのやり取り(コンタクト履歴)を記録する機能です。

記録したコンタクト履歴は管理画面から参照できます。グラフ表示や、コンタクトの種別やコンタクトがあった日時などの条件で絞り込みを行い、結果を画面に一覧表示したり、ローデータをCSV出力して分析することができます。

また、SDKからコンタクト履歴を登録したり、検索してアプリケーションの画面表示の制御に使用することができます。

このページでは、コンタクト管理機能を利⽤する実装例を紹介します。

注意

コンタクト管理機能はライトプラン、ベーシックプランではご利用いただけません。利用したい場合は、製品サイトopen in new windowよりお問い合わせください。

コンタクト種別

コンタクト種別はユーザーとのやり取りの種別です。例えば、「顧客登録」、「クーポン取得」、「クーポン利用」などです。

管理画面の「コンタクト管理」→「コンタクト種別一覧」を開くと、システム標準のコンタクト種別の一覧を確認できます。また、同画面の「新規登録」よりアプリケーション独自のコンタクト種別を追加することができます。

コンタクト方法種別

コンタクト方法種別はユーザーとのやり取りを行った媒体です。例えば、「電話」、「WEB」、「アプリ」などです。

管理画面の「コンタクト管理」→「コンタクト方法種別一覧」を開くと、システム標準のコンタクト方法種別の一覧を確認できます。また、同画面の「新規登録」よりアプリケーション独自のコンタクト方法種別を追加することができます。

オブジェクト項目を設定する

データ管理機能と同じようにコンタクト履歴にアプリケーション独自のオブジェクト項目を追加することができます。

オブジェクト項目を編集する場合は、管理画面の「コンタクト項目設定」を開いてください。

注意

コンタクト項目設定の変更操作完了後、結果がシステムに反映されるまで最大1分間かかります。ご注意ください。

コンタクト履歴を追加する

コンタクト履歴の追加はaddContactメソッドで行います。

コンタクト種別コンタクト方法種別は必須です。

let userAccessToken = "xxx"

let contact = RKZContactData()
contact.contact_class_cd = "0006" // コンタクト種別(来場)
contact.contact_method_class_cd = "0009" // コンタクト方法種別(アプリ)
contact.attributes = [
    "shop_cd": "0001" // 独自に追加した項目
]

RKZService.sharedInstance().addContact(userAccessToken, contactData: contact) { statusCode, responseStatus in
    if responseStatus.isSuccess {
        // 成功時
        print("登録完了")
    } else {
        // 失敗
        print("statusCode:", responseStatus.statusCode.rawValue)
        print("message:", responseStatus.message ?? "")
    }
}
NSString *userAccessToken = @"xxx";

RKZContactData *contact = [[RKZContactData alloc] init];
contact.contact_class_cd = @"0006"; // コンタクト種別(来場)
contact.contact_method_class_cd = @"0009"; // コンタクト方法種別(アプリ)
contact.attributes = @{
    @"shop_cd": @"0001" // 独自に追加した項目
};

[[RKZService sharedInstance] addContact:userAccessToken contactData:contact withBlock:^(RKZApiStatusCode statusCode, RKZResponseStatus * _Nonnull responseStatus) {
    if (responseStatus.isSuccess) {
        // 成功時
        NSLog(@"登録完了");
    } else {
        // 失敗
        NSLog(@"statusCode: %ld", responseStatus.statusCode);
        NSLog(@"message: %@", responseStatus.message);
    }
}];
val userAccessToken = "xxx"

val contact = Contact()
contact.contactClassCd = "0006" // コンタクト種別(来場)
contact.contactMethodClassCd = "0009" // コンタクト方法種別(アプリ)
contact.attributes = mapOf(
    "shop_cd" to "0001" // 独自に追加した項目
)

RKZClient.getInstance().addContact(userAccessToken, contact) { rkzResponseStatus ->
    if (rkzResponseStatus.isSuccess) {
        // 成功時
        Log.d(TAG, "登録完了")
    } else {
        // 失敗
        Log.e(TAG, "statusCode: ${rkzResponseStatus.statusCode}")
        Log.e(TAG, "message: ${rkzResponseStatus.message}")
    }
}
String userAccessToken = "xxx";

Contact contact = new Contact();
contact.setContactClassCd("0006"); // コンタクト種別(来場)
contact.setContactMethodClassCd("0009"); // コンタクト方法種別(アプリ)
contact.setAttributesValue("shop_cd", "0001"); // 独自に追加した項目

RKZClient.getInstance().addContact(userAccessToken, contact, new OnAddContactListener() {
    @Override
    public void onAddContact(RKZResponseStatus rkzResponseStatus) {
        if (rkzResponseStatus.isSuccess()) {
            // 成功時
            Log.d(TAG, "登録完了");
        } else {
            // 失敗
            Log.e(TAG, "statusCode: " + rkzResponseStatus.getStatusCode());
            Log.e(TAG, "message: " + rkzResponseStatus.getMessage());
        }
    }
});
var userAccessToken = 'xxx'

var contact = {
  contact_class_cd: '0006', // コンタクト種別(来場)
  contact_method_class_cd: '0009', // コンタクト方法種別(アプリ)
  attributes: {
    shop_cd: '0001' // 独自に追加した項目
  }
}

RKZClient.addContact(userAccessToken, contact, function (statusCode) {
  // 成功時
  console.debug('登録完了')
}, function (error) {
  // 失敗時
  console.error('status_code:', error.status_code)
  console.error('message:', error.message)
})
const userAccessToken = 'xxx'

await RKZ.Contact.add(userAccessToken, {
  contact_class_cd: '0006', // コンタクト種別(来場)
  contact_method_class_cd: '0009', // コンタクト方法種別(アプリ)
  attributes: {
    shop_cd: '0001' // 独自に追加した項目
  }
})
final userAccessToken = 'xxx';

final contact = Contact();
contact.contactClassCd = '0006'; // コンタクト種別(来場)
contact.contactMethodClassCd = '0009'; // コンタクト方法種別(アプリ)
contact.attributes = {
  'shop_cd': '0001' // 独自に追加した項目
};

await RKZClient.instance.addContact(userAccessToken, contact);

ヒント

アプリケーションで独自に追加した項目はattributesというプロパティに設定する必要があります。


コンタクトを行った日時のことをコンタクト日時と言います。コンタクト日時はシステム側で自動的に設定されますが、任意の日時を指定することもできます。

任意のコンタクト日時はcontact.contact_dateに指定してください。

let userAccessToken = "xxx"

let contact = RKZContactData()
contact.contact_date = Date() // 任意のコンタクト日時
contact.contact_class_cd = "0006" // 来場
contact.contact_method_class_cd = "0009" // アプリ
contact.attributes = [
    "shop_cd": "0001" // 独自に追加した項目
]

RKZService.sharedInstance().addContact(userAccessToken, contactData: contact) { statusCode, responseStatus in
    // ...
}



 









NSString *userAccessToken = @"xxx";

RKZContactData *contact = [[RKZContactData alloc] init];
contact.contact_date = [NSDate now]; // 任意のコンタクト日時
contact.contact_class_cd = @"0006"; // コンタクト種別(来場)
contact.contact_method_class_cd = @"0009"; // コンタクト方法種別(アプリ)
contact.attributes = @{
    @"shop_cd": @"0001" // 独自に追加した項目
};

[[RKZService sharedInstance] addContact:userAccessToken contactData:contact withBlock:^(RKZApiStatusCode statusCode, RKZResponseStatus * _Nonnull responseStatus) {
    // ...
}];



 









val userAccessToken = "xxx"

val contact = Contact()
contact.contactDate = Calendar.getInstance() // 任意のコンタクト日時
contact.contactClassCd = "0006" // 来場
contact.contactMethodClassCd = "0009" // アプリ
contact.attributes = mapOf(
    "shop_cd" to "0001" // 独自に追加した項目
)

RKZClient.getInstance().addContact(userAccessToken, contact) { rkzResponseStatus ->
    // ...
}



 









String userAccessToken = "xxx";

Contact contact = new Contact();
contact.setContactDate(Calendar.getInstance()); // 任意のコンタクト日時
contact.setContactClassCd("0006"); // コンタクト種別(来場)
contact.setContactMethodClassCd("0009"); // コンタクト方法種別(アプリ)
contact.setAttributesValue("shop_cd", "0001"); // 独自に追加した項目

RKZClient.getInstance().addContact(userAccessToken, contact, new OnAddContactListener() {
    @Override
    public void onAddContact(RKZResponseStatus rkzResponseStatus) {
        // ...
    }
});



 










var userAccessToken = 'xxx'

var contact = {
  contact_date: '2020-06-05 14:47:56', // 任意のコンタクト日時
  contact_class_cd: '0006', // コンタクト種別(来場)
  contact_method_class_cd: '0009', // コンタクト方法種別(アプリ)
  attributes: {
    shop_cd: '0001' // 独自に追加した項目
  }
}

RKZClient.addContact(userAccessToken, contact, function (statusCode) {
  // ...
}, function (error) {
  // ...
})



 












const userAccessToken = 'xxx'

await RKZ.Contact.add(userAccessToken, {
  contact_date: '2020-06-05 14:47:56', // 任意のコンタクト日時
  contact_class_cd: '0006', // コンタクト種別(来場)
  contact_method_class_cd: '0009', // コンタクト方法種別(アプリ)
  attributes: {
    shop_cd: '0001' // 独自に追加した項目
  }
})



 






final userAccessToken = 'xxx';

final contact = Contact();
contact.contactDate = DateTime(2020, 6, 5, 14, 47, 56); // 任意のコンタクト日時
contact.contactClassCd = '0006'; // コンタクト種別(来場)
contact.contactMethodClassCd = '0009'; // コンタクト方法種別(アプリ)
contact.attributes = {
  'shop_cd': '0001' // 独自に追加した項目
};

await RKZClient.instance.addContact(userAccessToken, contact);



 








コンタクト履歴を追加すると同時にポイントの増減を行うことができます。(ポイントについての説明は、ポイント管理を参照してください)

ポイントの増減を行うには、contact.pointに増減したいポイントを指定します。

let userAccessToken = "xxx"

let contact = RKZContactData()
contact.contact_class_cd = "0006" // 来場
contact.contact_method_class_cd = "0009" // アプリ
contact.point = 10 // 増減したいポイント
contact.attributes = [
    "shop_cd": "0001" // 独自に追加した項目
]

RKZService.sharedInstance().addContact(userAccessToken, contactData: contact) { statusCode, responseStatus in
    // ...
}





 







NSString *userAccessToken = @"xxx";

RKZContactData *contact = [[RKZContactData alloc] init];
contact.contact_class_cd = @"0006"; // コンタクト種別(来場)
contact.contact_method_class_cd = @"0009"; // コンタクト方法種別(アプリ)
contact.point = @10; // 増減したいポイント
contact.attributes = @{
    @"shop_cd": @"0001" // 独自に追加した項目
};

[[RKZService sharedInstance] addContact:userAccessToken contactData:contact withBlock:^(RKZApiStatusCode statusCode, RKZResponseStatus * _Nonnull responseStatus) {
    // ...
}];





 







val userAccessToken = "xxx"

val contact = Contact()
contact.contactClassCd = "0006" // 来場
contact.contactMethodClassCd = "0009" // アプリ
contact.point = 10 // 増減したいポイント
contact.attributes = mapOf(
    "shop_cd" to "0001" // 独自に追加した項目
)

RKZClient.getInstance().addContact(userAccessToken, contact) { rkzResponseStatus ->
    // ...
}





 







String userAccessToken = "xxx";

Contact contact = new Contact();
contact.setContactClassCd("0006"); // コンタクト種別(来場)
contact.setContactMethodClassCd("0009"); // コンタクト方法種別(アプリ)
contact.setPoint(10); // 増減したいポイント
contact.setAttributesValue("shop_cd", "0001"); // 独自に追加した項目

RKZClient.getInstance().addContact(userAccessToken, contact, new OnAddContactListener() {
    @Override
    public void onAddContact(RKZResponseStatus rkzResponseStatus) {
        // ...
    }
});





 








var userAccessToken = 'xxx'

var contact = {
  contact_class_cd: '0006', // コンタクト種別(来場)
  contact_method_class_cd: '0009', // コンタクト方法種別(アプリ)
  point: 10, // 増減したいポイント
  attributes: {
    shop_cd: '0001' // 独自に追加した項目
  }
}

RKZClient.addContact(userAccessToken, contact, function (statusCode) {
  // ...
}, function (error) {
  // ...
})





 










const userAccessToken = 'xxx'

await RKZ.Contact.add(userAccessToken, {
  contact_class_cd: '0006', // コンタクト種別(来場)
  contact_method_class_cd: '0009', // コンタクト方法種別(アプリ)
  point: 10, // 増減したいポイント
  attributes: {
    shop_cd: '0001' // 独自に追加した項目
  }
})





 




final userAccessToken = 'xxx';

final contact = Contact();
contact.contactClassCd = '0006'; // 来場
contact.contactMethodClassCd = '0009'; // アプリ
contact.point = 10; // 増減したいポイント
contact.attributes = {
  'shop_cd': '0001' // 独自に追加した項目
};

await RKZClient.instance.addContact(userAccessToken, contact);





 






管理画面の「コンタクト管理」→「コンタクト履歴検索」を開くと、登録したコンタクト履歴を確認することができます。

コンタクト履歴を検索する

コンタクト履歴の検索はgetContactListメソッド(JavaScript・FlutterはContactQuery.findメソッド)で⾏います。

検索条件、ソート条件を指定することができます。指定可能な条件については検索条件ソート条件を参照してください。

let userAccessToken = "xxx"

// 検索条件
let searchConditions = [
    // shop_cdが"0001"のレコードに絞り込む
    RKZSearchCondition(RKZSearchConditionEqual, searchColumn: "shop_cd", searchValueArray: ["0001"])
]
// ソート条件
let sortConditions = [
    // contact_dateの降順にソート
    RKZSortCondition(RKZSortTypeDesc, sortColumn: "contact_date")
]

RKZService.sharedInstance().getContactList(userAccessToken, searchConditionArray: searchConditions, sortConditionArray: sortConditions) { contacts, responseStatus in
    if responseStatus.isSuccess {
        // 成功時
        contacts.forEach { item in
            print("contact_no:", item.contact_no ?? "")
            print("contact_date:", item.contact_date ?? "")
            print("contact_class_cd:", item.contact_class_cd ?? "")
            print("contact_method_class_cd:", item.contact_method_class_cd ?? "")
            print("point:", item.point ?? "")
            print("shop_cd:", item.attributes?["shop_cd"] ?? "")
        }
    } else {
        // 失敗
        print("statusCode:", responseStatus.statusCode.rawValue)
        print("message:", responseStatus.message ?? "")
    }
}
NSString *userAccessToken = @"xxx";

// 検索条件
NSArray<RKZSearchCondition *> *searchConditions = @[
    // shop_cdが"0001"のレコードに絞り込む
    [[RKZSearchCondition alloc] initWithSearchConditionType:RKZSearchConditionEqual searchColumn:@"shop_cd" searchValueArray:@[@"0001"]]
];
// ソート条件
NSArray<RKZSortCondition *> *sortConditions = @[
    // contact_dateの降順にソート
    [[RKZSortCondition alloc] initWithSortType:RKZSortTypeDesc sortColumn:@"contact_date"]
];

[[RKZService sharedInstance] getContactList:userAccessToken searchConditionArray:searchConditions sortConditionArray:sortConditions withBlock:^(NSArray<RKZContactData *> * _Nonnull contacts, RKZResponseStatus * _Nonnull responseStatus) {
    if (responseStatus.isSuccess) {
        // 成功時
        for (RKZContactData *item in contacts) {
            NSLog(@"contact_no: %@", item.contact_no);
            NSLog(@"contact_date: %@", item.contact_date);
            NSLog(@"contact_class_cd: %@", item.contact_class_cd);
            NSLog(@"contact_method_class_cd: %@", item.contact_method_class_cd);
            NSLog(@"point: %@", item.point);
            NSLog(@"shop_cd: %@", item.attributes[@"shop_cd"]);
        }
    } else {
        // 失敗
        NSLog(@"statusCode: %ld", responseStatus.statusCode);
        NSLog(@"message: %@", responseStatus.message);
    }
}];
val userAccessToken = "xxx"

// 検索条件
val searchConditions = listOf(
    // shop_cdが"0001"のレコードに絞り込む
    RKZSearchCondition(RKZSearchCondition.EQUAL, "shop_cd", listOf("0001"))
)
// ソート条件
val sortConditions = listOf(
    // contact_dateの降順にソート
    RKZSortCondition(RKZSortCondition.DESC, "contact_date")
)

RKZClient.getInstance().getContactList(userAccessToken, searchConditions, sortConditions) { contacts, rkzResponseStatus ->
    if (rkzResponseStatus.isSuccess) {
        // 成功時
        contacts.forEach {
            Log.d(TAG, "contactNo: ${it.contactNo}")
            Log.d(TAG, "contactDate: ${it.contactDate}")
            Log.d(TAG, "contactClassCd: ${it.contactClassCd}")
            Log.d(TAG, "contactMethodClassCd: ${it.contactMethodClassCd}")
            Log.d(TAG, "point: ${it.point}")
            Log.d(TAG, "shop_cd: ${it.attributes["shop_cd"]}")
        }
    } else {
        // 失敗
        Log.e(TAG, "statusCode: ${rkzResponseStatus.statusCode}")
        Log.e(TAG, "message: ${rkzResponseStatus.message}")
    }
}
String userAccessToken = "xxx";

// 検索条件
List<RKZSearchCondition> searchConditions = Arrays.asList(
    // shop_cdが"0001"のレコードに絞り込む
    new RKZSearchCondition(RKZSearchCondition.EQUAL, "shop_cd", Arrays.asList("0001"))
);
// ソート条件
List<RKZSortCondition> sortConditions = Arrays.asList(
    // contact_dateの降順にソート
    new RKZSortCondition(RKZSortCondition.DESC, "contact_date")
);

RKZClient.getInstance().getContactList(userAccessToken, searchConditions, sortConditions, new OnGetContactListListener() {
    @Override
    public void onGetContactList(List<Contact> contacts, RKZResponseStatus rkzResponseStatus) {
        if (rkzResponseStatus.isSuccess()) {
            // 成功時
            for (Contact item : contacts) {
                Log.d(TAG, "contactNo: " + item.getContactNo());
                Log.d(TAG, "contactDate: " + item.getContactDate());
                Log.d(TAG, "contactClassCd: " + item.getContactClassCd());
                Log.d(TAG, "contactMethodClassCd: " + item.getContactMethodClassCd());
                Log.d(TAG, "point: " + item.getPoint());
                Log.d(TAG, "shop_cd: " + item.getAttributesValueString("shop_cd"));
            }
        } else {
            // 失敗
            Log.e(TAG, "statusCode: " + rkzResponseStatus.getStatusCode());
            Log.e(TAG, "message: " + rkzResponseStatus.getMessage());
        }
    }
});
var userAccessToken = 'xxx'

// 検索条件
var searchConditions = [
  // shop_cdが"0001"のレコードに絞り込む
  RKZSearchCondition.equal('shop_cd', '0001')
]
// ソート条件
var sortConditions = [
  // contact_dateの降順にソート
  RKZSortCondition.desc('contact_date')
]

RKZClient.getContactList(userAccessToken, searchConditions, sortConditions, function (contacts) {
  // 成功時
  contacts.forEach(function (item) {
    console.debug('contact_no:', item.contact_no)
    console.debug('contact_date:', item.contact_date)
    console.debug('contact_class_cd:', item.contact_class_cd)
    console.debug('contact_method_class_cd:', item.contact_method_class_cd)
    console.debug('point:', item.point)
    console.debug('shop_cd:', item.attributes.shop_cd)
  })
}, function (error) {
  // 失敗時
  console.error('status_code:', error.status_code)
  console.error('message:', error.message)
})
const userAccessToken = 'xxx'

const contacts = await RKZ.Contact.query(userAccessToken)
    .equalTo('shop_cd', '0001') // shop_cdが"0001"のレコードに絞り込む
    .desc('contact_date') // contact_dateの降順にソート
    .find()

contacts.forEach(item => {
  console.debug('contact_no:', item.contact_no)
  console.debug('contact_date:', item.contact_date)
  console.debug('contact_class_cd:', item.contact_class_cd)
  console.debug('contact_method_class_cd:', item.contact_method_class_cd)
  console.debug('point:', item.point)
  console.debug('shop_cd:', item.attributes.shop_cd)
})
final userAccessToken = 'xxx';

final query = RKZClient.instance.contactQuery(userAccessToken)
  ..equalTo('shop_cd', '0001') // shop_cdが"0001"のレコードに絞り込む
  ..desc('contact_date'); // contact_dateの降順にソート
final contacts = await query.find();

contacts.forEach((item) {
  print('contactNo: ${item.contactNo}');
  print('contactDate: ${item.contactDate}');
  print('contactClassCd: ${item.contactClassCd}');
  print('contactMethodClassCd: ${item.contactMethodClassCd}');
  print('point: ${item.point}');
  print('shop_cd: ' + item.attributes?['shop_cd']);
});

ヒント

アプリケーションで独自に追加した項目はattributesというプロパティに設定されて返ってきます。