Build a vendor management system to replace your procurement spreadsheet
· Avery NXR
Every mid-market company has the same secret tool. It lives in Google Sheets, has 50 tabs, and only one person in finance fully understands it. It tracks every vendor contract, renewal date, and approval workflow the company runs. When that person leaves, the company loses institutional memory and starts auto-renewing contracts no one remembers signing.
This is normal. It's also fixable in three days with Avery.
The off-the-shelf procurement platforms (Vendr, Tropic, Coupa, Sastrify) are designed for procurement teams of five or more. They cost a lot per year and assume you have dedicated procurement headcount. Sub-100-person companies do procurement on top of finance, legal, or ops, and the spreadsheet wins by default because it's free and customizable.
A custom Avery build is the middle path. It covers 80 percent of what a procurement platform does for a tenth of the cost, and it fits your workflow instead of forcing your workflow into a vendor's idea of "best practice."
The case for a real system
The spreadsheet works until it doesn't. The failure modes are predictable.
Auto-renewals you forgot about. A vendor's contract auto-renews because the 90-day notice window passed unnoticed. You're now paying for another year of a tool nobody uses.
Approvals that bypass your process. A team lead signs up for a SaaS tool, expenses it, and your finance team finds out in the next quarterly review. No procurement check, no security review, no contract negotiation.
Vendor sprawl. You have 80 active SaaS vendors. Nobody can tell you which 20 you actually need, which 40 you tolerate, and which 20 you should have killed last year.
Spend visibility. You can pull a number from your accounting system but you can't slice it by category, by department, by contract renewal date, by negotiated discount vs. list price.
These failures cost real money. Most companies underestimate by an order of magnitude. A 100-person company with vendor sprawl typically pays 20 to 30 percent more in SaaS than they need to. That is real budget the CFO could be deploying elsewhere.
What the system actually needs
Strip down what Vendr, Tropic, and Sastrify sell, and the core feature set is:
A vendor record. Name, category, primary contact, account owner internally, contract files attached.
Contract tracking. Start date, end date, auto-renewal yes or no, notice period, annual value, payment terms.
Renewal alerts. Email reminders at 90, 60, and 30 days before contract expiry. The single highest-leverage feature.
Approval workflows. Requests above a threshold (say $5K annual) route to the CFO. Requests in restricted categories (security tools, data infrastructure) route to specific approvers regardless of amount.
Spend visibility. A dashboard showing total spend, spend by category, spend by department, contracts up for renewal in the next 90 days.
That is the whole system. Nine to ten Avery CRs, two to three days of focused work.
The Avery build path
CR 1: Vendor and contract data model. The foundation.
"Build a Vendor model with id, name, category (enum: SaaS, infrastructure, services, hardware, legal, marketing, other), primary_contact_email, account_owner_internal (FK to User), website, notes, created_at. Build a Contract model with id, vendor_id (FK), start_date, end_date, auto_renew (boolean), notice_period_days, annual_value_usd, payment_terms (enum: monthly, quarterly, annual, custom), status (enum: active, expired, cancelled, pending). Add migrations and types."
CR 2: Contract document upload. Most contracts come as PDFs that get lost in email.
"Add a ContractDocument model: contract_id (FK), filename, s3_url, uploaded_at, uploaded_by. Build an upload endpoint that stores PDFs in S3 and links them to the contract. Update the contract detail page to show and download documents."
CR 3: Renewal alert engine. The killer feature.
"Build a cron job that runs daily and checks contracts where end_date is exactly 90, 60, or 30 days from today. For each match, send an email to the account_owner_internal with the contract details, auto_renew status, notice_period_days, and a link to the contract detail page. Subject: 'Contract renewal in [N] days: [vendor name].' Log alerts sent to avoid duplicates."
CR 4: Approval workflows. Spend control.
"Build an ApprovalRequest model: id, requester_id, vendor_id, proposed_annual_value, category, justification, status (enum: pending, approved, rejected, info_requested), approver_id (nullable), decision_at (nullable), decision_note. Build /admin/requests for approvers to view pending requests, view full details, and decide. Notify approvers via email when assigned."
CR 5: Approval routing rules. Who decides what.
"Add an ApprovalRule model: id, condition_type (enum: amount_above, category_in), condition_value, approver_id, priority. On ApprovalRequest creation, evaluate rules in priority order and assign the matching approver. Examples: amount_above 5000 -> CFO. category_in [security] -> Head of IT."
CR 6: Spend dashboard. Visibility.
"Build /admin/dashboard showing: total annual spend across active contracts, spend by category (pie chart), spend by department (if user has department field), contracts ending in next 90 days (sortable list), top 10 vendors by spend. Use Recharts for the visualizations."
CR 7: Vendor list and detail pages. The browsing surface.
"Build /admin/vendors listing all vendors with filters by category and status. Each row shows total annual spend across active contracts and renewal date of the next-expiring contract. Vendor detail page shows all contracts, documents, approval history, and notes."
CR 8: Search and export. The boring but necessary feature.
"Add full-text search across vendor names, notes, and contract document filenames. Add CSV export for vendors and contracts. Add a 'contracts up for renewal in next 90 days' export specifically."
CR 9: Integration with accounting. Optional but high leverage.
"Integrate with QuickBooks (or your accounting system) to pull actual spend per vendor. Match by vendor name with fuzzy matching. Show actual spend vs. contracted annual value on the vendor page. Flag discrepancies."
CR 10: Audit log. Compliance and forensics.
"Build an AuditLog model tracking every contract creation, modification, deletion, and approval decision. Log who, when, what changed (before/after JSON). Build /admin/audit with filters by user, action type, date range."
Ten CRs. Three focused days if you move fast. Maybe four if you take time to dial in the dashboard.
Where this saves money
The renewal alert is the obvious one. Most procurement losses come from auto-renewals nobody noticed. A 90-day alert means you have a real chance to renegotiate, downsize, or cancel. I worked with a 200-person company that caught two unused tool renewals in the first month after deploying this. The savings paid for the build effort multiple times over.
The approval workflow is the second-order win. Most "vendor sprawl" happens because expensing a $99/month SaaS tool feels too small to bother getting approval. Once that pattern is normalized, it scales. A real approval workflow with low thresholds (route anything over $50/month) catches sprawl before it starts.
The spend dashboard is the strategic win. When the CFO asks "where is our SaaS budget going," the dashboard answers in 30 seconds. Without it, the answer takes a week of finance team time pulling data from accounting and reconciling against vendor records.
Things that surprise people
The contract document upload is fiddly. Storing PDFs is easy. Extracting structured data from PDFs (start date, end date, renewal terms) is hard. Don't try to extract automatically in v1. Just store the PDF and let users enter the data manually. AI-driven contract extraction is a v2 problem.
The approval routing rules sound straightforward but get tangled fast. Resist the temptation to build a complex rule engine. Two or three rules cover 90 percent of real-world cases: amount above threshold, restricted categories, default fallback to CFO. Start there.
The integration with accounting is the highest-value CR but the hardest. QuickBooks, Xero, and NetSuite all have APIs but each works differently. Budget a full day for the integration and don't be surprised if it takes longer. Worth it.
Auto-renewal tracking surfaces a subtle problem: vendors often change their renewal terms without telling you. The contract you signed two years ago may have different terms now. Build a way to update notice periods after the fact, and consider an annual contract audit as a recurring task.
What this costs to run
The custom build runs on the same stack as any small SaaS: Vercel or Railway for hosting ($20-40/month), Postgres via Supabase or Neon ($25-50/month), S3 or equivalent for document storage ($5-20/month depending on volume), Resend or similar for email ($0-25/month).
Total: $50 to $135 per month. Versus a few thousand per year for a real procurement platform.
The bigger savings come from what the system catches. A 200-person company that catches two unnecessary auto-renewals per quarter is saving $10K to $40K per year in vendor spend alone.
When to keep using a real procurement platform
You have a dedicated procurement team of three or more.
You have 200+ active vendors.
You have specific compliance requirements (SOC 2 Type II, ISO 27001) that need formalized procurement controls.
You're a publicly traded company with audit requirements.
If none of those apply, custom wins. Most mid-market companies are in this bucket and don't realize it.