개발 없이 BigQuery 데이터를 활용해 노티플라이 유저 속성 자동 업데이트하기

개발 없이 BigQuery 데이터를 Google Sheet와 App Script를 활용하여 노티플라이에 자동으로 유저 속성을 업데이트하는 간편한 방법을 안내합니다.

개발 없이 BigQuery 데이터를 활용해 노티플라이 유저 속성 자동 업데이트하기
BigQuery 데이터를 활용해 유저 속성 자동 업데이트하기

안녕하세요 노티플라이 팀입니다. 오늘은 개발 리소스 없이 BigQuery에 있는 유저 데이터를 손쉽게 노티플라이에 자동 업데이트하는 방법을 소개합니다. 마케터들도 다양한 유저 데이터를 쉽고 빠르게 노티플라이 메시징 캠페인에 바로 활용할 수 있습니다.

✏️
이 글의 내용과 코드는 리텐션 심규섭 님의 도움을 받아 완성되었습니다. 감사합니다!

1. 개발이 없이도 유저 속성을 주기적으로 업데이트할 수 있다면?

최근 많은 기업들이 고객 데이터를 활용해 개인화된 마케팅 메시지를 발송합니다. 하지만 내부 개발 인력이 부족하거나 바쁜 일정으로 인해 유저 데이터를 캠페인에 활용하기 어려운 경우가 많습니다. 이럴 때 개발 작업 없이도 데이터를 손쉽게 연동할 수 있다면 얼마나 좋을까요?

예를 들어, 온라인 쇼핑몰에서 고객이 주문한 상품의 배송일이 다가왔을 때, 배송비를 절약할 수 있는 구독권을 안내하는 메시지를 발송하면 고객의 만족도를 높일 수 있습니다. 이런 캠페인을 운영하려면 고객의 배송 예정일과 배송비 정보가 필요합니다. 

이번 글에서는 개발 없이 이러한 유저 데이터를 BigQuery에서 Google Sheet를 거쳐 자동으로 노티플라이에 업데이트하는 방법을 안내합니다.

2. BigQuery 데이터 기반으로 노티플라이 유저 속성 업데이트 흐름

BigQuery → Google Sheet → App Script → 노티플라이 API

각 단계의 역할은 다음과 같습니다:

  1. BigQuery → Google Sheet: Google Sheet의 직관적이고 쉬운 인터페이스를 이용해 데이터 조회 및 관리가 편리합니다.
  2. Google Sheet → App Script: App Script는 Excel의 매크로와 비슷한 기능으로, Google Sheet 데이터를 쉽게 가공하고 외부 API와 연동할 수 있게 도와줍니다.
  3. App Script → 노티플라이 API: 최종적으로 가공된 데이터를 노티플라이로 보내 고객 정보를 최신 상태로 유지할 수 있습니다.
BigQuery 데이터로 노티플라이 유저 속성 업데이트 흐름

2-1. BigQuery 데이터를 Google Sheet로 자동 업데이트

Google Sheet는 별도의 개발 없이 BigQuery 데이터를 자동으로 가져오는 기능이 있습니다.

  1. Google Sheet에서 데이터 → 데이터 커넥터 → BigQuery를 선택합니다.
  2. BigQuery에서 가져올 데이터를 쿼리로 작성하거나, 이미 저장된 테이블을 선택합니다.
  3. 데이터를 주기적으로 자동 새로고침하도록 매일 설정합니다.

더 자세한 내용을 원하시면 구글 공식 문서인 “연결된 시트 사용”을 참고해 주세요.

2-2. Google Apps Script를 이용한 데이터 처리

Google Apps Script는 프로그래밍 경험이 많지 않아도 쉽게 사용할 수 있는 스크립트 도구입니다. 스프레드시트 메뉴의 확장 프로그램 → Apps Script를 선택해 편집기를 엽니다.

다음은 예제 스크립트 코드입니다:

/**
 * Reads user data from the “our_users” sheet,
 * fetches an access token from Notifly’s Auth API,
 * then sends a batch of user properties to Notifly.
 */
