# Overview
MAAC lets brands create and update contacts in several ways, matching against existing data by a designated "Key" to automatically decide whether to add a new contact or update existing fields. This article explains:
- The content and format supported by each contact field
- The matching logic of the Key (the matching basis)
- The update behavior of each field
- Non-updatable fields per channel (LINE UID, WA Mobile, Email, etc.)
- Email / WhatsApp contact status, reachability, and irreversible update rules
- The definition and uses of bound contacts
- Common errors and reasons updates fail
- Identity conflict detection: how the system avoids incorrect merges when Customer IDs are inconsistent
- The purpose and update logic of system-maintained fields (such as
last_message_time)
# Matching Logic
When importing or creating contact data, you must select a Key as the matching basis.
- If the Key matches → update the existing contact
- If no match → create a new contact profile / do not update any contact
| Key | Applies to | Matching logic | Notes |
|---|---|---|---|
| line_uid | LINE contacts | Exact match on LINE UID | LINE UID is a non-editable field |
| customer_id | Cross-channel contacts | Match on the brand's custom unique identifier | Can only update basic channel contact data |
| phone |
WhatsApp contacts SMS contacts Or contacts that have a phone field |
Match on phone number | |
| EDM contacts | Exact match on Email | EDM Email is a non-editable field |
Important: the sending key field of each channel contact is non-updatable:
- LINE contact: LINE UID
- WhatsApp contact: WhatsApp mobile
- Email contact: Email
- Other contact: phone
If the CSV provides a value for this field, the system ignores it and does not update.
📌 We recommend exporting your data once before importing, to confirm the Key is consistent and avoid creating duplicate contacts.
Identity Conflict Detection (Inconsistent Customer ID) 🆕
When the system matches multiple contacts that may belong to the same person (for example, grouped as the same person by Email or phone), but these contacts carry different Customer IDs, the system does not merge them automatically—to avoid incorrectly merging different people—and marks them as an "identity conflict."
- Customer ID matching ignores letter case and leading/trailing whitespace.
- When a conflict occurs, the related contacts each remain standalone contacts and are not merged into one.
- You can see the conflict notice on the Unified Contact Profile, and you can download the conflict list from the contact list's Export menu for cleanup.
When you set Customer ID as a Unify Key in Customer Data Hub (CDH), it participates in identity unification and triggers the conflict protection above when inconsistent. If it is not set as a Unify Key, Customer ID is just a regular contact field and can be updated normally.
How to resolve a conflict:
- Confirm whether these contacts truly belong to the same person.
- Correct the incorrect Customer ID, or fill in the correct identifiers.
- Re-import these contacts so the system can re-run identity unification (unification runs in the background; check the result again once it completes).
👉 To download the conflict list, see: How to Export Contacts and the Data Mapping Table. To re-import after corrections, see: Tutorial | Import and Update Contact Data in MAAC.
How Fields Display on a Unified Contact 🆕
Once multiple channel contacts of the same person are grouped into one unified contact, the fields shown on the Unified Contact Profile (such as display name, birthday, gender, custom fields, and tags) are aggregated from the data of the channel contacts under it, with the most recently updated value taking precedence for each field.
Channel-specific identifiers such as phone and Email stay at the channel level and do not overwrite the values of other channel contacts because of the grouping.
👉 For a full explanation of each section of the Unified Contact Profile, see: Tutorial | Unified Contact Profile and Splitting Contacts.
# Email Contact Subscription Status Logic
In addition to being identified by email as the primary key, whether an Email contact can be sent to normally in automated journeys or other Email features also depends on the subscription status messaging_status.
| Status displayed | Definition | Sendable |
|---|---|---|
| Subscribed | The contact has agreed to receive Email, and the mailbox status is normal. | Yes |
| Unsubscribed | The contact has actively clicked unsubscribe; Email should no longer be sent. | No |
⚠️ Email status is "irreversible" once unsubscribed: you cannot use a CSV import to change an "Unsubscribed" or "system-suppressed" contact back to "Subscribed." If the CSV attempts to reset it, the system ignores that status update.
* However, you can use a CSV import to change a "Subscribed" contact to "Unsubscribed," in order to clean your list.
👉 For detailed import rules, see: Onboarding Guide|How to Enable Email Channels and Import Contacts and Tutorial | Import and Update Contact Data in MAAC
# Contact Field Support Overview
Base fields
| Field name | Description | Importable | Updatable | Notes |
|---|---|---|---|---|
| phone | Phone | ✅ | Yes | Serves as a matching Key; avoid multiple contacts sharing one value |
| customer_id | Brand's custom identifier | ✅ | Yes | Recommended for CRM use |
| ✅ | Not updatable (Email contact key) |
Identifies the Email contact; read together with subscription status | ||
| name | Display name | ✅ | Yes | Overwrites when a value is present |
| note | Note | ✅ | Yes | Overwrites when a value is present |
| tags | Contact tags | ✅ | Yes | Tags are merged, not overwritten |
📌 In addition to the base fields above, brands can create their own "Custom Fields"—see the Custom Fields section below.
Channel contact sending Keys (non-updatable)
| Field | Channel | Rule |
|---|---|---|
| line_uid | LINE | The unique identifier bound to LINE; non-updatable |
| WhatsApp_mobile |
Used as the primary key when importing WA contacts; non-updatable
|
|
| EDM | Used as the primary key when importing Email contacts; non-updatable. Whether it is sendable depends on the subscription status | |
| phone (SMS) | SMS | The SMS contact's primary key; can be used as a Key, but cannot be overwritten by a customer_id update |
System-maintained fields
The following fields are written and updated automatically by the system. Brands cannot edit them manually, nor overwrite them via CSV import or API.
| Field name | Description | Data type | Written / cleared when | Purpose and notes |
|---|---|---|---|---|
last_message_time(last message time) |
Records the last time the contact sent a message on each channel (LINE / WhatsApp) | DateTime (UTC) |
Written: updated automatically each time the contact sends a message
|
Used to evaluate the "first message" trigger in automated journeys—when this field is empty (NULL), the system treats that message as the "first message." 📌 This field is system-maintained and cannot be edited manually by brands. |
When a contact unfollows on LINE or opts out on WhatsApp,
last_message_time is cleared. If that contact later re-follows (LINE re-follow) or re-subscribes (WhatsApp re-opt-in), the first message they send is again treated as the "first message," which can re-trigger the corresponding automated journey.👉 For detailed journey trigger logic, see: Feature Description|Omnichannel Automated Journeys
# Custom Fields
In addition to the base fields above, brands can create their own "Custom Fields" through Admin Center to integrate structured CRM data into MAAC contacts.
📕 Read first: Tutorial|MAAC × CAAC Cross-Product Custom Field Setup (creating and managing fields in Admin Center)
Supported data types
| Data type | Description | Use cases |
|---|---|---|
| Text | Free-form text | Membership tier, preferred product category |
| Number | Numeric format; supports greater-than/less-than comparison | Reward points, purchase count, spending amount |
| Date | Date only (YYYY-MM-DD), no time | Birthday, membership anniversary, contract expiry date |
| DateTime | Precise to the second, stored as UTC+0 underneath, and automatically converted to the organization's time zone in the interface | Appointment expiry time, limited-time coupon expiry time |
View and manually edit custom fields
On any contact's page, you can find the Custom fields section. Click 🔒 Edit to update the custom field values manually, then click Save to sync them to CDH.
- Fields are sorted by creation time
- If a field is archived in Admin Center, it will not be shown in the MAAC interface
How to modify custom fields
The system supports four ways to modify fields, so your list always stays up to date:
| Update method | How it works |
|---|---|
| Automatic sync (API) | If your company has connected an external CRM, data updates automatically at any time so you always see the latest status. For details, see this API documentation. |
| Bulk CSV import | Suitable for marketers doing monthly reconciliations, or for batch-uploading offline event lists. 👉 Tutorial | Import and Update Contact Data in MAAC |
| Manual editing | You can modify field content directly on the contact page (as described in the "View and manually edit" section above). |
| Automatic update via journeys (Journey auto-update) | In an automated journey, you can use the "Update attribute" action node to automatically write or clear custom field values. 👉 Feature Description|Automated Journeys |
If you "Archive" a custom field in Admin Center, that field is hidden from the MAAC contact interface, and the system stops reading and writing it. After you unarchive it, the historical data is fully restored.
👉 For more on using custom fields in journeys and contacts, see: Tutorial|Using Cross-Product Custom Fields in MAAC
# Field Update Behavior and Notes
| Behavior | How the system handles it |
| New value present | Overwrites the original value |
| Field is empty | Skipped; does not overwrite |
| Multiple tags | Merged; original tags are not cleared |
| Incorrect CSV field name | That field is skipped |
| Updating a non-updatable field (such as line_uid, email, WA mobile) | Ignored |
| Updating an Email contact's status to Subscribed (when the original status is Unsubscribed / system-suppressed) | The system ignores that status update; only other updatable fields are updated |
Attempting to modify a system-maintained field via CSV or API (such as last_message_time) |
Ignored; this field is only written and cleared automatically by the system |
# What Is a "Bound Contact"?
In MAAC, if a contact's data includes the customer_id field, the contact is a "bound contact." This means the contact has been identified and bound to the brand's own system (such as a membership system or CRM), and can serve as a target for further integration and personalization.
Use cases:
Rich menu personalization
Show dedicated content for bound contacts—for example, "Join membership" for unbound contacts and "Check orders" or "Member points" for bound contacts.Differentiated auto-reply messages
Set conditions in auto-reply to send different messages to bound contacts, such as VIP-only offers or birthday greetings.Integrate membership system data
When the API or Webhook returns data, you can usecustomer_idto link data and ensure identity consistency.
📌 Tip
If your brand has a membership program or loyalty plan, or you want to enable more advanced personalized campaigns and marketing automation, we recommend binding customer_id first.
📌 If you have already enabled the Email channel, we also recommend going to Customer Data Hub (CDH) and setting Email as a Unify Key. This lets LINE and Email contacts be grouped more accurately, and avoids cross-channel journeys triggering or communicating repeatedly.
# FAQ
Q1: Which field should I choose as the matching basis?
A: Choose the most representative Key based on your import data source:
- LINE webhook → use line_uid
- CRM system data → use customer_id
- Phone list → use phone, but make sure there are no duplicate phone values
Q2: If I import data using phone as the Key, which contact gets updated?
A: If the system has multiple contacts with the same phone, it updates the one with the later creation time.
We recommend using line_uid or customer_id instead, to avoid updating the wrong contact.
Q3: Can external_member_id be used to import or update?
A: No. This field is only for looking up the UID mapping in exports; it cannot be used as an import field.
Q4: Can the last_message_time field be modified manually?
A: No. last_message_time is a system-maintained field, updated automatically each time a contact sends a message on LINE or WhatsApp. Brands cannot modify it via CSV import, API, or manual editing. This field is primarily used to evaluate the "first message" trigger in automated journeys.