
  <!DOCTYPE html>
  <html lang="ko">
    <head>
      <meta charset="utf-8" />
      <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=yes,width=device-width,height=device-height" />
      <meta http-equiv="X-UA-Compatible" content="ie=edge">

      
          <title>NNT 뉴스레터 커밋(ComIT) 구독하기</title>
          
          <meta name="description" content="ComIT은 마케팅 컨설팅 회사 NNT에서 운영하는 뉴스레터로,
저희가 진행해온 프로젝트의 노하우와 인사이트를 공유해드립니다! 🎁

🙋🏻‍♀️ IT와 친해지고 싶은 마케터분들! 
🙋🏻‍♂️ IT 업계의 핫한 마테크(Marketing + Tech) 정보를 얻고싶은 분들! 

IT 1도 몰라도 누구나 쉽게 이해할 수 있도록 알맹이만 쏙쏙 담은 정보를 전해드려요! 매주 1회 메일함으로 찾아갈게요!" />
	        <meta name="keywords" content="NNT 뉴스레터 커밋(ComIT) 구독하기, 뉴스레터, newsletter" />
        
          <meta property="og:title" content="NNT 뉴스레터 커밋(ComIT) 구독하기"/>
          <meta property="og:description" content="ComIT은 마케팅 컨설팅 회사 NNT에서 운영하는 뉴스레터로,
저희가 진행해온 프로젝트의 노하우와 인사이트를 공유해드립니다! 🎁

🙋🏻‍♀️ IT와 친해지고 싶은 마케터분들! 
🙋🏻‍♂️ IT 업계의 핫한 마테크(Marketing + Tech) 정보를 얻고싶은 분들! 

IT 1도 몰라도 누구나 쉽게 이해할 수 있도록 알맹이만 쏙쏙 담은 정보를 전해드려요! 매주 1회 메일함으로 찾아갈게요!"/>
          <meta property="og:image" content="https://img.stibee.com/9284dce3-bd81-46fa-994d-c924c97093ce.png"/>
        
      <meta name="twitter:card" content="summary">
      <link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png">
      <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
      <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png">
      <meta name="msapplication-TileColor" content="#da532c">
      <meta name="theme-color" content="#ffffff">
      <link href="/static/css/763.e785920a.css" rel="stylesheet" />
      <meta name="naver-site-verification" content="72253dacb98f56ac73f44a8cf8b5f12db38bc861" />

      <script type="text/javascript">
        (function (f, b) { if (!b.__SV) { var e, g, i, h; window.mixpanel = b; b._i = []; b.init = function (e, f, c) { function g(a, d) { var b = d.split("."); 2 == b.length && ((a = a[b[0]]), (d = b[1])); a[d] = function () { a.push([d].concat(Array.prototype.slice.call(arguments, 0))); }; } var a = b; "undefined" !== typeof c ? (a = b[c] = []) : (c = "mixpanel"); a.people = a.people || []; a.toString = function (a) { var d = "mixpanel"; "mixpanel" !== c && (d += "." + c); a || (d += " (stub)"); return d; }; a.people.toString = function () { return a.toString(1) + ".people (stub)"; }; i = "disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove".split(" "); for (h = 0; h < i.length; h++) g(a, i[h]); var j = "set set_once union unset remove delete".split(" "); a.get_group = function () { function b(c) { d[c] = function () { call2_args = arguments; call2 = [c].concat(Array.prototype.slice.call(call2_args, 0)); a.push([e, call2]); }; } for (var d = {}, e = ["get_group"].concat(Array.prototype.slice.call(arguments, 0)), c = 0; c < j.length; c++) b(j[c]); return d; }; b._i.push([e, f, c]); }; b.__SV = 1.2; e = f.createElement("script"); e.type = "text/javascript"; e.async = !0; e.src = "undefined" !== typeof MIXPANEL_CUSTOM_LIB_URL ? MIXPANEL_CUSTOM_LIB_URL : "file:" === f.location.protocol && "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match("^\/\/") ? "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js" : "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"; g = f.getElementsByTagName("script")[0]; g.parentNode.insertBefore(e, g); } })(document, window.mixpanel || []);
        var isDevelopment = window.location.hostname.toLowerCase().search('qa-page.stibee.com') >= 0
        if (isDevelopment) {
          mixpanel.init('9e30c13fe764a85c5e64cd7c2b7b9cb0', { debug: true, persistence: 'localStorage' });
        } else {
          mixpanel.init('3fc318e90152de4748e8f6ed5b40a0a6', { debug: false, persistence: 'localStorage' });
        }
      </script>
      <!-- Facebook Pixel Code -->
      <script>
      !function(f,b,e,v,n,t,s)
      {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
      n.callMethod.apply(n,arguments):n.queue.push(arguments)};
      if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
      n.queue=[];t=b.createElement(e);t.async=!0;
      t.src=v;s=b.getElementsByTagName(e)[0];
      s.parentNode.insertBefore(t,s)}(window, document,'script',
      'https://connect.facebook.net/en_US/fbevents.js');
      fbq('init', '937128733822281');
      fbq('track', 'PageView');
      </script>
      <noscript><img height="1" width="1" style="display:none"
      src="https://www.facebook.com/tr?id=937128733822281&ev=PageView&noscript=1"
      /></noscript>
      <!-- End Facebook Pixel Code -->
        
      
    </head>
    <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root">
    
    </div>
    
    <script src="/static/js/runtime-main.72721c04.js"></script>
    <script src="/static/js/763.chunk.js"></script>
    <script src="/static/js/main.93e37582.js"></script>
    </body>
    <script src="https://nsp.pay.naver.com/sdk/js/naverpay.min.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js" ></script>
    <script type="text/javascript" src="https://cdn.iamport.kr/v1/iamport.js"></script>
    <script>
      IMP.init('imp27287957');
    </script>
    <noscript>
      <img src="https://c.paypal.com/v1/r/d/b/ns?f=RISK_SESSION_CORRELATION_ID&s=SOURCE_IDENTIFIER&js=0&r=1" />
    </noscript>
  </html>
  
  
  