빌더 폼 한계 넘어서기

빌더 폼 한계 넘어서기5분 분량

Netlify Forms 한도: 제출 100건에서 일어나는 일과 해결 방법

레거시 Netlify 플랜은 사이트별 폼 제출을 계량해 자동으로 업그레이드하고, 크레딧 플랜은 사이트를 일시 중지할 수 있으니 폼을 백엔드로 옮기세요.

Preet SutharIkiform 창업자

Netlify의 레거시 플랜에서는 사이트마다 월 100건의 폼 제출이 포함되며, 이를 넘으면 사이트가 자동으로 유료 Forms 등급으로 올라갑니다. 2025년 9월 이후 생성된 계정의 크레딧 기반 플랜에서는 폼이 무료지만, 크레딧이 떨어진 무료 팀은 폼을 포함한 모든 사이트가 일시 중지됩니다. 폼을 Ikiform으로 옮기려면 일반 HTML이든 어떤 프레임워크든 Netlify 속성을 제거하고 action을 설정하면 됩니다.

Netlify에서 다른 점

Netlify는 사이트 빌더가 아니라 폼이 내장된 호스트입니다. 이 점이 한도와 해결 방법 모두를 결정합니다. 어떤 한도가 적용되는지는 계정 생성 시점에 따라 다릅니다.

계정Netlify 문서의 설명제출이 많은 폼에 주는 의미
레거시 플랜, 2025년 9월 4일 이전 생성Forms Level 0은 사이트당 월 100건의 제출과 10 MB의 업로드를 포함합니다. 이를 넘으면 사이트가 1,000건의 Forms Level 1로 올라가고 결제 주기 말에 청구됩니다. 그 이상은 추가 사용량 패키지가 500건씩 더합니다스팸이 몰려오면 아무도 결정하지 않았는데 사이트가 유료 등급으로 올라갈 수 있습니다. 무료 레거시 등급에서는 한도에 도달하면 계정의 모든 사이트가 일시 중지됩니다
크레딧 기반 플랜, 그 이후 생성폼 제출은 등급 없이 무료이고 무제한입니다폼 자체에는 비용이 들지 않습니다. 하지만 무료 팀이 월 크레딧을 다 쓰면 Netlify가 모든 프로젝트를 일시 중지하고, 일시 중지된 프로젝트는 폼 제출을 받지 않습니다

Netlify 자체 문서는 레거시 업그레이드가 자동이며 사용량이 하위 등급보다 높은 동안에는 내려갈 수 없다고 분명히 밝힙니다. 결정하기 전에 Netlify 대시보드에서 팀의 플랜 유형과 사이트의 폼 사용량을 확인하세요.

사람들이 옮기는 두 번째 이유는 숫자와 무관합니다. Netlify Forms는 배포된 HTML을 읽는 방식으로 동작합니다.

  • 폼은 배포 시점에 감지됩니다. React, Vue, Svelte가 렌더링하는 폼은 그 HTML에 존재하지 않으므로, 빌드가 찾을 수 있도록 숨겨진 정적 사본을 두고 form-name 필드와 함께 그곳으로 POST합니다.
  • Next.js에서는 OpenNext 어댑터가 그 사본을 public/의 정적 파일로 요구하며, POST는 Next.js 페이지가 아니라 그 정적 파일로 가야 합니다. 사본 없이 React 코드에 data-netlify가 있으면 빌드가 실패합니다.
  • 제출은 urlencoded나 multipart여야 합니다. JSON은 받지 않습니다.
  • 폼은 사이트가 Netlify에 배포되어 있는 동안에만 동작합니다. 호스트를 옮기면 폼도 옮겨야 합니다.