function sendBatchUserPropertiesToNotifly() {
  // ——— Configuration ———
  const SHEET_NAME        = 'our_users';                                      // name of the sheet
  const TOKEN_URL         = 'https://api.notifly.tech/auth/token';          // endpoint to exchange keys for a token
  const USER_PROP_URL     = 'https://api.notifly.tech/set-user-properties'; // endpoint to set user properties
  const ACCESS_KEY        = 'YOUR_ACCESS_KEY';                              // replace with your accessKey
  const SECRET_KEY        = 'YOUR_SECRET_KEY';                              // replace with your secretKey
  const PROJECT_ID        = 'YOUR_PROJECT_ID';              // your Notifly project ID

  // ——— 1. Fetch an access token ———
  const authPayload = {
    accessKey: ACCESS_KEY,
    secretKey: SECRET_KEY
  };
  const authOptions = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(authPayload),
    muteHttpExceptions: true
  };
  let token;
  try {
    const authResp = UrlFetchApp.fetch(TOKEN_URL, authOptions);
    const authJson = JSON.parse(authResp.getContentText());
    token = authJson.data;
    if (!token) throw new Error('No token returned from auth API');
  } catch (e) {
    Logger.log('Failed to fetch auth token: ' + e.message);
    return;
  }

  // ——— 2. Read rows from the sheet ———
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  if (!sheet) {
    Logger.log(`Sheet "${SHEET_NAME}" not found.`);
    return;
  }
  const lastColumn = sheet.getLastColumn();
  const headerRow  = sheet.getRange(1, 1, 1, lastColumn)
                          .getValues()[0];
  const numCols    = headerRow.length;

  const lastRow = sheet.getLastRow();  
  if (lastRow < 2) {
    Logger.log('No data rows found (sheet is empty beyond the header).');
    return;
  }
  const firstDataRow = 2;
  const numRows      = lastRow - firstDataRow + 1;



  const rows = sheet
    .getRange(firstDataRow, 1, numRows, numCols)  // (startRow, startCol, #rows, #cols)
    .getValues();

  const filtered = rows.filter(r => r.some(cell => cell !== ''));

  // ——— 3. Build batch payload ———
  const batchPayload = [];
  filtered.forEach(([userId, deliveryPrice, deliveryDateRaw]) => {
    // only include rows where all required fields are present
    if (userId && deliveryPrice && deliveryDateRaw) {
      // format the date as yyyy-MM-dd in the script's timezone
      const formattedDate = Utilities.formatDate(
        new Date(deliveryDateRaw),
        Session.getScriptTimeZone(),
        'yyyy-MM-dd'
      );

      batchPayload.push({
        projectId:    PROJECT_ID,
        userId:       String(userId),
        userProperties: {
          delivery_price: deliveryPrice,
          delivery_date:  formattedDate
        }
      });
    }
  });

  if (batchPayload.length === 0) {
    Logger.log('No valid rows to send.');
    return;
  }

  // ——— 4. Send batch request ———
  const requestOptions = {
    method:              'post',
    contentType:         'application/json',
    headers: {
      Authorization:     token
    },
    payload:             JSON.stringify(batchPayload),
    muteHttpExceptions:  true
  };

  try {
    const resp = UrlFetchApp.fetch(USER_PROP_URL, requestOptions);
    Logger.log('Notifly response: ' + resp.getContentText());
  } catch (err) {
    Logger.log('Error sending to Notifly: ' + err.message);
  }
}

2-3. 유저 속성 업데이트 결과 확인

API 호출이 성공적으로 이루어졌는지는 노티플라이 콘솔의 유저 리스트에서 확인할 수 있습니다. 개인화 조건에서 유저 속성에 따라 자동으로 메시지를 보낼 수 있도록 설정하세요.

3. 활용 사례

예를 들어, 쇼핑몰 고객이 주문한 상품이 배송되기 3일 전에 배송비 구독권 안내 메시지를 자동으로 발송할 수 있습니다.

  • 매일 새로고침된 배송 데이터를 노티플라이에 연동
  • 노티플라이의 캠페인 조건 설정으로 "배송 3일 전" 메시지를 자동 발송
  • 고객은 정확한 타이밍에 개인화된 혜택을 안내받게 됩니다.

배송일 3일 전에 해당하는 유저를 타게팅하기 위해서 유저 조건에서도 liquid문을 활용하실 수 있습니다. 노티플라이 사용자 가이드의 개인화 유저 조건 설정을 참고해 주세요.

4. 개발 리소스 없이 유저 데이터 업데이트 응용법

이번 글에서 소개해 드린 내용은 주로 BigQuery의 데이터를 활용하는 사례였는데요. 그 외에도 다양한 데이터가 구글 스프레드시트와 연동이 되어있다면 Google Apps Script를 활용하여 유저 속성도 업데이트 뿐만 아니라 API 기반 캠페인 발송 등 다양한 방식으로 응용이 가능합니다.

개발 리소스를 쓰지 않고도 외부 데이터를 노티플라이와 자동 연동하여 더 정교하고 다양한 개인화 CRM 마케팅 캠페인을 실행할 수 있는 방법을 알아보았습니다.앞으로도 더 유용한 자동화 마케팅 방법을 소개해 드리겠습니다.

함께 읽어보면 좋은 글

Read more

[히어로 인터뷰] 애슬러의 그로스 마케팅, 고객 맞춤형 경험으로 성과 개선을 이끌다

[히어로 인터뷰] 애슬러의 그로스 마케팅, 고객 맞춤형 경험으로 성과 개선을 이끌다

애슬러는 40·50대 남성을 위한 패션 플랫폼으로, 고객 페르소나 분석과 개인화된 마케팅 전략을 통해 빠르게 성장했습니다. 특히 CRM 마케팅을 활용한 맞춤형 메시지와 퍼포먼스 마케팅 최적화를 통해 월간 활성 이용자 수 221% 증가, 재구매율 31.9% 달성 등 높은 성과를 이끌어냈습니다.

By 노티플라이
[히어로 인터뷰] 데이터와 고객 중심 사고로 성장한 이그니스의 고객 획득 비결

[히어로 인터뷰] 데이터와 고객 중심 사고로 성장한 이그니스의 고객 획득 비결

이그니스는 2014년 설립된 브랜드 개발 기업으로, ‘랩노쉬’, ‘클룹’ 등 다양한 브랜드를 운영하며 국내외 시장에서 성장하고 있습니다. 이그니스에서는 고객 데이터를 기반으로 재구매율을 높이는 전략을 실행하며, 이벤트 기반 캠페인과 실시간 메시지 마케팅을 효과적으로 활용하고 있습니다. 데이터 분석과 고객 중심 사고를 결합해 차별화된 마케팅을 구축하며, 지속적인 성장과 혁신을 이어가고 있습니다.

By 노티플라이