Sync Tally Form Responses to Baserow: Integration Guide
Integrating Tally with Baserow creates a privacy-first, cost-effective pipeline for collecting structured submissions and storing them in an open-source relational database. Tally delivers form responses via HTTP POST webhooks signed with HMAC SHA-256 signatures, while Baserow accepts records through its REST API using token-authenticated endpoints. This pipeline eliminates intermediary integration fees and allows teams to handle thousands of monthly submissions directly into custom schemas.
Explore: Forms · Databases & Spreadsheets
Comparison matrix
| Feature | Tally | Baserow | Edge |
|---|---|---|---|
| Free Tier Allowance | Unlimited forms and submissions | 3,000 rows on Cloud (unlimited self-hosted) | Tally |
| Base Paid Pricing | $29/month flat (Tally Pro) | $10/user/month (Baserow Premium) | Baserow |
| Self-Hosting | No (Proprietary SaaS) | Yes (AGPLv3 Docker / Kubernetes) | Baserow |
| Authentication Mechanism | Webhook signing secret (HMAC SHA-256) | Database API token (Authorization: Token) | Tie |
| Ingestion Rate Limits | Instant push upon submission | 5 req/s (Cloud) or unmetered (Self-hosted) | Baserow |
| Webhook Triggers | FORM_RESPONSE on free tier | rows.created, rows.updated, rows.deleted | Tie |
| Field Type Validation | Input-level client validation | Relational schema, formula, and regex constraints | Baserow |
| Data Residency & GDPR | Hosted in EU (Belgium/AWS Ireland) | Self-host anywhere or EU Cloud (Germany) | Baserow |
| Start free | Try Tally → | Try Baserow → |
ROI metrics
Hours saved / mo
22
Tally / mo
$29
Baserow / mo
$10
Break-even
1.2 wks
Annual savings
$11,412
Deploying Tally with Baserow automates approximately 22 hours of manual CSV exports and data cleaning every month, delivering full ROI in less than two weeks for a 10-person team.
Step-by-step setup guide
1.Create the Baserow Table and API Token
Set up a database table in Baserow with columns that match your Tally form fields (e.g., Full Name as single line text, Email as email, and Feedback as long text). Navigate to Settings > Database Tokens, generate a new token with Create and Read permissions for the target workspace and database, and note the Table ID from your Baserow database URL.
curl -X POST "https://api.baserow.io/api/database/tokens/" \ -H "Content-Type: application/json" \ -d '{"name": "Tally Form Ingestion", "workspace": 12}'2.Retrieve the Baserow Field Names and Types
Run a schema query against the Baserow API to map human-readable field identifiers to their corresponding internal keys or determine whether to use user_field_names=true query parameters.
curl -X GET "https://api.baserow.io/api/database/fields/table/45129/" \ -H "Authorization: Token YOUR_BASEROW_TOKEN"
3.Configure the Webhook in Tally
Open your Tally form, click on the Settings tab, and select Webhooks. Enter your endpoint URL (e.g., an AWS Lambda, Cloudflare Worker, or self-hosted webhook receiver). Leave the Signing Secret input empty or supply a custom string to enable cryptographic verification of incoming payloads.
4.Validate Inbound Signatures on the Middleware
In your webhook consumer, verify the tally-signature header. Compute the HMAC SHA-256 digest of the raw request body using your Tally signing secret and compare it against the header value using a timing-safe equality check.
const crypto = require('crypto'); function verifyTallySignature(rawBody, signature, secret) { const hmac = crypto.createHmac('sha256', secret); const calculated = hmac.update(rawBody).digest('base64'); return crypto.timingSafeEqual(Buffer.from(calculated), Buffer.from(signature)); }5.Transform and Push Data to Baserow
Extract the fields array from the Tally FORM_RESPONSE payload, map the answers using field labels, and POST the record directly into Baserow using the user_field_names=true flag.
curl -X POST "https://api.baserow.io/api/database/rows/table/45129/?user_field_names=true" \ -H "Authorization: Token YOUR_BASEROW_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "Full Name": "Alex Mercer", "Email": "alex.mercer@enterprise.io", "Feedback": "Baserow integration works flawlessly." }'
Webhook payload example
POST https://api.yourdomain.com/webhooks/tally-to-baserow · event: FORM_RESPONSE
{
"eventId": "01HY3BXZ49A0V8P3Q5T1K6M2R9",
"eventType": "FORM_RESPONSE",
"createdAt": "2024-05-18T14:32:00.000Z",
"data": {
"responseId": "resp_987654321",
"submissionId": "sub_123456789",
"respondentId": "anon_resp_012",
"formId": "mR1X9a",
"formName": "Customer Feedback Survey",
"createdAt": "2024-05-18T14:31:58.000Z",
"fields": [
{
"key": "question_1",
"label": "Full Name",
"type": "INPUT_TEXT",
"value": "Alex Mercer"
},
{
"key": "question_2",
"label": "Email",
"type": "INPUT_EMAIL",
"value": "alex.mercer@enterprise.io"
},
{
"key": "question_3",
"label": "Feedback",
"type": "TEXTAREA",
"value": "Baserow integration works flawlessly."
}
]
}
}Tally: pros & cons
- ✅ Unlimited submissions and forms available on the free tier
- ✅ Fast Notion-like document interface for rapid form building
- ✅ Includes webhook delivery natively on all plans without add-ons
- ⚠️ No on-premises or private cloud deployment options
- ⚠️ Requires middleware for complex conditional payload transformations
Baserow: pros & cons
- ✅ Fully open-source AGPLv3 architecture with self-hosting capability
- ✅ Unlimited row capacity when self-hosted on private infrastructure
- ✅ Auto-generated Swagger/OpenAPI documentation for each table
- ⚠️ Cloud free tier limits capacity to 3,000 rows across tables
- ⚠️ Managed Cloud tier enforces an API rate limit of 5 requests per second
FAQ
How do I secure the endpoint against unauthorized HTTP requests?
Configure a Signing Secret in Tally's webhook settings. Tally computes an HMAC SHA-256 signature using this secret over the raw JSON payload and transmits it in the tally-signature header. Validate this hash before parsing the request body.
How are Tally multi-select choices mapped to Baserow Multiple Select fields?
Baserow expects multiple select values as an array of string option IDs or text labels when using user_field_names=true. Parse the array output from the Tally payload and pass it directly as a JSON array under the matching Baserow column name.
What happens if Baserow is unreachable when a submission occurs?
Tally automatically retries failed webhook deliveries up to three times with exponential backoff if your endpoint returns a non-2xx status code. To guarantee zero data loss during prolonged database downtime, direct Tally webhooks into an intermediate message queue such as AWS SQS or Redis.
Can I use Baserow file fields with attachments uploaded to Tally?
Yes. Tally returns an array of public download URLs for uploaded files. Download the file in your middleware, upload it to the Baserow file repository via POST /api/user-files/upload-via-url/, and link the generated file token to your row creation payload.