{"_id":"form-to-inbox","_rev":"5-db491a06f29269d1965418fab60e6f08","name":"form-to-inbox","dist-tags":{"latest":"2.1.1"},"versions":{"1.0.0":{"name":"form-to-inbox","version":"1.0.0","keywords":["convex","component","form","inbound","email","quotes","contact","form-submission","email-notification"],"author":{"name":"noisemakerjon"},"license":"MIT","_id":"form-to-inbox@1.0.0","maintainers":[{"name":"noisemaker11","email":"jk10192000@gmail.com"}],"homepage":"https://github.com/noisemakerjon/form-to-inbox#readme","bugs":{"url":"https://github.com/noisemakerjon/form-to-inbox/issues"},"dist":{"shasum":"226049e13d50e766797608b83c4b520caa5de920","tarball":"https://registry.npmjs.org/form-to-inbox/-/form-to-inbox-1.0.0.tgz","fileCount":8,"integrity":"sha512-Hy5vHuBO0GBSbCr8DWYMdULCQiDsqVv8qaMQGU/64HMt6VjUgeXhHXnI0LxHdutmuOQqRUY3xohRmLrU2K/9ww==","signatures":[{"sig":"MEUCIQCNvlds2S7gjKfrijhCVtVPJiTUkUaX8lpc81THE0fP1gIgT4Qmg8Cx2MY2jzXf7fG/+DjZVedKihTWFbJsl0Q66FU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13297},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","require":"./src/index.ts"},"./convex/*":"./convex/*","./convex.config":{"types":"./convex.config.ts","import":"./convex.config.ts","require":"./convex.config.js"}},"scripts":{"dev":"npx convex dev --typecheck-components","codegen":"npx convex codegen","publish:npm":"npm publish --access public --token=%NPM_TOKEN%"},"_npmUser":{"name":"noisemaker11","email":"jk10192000@gmail.com"},"repository":{"url":"git+https://github.com/noisemakerjon/form-to-inbox.git","type":"git"},"_npmVersion":"10.9.2","description":"Convex component for form submissions with email notifications via Inbound","directories":{},"_nodeVersion":"22.15.0","dependencies":{"inboundemail":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"convex":"^1.31.0","typescript":"^5.0.0"},"peerDependencies":{"convex":"^1.16.0"},"_npmOperationalInternal":{"tmp":"tmp/form-to-inbox_1.0.0_1768700077259_0.4437919403337991","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"form-to-inbox","version":"1.1.0","keywords":["convex","component","form","inbound","email","quotes","contact","form-submission","email-notification"],"author":{"name":"noisemakerjon"},"license":"MIT","_id":"form-to-inbox@1.1.0","maintainers":[{"name":"noisemaker11","email":"jk10192000@gmail.com"}],"homepage":"https://github.com/noisemakerjon/form-to-inbox#readme","bugs":{"url":"https://github.com/noisemakerjon/form-to-inbox/issues"},"dist":{"shasum":"19c5bd9627c3c174ebd50237192a3b3f2a5f97a9","tarball":"https://registry.npmjs.org/form-to-inbox/-/form-to-inbox-1.1.0.tgz","fileCount":8,"integrity":"sha512-HtCMl3g8OJcQ3FVJS29jM9quCY1ZPJyiKlBbL4KBc6fHCHSgfCwSKLJm8pMypr2y1BZQFZUVnle9YL+g9r10FQ==","signatures":[{"sig":"MEUCIHSLGwZE1f8/1UImHjD3HKIzSIfP+EFTbGwq8XIAu9duAiEA8BBk6lGmPf3r5WGTV6bnzZpt4bv1FWJobUnfB3aOsgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13685},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","require":"./src/index.ts"},"./convex/*":"./convex/*","./convex.config":{"types":"./convex.config.ts","import":"./convex.config.ts","require":"./convex.config.js"}},"scripts":{"dev":"npx convex dev --typecheck-components","codegen":"npx convex codegen","publish:npm":"npm publish --access public --token=%NPM_TOKEN%"},"_npmUser":{"name":"noisemaker11","email":"jk10192000@gmail.com"},"repository":{"url":"git+https://github.com/noisemakerjon/form-to-inbox.git","type":"git"},"_npmVersion":"10.9.2","description":"Convex component for form submissions with email notifications via Inbound","directories":{},"_nodeVersion":"22.15.0","dependencies":{"inboundemail":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"convex":"^1.31.0","typescript":"^5.0.0"},"peerDependencies":{"convex":"^1.16.0"},"_npmOperationalInternal":{"tmp":"tmp/form-to-inbox_1.1.0_1768700425771_0.20887836962173978","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"form-to-inbox","version":"2.0.0","keywords":["convex","form","inbound","email","quotes","contact","form-submission","email-notification"],"author":{"name":"noisemakerjon"},"license":"MIT","_id":"form-to-inbox@2.0.0","maintainers":[{"name":"noisemaker11","email":"jk10192000@gmail.com"}],"homepage":"https://github.com/noisemakerjon/form-to-inbox#readme","bugs":{"url":"https://github.com/noisemakerjon/form-to-inbox/issues"},"dist":{"shasum":"be967f5e2683708d16025866d919aabbd7b086be","tarball":"https://registry.npmjs.org/form-to-inbox/-/form-to-inbox-2.0.0.tgz","fileCount":6,"integrity":"sha512-FxerbIpyTLl0za1WKStM6Yq9DpAyDug0r/y07LUf5slPHYPe9RVA10Ch2OeHq5cGt6fXyFi4vOruoFxfZ+lKsw==","signatures":[{"sig":"MEUCIQDUWBXFzK5p6GthWhqMJqgTJiN9Hug1dwEN5IgAsryxmQIgSRhuK+3KYbufKt9zc72bz8eAjSSgtk8DVe//S1ToKuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12545},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","require":"./src/index.ts"}},"scripts":{"publish:npm":"npm publish --access public"},"_npmUser":{"name":"noisemaker11","email":"jk10192000@gmail.com"},"repository":{"url":"git+https://github.com/noisemakerjon/form-to-inbox.git","type":"git"},"_npmVersion":"10.9.2","description":"Convex form submissions with email notifications via Inbound","directories":{},"_nodeVersion":"22.15.0","dependencies":{"inboundemail":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"convex":"^1.31.0","typescript":"^5.0.0","@types/node":"^22.0.0"},"peerDependencies":{"convex":"^1.16.0"},"_npmOperationalInternal":{"tmp":"tmp/form-to-inbox_2.0.0_1768713788888_0.7516418074443103","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"form-to-inbox","version":"2.1.0","keywords":["convex","form","inbound","email","quotes","contact","form-submission","email-notification"],"author":{"name":"noisemakerjon"},"license":"MIT","_id":"form-to-inbox@2.1.0","maintainers":[{"name":"noisemaker11","email":"jk10192000@gmail.com"}],"homepage":"https://github.com/noisemakerjon/form-to-inbox#readme","bugs":{"url":"https://github.com/noisemakerjon/form-to-inbox/issues"},"dist":{"shasum":"0cd99371e34423e34ca0289bfa9b3fd1b4bd1cc9","tarball":"https://registry.npmjs.org/form-to-inbox/-/form-to-inbox-2.1.0.tgz","fileCount":7,"integrity":"sha512-kTeoMbQYcnhNWQ5x7Z46PL/kf886z/zcuRg/pARhJjq8rPAvkQaAZxzPxEyyCW3DRWUFPiR4F2IIuCI1Caw1Hw==","signatures":[{"sig":"MEUCICW+STFLpLB6NTAanxrGFeqxrfst5Ew/jFHDabYcf2GFAiEAxWX7zU27PzmOGsIZYwT0XoL6bJNUKyF90uKW9sg00gc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15863},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","require":"./src/index.ts"}},"scripts":{"publish:npm":"npm publish --access public"},"_npmUser":{"name":"noisemaker11","email":"jk10192000@gmail.com"},"repository":{"url":"git+https://github.com/noisemakerjon/form-to-inbox.git","type":"git"},"_npmVersion":"10.9.2","description":"Convex form submissions with email notifications via Inbound","directories":{},"_nodeVersion":"22.15.0","dependencies":{"inboundemail":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"convex":"^1.31.0","typescript":"^5.0.0","@types/node":"^22.0.0"},"peerDependencies":{"convex":"^1.16.0"},"_npmOperationalInternal":{"tmp":"tmp/form-to-inbox_2.1.0_1768714622455_0.8906395761158576","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"form-to-inbox","version":"2.1.1","description":"Convex forms backend for contact forms, lead capture, and email notifications","type":"module","main":"./src/index.ts","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","require":"./src/index.ts"},"./server":{"types":"./src/server.ts","import":"./src/server.ts","require":"./src/server.ts"}},"scripts":{"publish:npm":"npm publish --access public"},"dependencies":{"inboundemail":"^0.20.0"},"peerDependencies":{"convex":"^1.16.0"},"devDependencies":{"@types/node":"^22.0.0","convex":"^1.31.0","typescript":"^5.0.0"},"keywords":["convex","form","contact-form","lead-capture","email-notification","inbound","typescript","form-backend"],"repository":{"type":"git","url":"git+https://github.com/Noisemaker111/form-to-inbox.git"},"homepage":"https://github.com/Noisemaker111/form-to-inbox#readme","bugs":{"url":"https://github.com/Noisemaker111/form-to-inbox/issues"},"author":{"name":"noisemakerjon"},"license":"MIT","_id":"form-to-inbox@2.1.1","gitHead":"6de3784e965e66fca43cc801f4ddeb4ff56453b7","_nodeVersion":"22.15.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-OWGY+9N5FsYfHNii8MerDXPIOfjhQQUUhFFivG16CgiCmZvsGMwhHD18kGN4btBaaIgtgfff09Ax0jZQtvV2PA==","shasum":"4d2436d234285a2dcf3a73fb0bc07cb54cb9bb8f","tarball":"https://registry.npmjs.org/form-to-inbox/-/form-to-inbox-2.1.1.tgz","fileCount":8,"unpackedSize":19915,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAyO54CS45eiQEBgErm4SZYka6BizY/+HdjNkT1Pw4uFAiEAm8BhddBBu7qSrZAv+JZxjGfdJtNyQbklUk0yWlTXcI8="}]},"_npmUser":{"name":"noisemaker11","email":"jk10192000@gmail.com"},"directories":{},"maintainers":[{"name":"noisemaker11","email":"jk10192000@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/form-to-inbox_2.1.1_1770401168092_0.7101855013553648"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-18T01:34:37.165Z","modified":"2026-02-06T18:06:08.420Z","1.0.0":"2026-01-18T01:34:37.401Z","1.1.0":"2026-01-18T01:40:25.913Z","2.0.0":"2026-01-18T05:23:09.040Z","2.1.0":"2026-01-18T05:37:02.595Z","2.1.1":"2026-02-06T18:06:08.286Z"},"bugs":{"url":"https://github.com/Noisemaker111/form-to-inbox/issues"},"author":{"name":"noisemakerjon"},"license":"MIT","homepage":"https://github.com/Noisemaker111/form-to-inbox#readme","keywords":["convex","form","contact-form","lead-capture","email-notification","inbound","typescript","form-backend"],"repository":{"type":"git","url":"git+https://github.com/Noisemaker111/form-to-inbox.git"},"description":"Convex forms backend for contact forms, lead capture, and email notifications","maintainers":[{"name":"noisemaker11","email":"jk10192000@gmail.com"}],"readme":"# form-to-inbox\n\n[![npm version](https://img.shields.io/npm/v/form-to-inbox.svg)](https://registry.npmjs.org/form-to-inbox)\n[![npm downloads](https://img.shields.io/npm/dm/form-to-inbox.svg)](https://registry.npmjs.org/form-to-inbox)\n[![license](https://img.shields.io/npm/l/form-to-inbox.svg)](https://registry.npmjs.org/form-to-inbox)\n\n`form-to-inbox` is a lightweight Convex forms backend for contact forms, quote requests, and lead capture workflows. It stores typed form submissions in Convex and can send instant email notifications with Inbound.\n\n- GitHub: https://github.com/Noisemaker111/form-to-inbox\n- npm package metadata: https://registry.npmjs.org/form-to-inbox\n\n## Why use form-to-inbox?\n\n- Drop-in Convex form handling with a single `formSubmissions` table.\n- Built for common website forms: contact, sales, quote, and support requests.\n- Optional email notifications on submit using `INBOUND_API_KEY`.\n- Supports default `to` / `from` values with per-submission overrides.\n- Works with arbitrary extra fields via `customFields: { key, value }[]`.\n\n## Install\n\n```bash\nnpm install form-to-inbox\n```\n\n## Quick start\n\n### 1) Add schema in `convex/schema.ts`\n\nConvex schema files have special restrictions, so copy this table into your schema file.\n\n```ts\nimport { defineSchema, defineTable } from \"convex/server\";\nimport { v } from \"convex/values\";\n\nexport default defineSchema({\n  formSubmissions: defineTable({\n    formType: v.string(),\n\n    name: v.optional(v.string()),\n    email: v.optional(v.string()),\n    phone: v.optional(v.string()),\n\n    address: v.optional(v.string()),\n    city: v.optional(v.string()),\n\n    subject: v.optional(v.string()),\n    message: v.optional(v.string()),\n\n    customFields: v.optional(\n      v.array(v.object({ key: v.string(), value: v.string() }))\n    ),\n\n    to: v.string(),\n    from: v.string(),\n    status: v.string(),\n    createdAt: v.number(),\n    notes: v.optional(v.string()),\n  })\n    .index(\"by_formType\", [\"formType\"])\n    .index(\"by_status\", [\"status\"])\n    .index(\"by_createdAt\", [\"createdAt\"]),\n});\n```\n\n### 2) Add Convex functions in `convex/forms.ts`\n\n```ts\nimport { convexForms } from \"form-to-inbox/server\";\n\nexport const {\n  submitForm,\n  getAllSubmissions,\n  getSubmissionsByType,\n  getNewSubmissions,\n  updateStatus,\n  sendNotification,\n} = convexForms({\n  defaultTo: \"sales@yourcompany.com\",\n  defaultFrom: \"noreply@yourcompany.com\",\n  sendEmailOnSubmit: true,\n});\n```\n\n### 3) Submit from your frontend\n\n```ts\nimport { useMutation } from \"convex/react\";\nimport { api } from \"../convex/_generated/api\";\n\nconst submitForm = useMutation(api.forms.submitForm);\n\nawait submitForm({\n  formType: \"Contact\",\n  name: \"Jane Doe\",\n  email: \"jane@example.com\",\n  message: \"Hello!\",\n  customFields: [{ key: \"Source\", value: \"Landing Page\" }],\n});\n```\n\n## Email notifications with Inbound\n\nSet your API key in the Convex dashboard:\n\n```env\nINBOUND_API_KEY=your_inbound_key\n```\n\nIf `sendEmailOnSubmit: true` and `INBOUND_API_KEY` is set, `submitForm` sends a notification email after writing the submission.\n\n## API overview\n\n`convexForms()` returns:\n\n- `submitForm`: insert a new submission and optionally trigger email.\n- `getAllSubmissions`: list all submissions.\n- `getSubmissionsByType`: filter submissions by `formType`.\n- `getNewSubmissions`: list submissions with a `new` status.\n- `updateStatus`: update submission workflow status.\n- `sendNotification`: send email for an existing submission.\n\n## Notes\n\n- Convex schemas cannot reliably import table definitions from npm packages, so schema setup is copy/paste.\n- For strict side-effect boundaries, set `sendEmailOnSubmit: false` and call `sendNotification` from an action or scheduler.\n\n## Resources\n\n- Convex docs: https://docs.convex.dev\n- Inbound package metadata: https://registry.npmjs.org/inboundemail\n\n## License\n\nMIT\n","readmeFilename":"README.md"}