레거시 Netlify 사이트의 폼 사용량이 한 달 동안 늘어나는 방식과 Ikiform으로 POST하면 바뀌는 것레거시 플랜, 사이트 하나, 한 달Ikiform으로 POST하는 폼Level0100건 포함101번째제출스팸도 집계됨Level1월 1,000건,청구됨추가 패키지각 500건추가Netlify의같은 페이지Ikiform엔드포인트일반actionURLNetlifyForms집계할 것 없음자동 업그레이드전송레거시 Netlify 사이트의 폼 사용량이 한 달 동안 늘어나는 방식과 Ikiform으로 POST하면 바뀌는 것레거시 플랜, 사이트 하나, 한 달Ikiform으로 POST하는 폼Level 0100건 포함101번째 제출스팸도 집계됨Level 1월 1,000건, 청구됨추가 패키지각 500건 추가Netlify의 같은 페이지Ikiform 엔드포인트일반 action URLNetlify Forms집계할 것 없음자동 업그레이드전송
  1. 레거시 플랜에서 사이트는 100건이 포함된 Forms Level 0으로 달을 시작합니다.
  2. 101번째 제출이 도착합니다. Netlify 사용량 문서는 사이트의 사용량을 기준으로 설명하므로, 스팸이 몰려와 한도를 넘길 수도 있습니다.
  3. Netlify가 사이트를 1,000건의 Forms Level 1로 올리고 주기 말에 청구합니다.
  4. Level 1을 넘으면 추가 사용량 패키지가 500건씩 더합니다.
  5. 폼이 Ikiform으로 POST하면 페이지는 여전히 Netlify에 있지만 POST는 Ikiform 엔드포인트로 갑니다.
  6. Netlify Forms는 POST를 받지 않으므로 집계하거나 업그레이드할 것이 없습니다.
호스팅은 Netlify에 남습니다. 폼의 목적지와 함께 계량만 옮겨 갑니다.

스택별로 폼 옮기기

코드를 바꾸기 전에 Netlify 폼 이름마다 Ikiform 폼을 하나씩 만들고 Honeypot field를 bot-field로 설정하세요. 그러면 기존 숨겨진 입력이 이름 변경 없이 허니팟으로 계속 동작합니다. 스택을 고르세요.

Netlify의 일반 HTML은 변경이 가장 적습니다. Netlify 속성과 form-name 입력을 삭제하고, action이 엔드포인트를 가리키게 하고, 감사 페이지 경로를 전체 URL로 _redirect에 옮기세요. bot-field 입력은 허니팟으로 남습니다.

<form name="contact" method="POST" action="/thanks" data-netlify="true" netlify-honeypot="bot-field">
  <input type="hidden" name="form-name" value="contact" />
  <p hidden><input name="bot-field" /></p>
  <label>Email <input type="email" name="email" required /></label>
  <label>Topic
    <select name="topic">
      <option value="question">A question</option>
      <option value="bug">Something is broken</option>
      <option value="work">Working together</option>
    </select>
  </label>
  <label>Message <textarea name="message" required></textarea></label>
  <button type="submit">Send</button>
</form>
TanStack Start와 React Router 버전은 서버에서 POST합니다. 서버 측 버전은 시크릿 키로 POST하므로 Ikiform이 Allowed domains와 사람 확인을 건너뜁니다. 그러면 모든 POST가 서버의 IP에서 오고, 방문자당 분당 5건인 Standard 한도가 모든 방문자를 합쳐서 셉니다. 서버를 거쳐 POST하는 폼에는 Relaxed 또는 Custom 레이트 리밋을 고르고, IKIFORM_SECRET_KEY는 서버 전용 환경 변수에 두세요.

모든 버전이 Netlify에서 쓰던 필드 이름을 유지하므로 알림 이메일과 CSV 열이 익숙하게 보입니다. Netlify Forms 비교에 data-netlify-recaptcha와 파일 입력을 포함한 전체 속성 대응표가 있습니다.

배포 미리보기와 허용 도메인

Netlify는 풀 리퀘스트마다 deploy-preview-42--your-site.netlify.app 같은 별도 주소를 줍니다. 이는 your-site.netlify.app의 서브도메인이 아니므로, 사이트 주소를 Allowed domains에 등록해도 미리보기는 포함되지 않고 미리보기의 POST는 origin_mismatch로 스팸에 들어갑니다.

  • 프로덕션용으로 your-site.netlify.app과 커스텀 도메인을 추가하세요.
  • 테스트하는 동안 특정 미리보기 호스트를 추가했다가 나중에 제거하세요.
  • netlify.app만 단독으로 추가하지 마세요. Netlify의 모든 사이트가 내 폼으로 POST할 수 있게 됩니다.
  • 또는 환경 변수로 미리보기가 허용 도메인이 없는 두 번째 Ikiform 폼을 가리키게 하고, 프로덕션은 엄격하게 유지하세요.

제출을 잃지 않고 전환하기

  1. 사이트의 Forms 섹션에서 각 폼의 과거 제출을 CSV로 다운로드하세요. Ikiform에는 가져오기 기능이 없습니다.
  2. 새 폼을 미리보기에 배포하고 테스트를 보내세요. Ikiform 대시보드에서 필드 이름을 확인하세요.
  3. 프로덕션에 병합하고 실제 도메인에서 테스트를 한 번 더 보내세요.
  4. Netlify 발신 웹훅을 Ikiform 웹훅으로 바꾸세요. Netlify는 JWS 토큰으로 서명하고 Ikiform은 Standard Webhooks 헤더를 쓰므로 검증 코드도 바뀝니다.
  5. 며칠 동안 Netlify에 도달한 POST가 없으면 사이트의 Forms 설정에서 폼 감지를 끄세요.
Netlify는 파일 업로드를 받고 모든 제출에 Akismet을 실행합니다. 파일 업로드는 아직 지원하지 않습니다. 파일이 있는 POST는 422 files_not_supported를 받습니다. 폼에 파일이 필요하다면 그 폼 하나만 Netlify Forms에 두고 나머지를 옮기세요.

Netlify에서 동작 확인하기

  1. 폼의 Allowed domains에 사이트 도메인을 추가하고, 개발하는 동안에는 localhost도 추가하세요. 비워 두면 어디서든 POST를 받습니다.
  2. 미리보기를 배포하고 그 호스트를 추가한 뒤 거기서 폼을 제출하세요.
  3. 대시보드에서 Submissions를 여세요. 보낸 모든 필드가 담긴 새 제출이 있습니다.
  4. form-name과 bot-field 없이 필드가 email, topic, message인지 확인하세요.
  5. Netlify에서 사이트의 Forms 탭을 열어 테스트가 없는지 확인하세요.
  6. bot-field를 채워서 한 번 POST하세요. 스팸으로 저장되고 아무것도 보내지 않습니다.
  7. 알림 수신자 각각의 받은편지함을 확인하세요. 각자 필드가 담긴 이메일을 받고, 폼에 email 필드가 있으면 Reply는 제출자에게 갑니다.

주의할 점

문제해결 방법
Ikiform에 form-name 필드가 나타남숨겨진 form-name 입력이 아직 폼에 있거나 코드가 여전히 설정합니다. 제거하세요. Ikiform은 URL로 폼을 식별합니다.
폼을 언급하며 Next.js 빌드가 실패함React 코드에 netlify나 data-netlify 속성이 아직 있습니다. public/__forms.html과 함께 제거하세요.
미리보기 POST가 스팸으로 들어감미리보기 호스트가 Allowed domains에 없습니다. 테스트하는 동안 추가하거나 미리보기용 두 번째 폼을 쓰세요.
실제 POST까지 모두 스팸으로 표시됨입력은 bot-field인데 Honeypot field가 아직 _gotcha이거나, 그 반대입니다. 둘을 맞추세요.
422 files_not_supported폼에 파일이 선택된 <input type="file">이 있습니다. 파일 업로드는 아직 지원하지 않습니다. 입력을 지우거나 대신 링크를 요청하세요.
429 rate_limited한 방문자가 폼의 레이트 리밋보다 많이 보냈습니다. Standard는 방문자당 분당 5회를 허용합니다. Retry-After만큼 기다리거나, 공유 IP 하나에서 POST하는 폼이라면 Relaxed나 Custom을 고르세요.

질문

막히는 단계가 있거나 내 상황에 맞는 가이드가 필요하다면 이메일을 보내세요: hello@ikiform.com.