ERP & Data Feeds
Connect File Transfer (SFTP, FTPS, Database)
Your ERP has no API. It still has a file, or a database.
Overview
File Transfer (SFTP, FTPS, Database) + TackQuote
Plenty of mid-market ERPs and PIMs have no API worth integrating against, but every one of them can write a file — and most can expose a database view. TackQuote connects to an SFTP or FTPS server you control, or directly to a read-only view in your PostgreSQL database, and turns what it reads into catalogue, price and stock updates on a schedule or on demand. Everything after “get me the rows” is the same code whichever route they travelled: the same column mapping, the same validation, the same upsert, the same report. Each of the three feeds is configured separately — its own source, its own column mapping, its own schedule — because they rarely come out of an ERP together. Column names are matched against your real header row, so you keep your own spellings rather than renaming columns to suit us. Every run reports what it did — rows applied, SKUs it could not find, cells it could not read — and a dry run gives you that report before anything is written. Every connection is pinned: an SSH host key for SFTP, a TLS certificate for FTPS and for the database. TackQuote refuses to connect if what the server presents ever changes, rather than trusting whatever answers. Access is read-only by construction — it never writes, renames or deletes anything on your server, and a database session is opened read-only at two independent levels.
Point TackQuote at a read-only account — SFTP, FTPS or a database view — pin what the server presents, map your columns, dry-run it, then leave it on a schedule.
Before you start
What you'll need
- An SFTP, FTPS or PostgreSQL server reachable from the public internet (a private or internal address is refused)
- A read-only account: a chrooted SFTP/FTPS user, or a database role with SELECT on the one view
- The server’s SSH host fingerprint or TLS certificate, read from the server itself
- For files: CSV (or semicolon, tab or pipe delimited) exports — no other format is supported
- For databases: PostgreSQL with TLS enabled. MySQL and SQL Server are not supported
- TackQuote tenant admin permissions to connect; admin or manager to configure and run a feed
Setup
How to connect File Transfer (SFTP, FTPS, Database)
Create a read-only account
For SFTP or FTPS, a dedicated chrooted user with read access to your export directory — TackQuote never writes, renames or deletes. For a database, a role with CONNECT, USAGE on the schema and SELECT on the one view. The host must be reachable from the public internet; TackQuote cannot reach a server that only exists on your internal network.Pin what the server presents
SFTP: run ssh-keygen -lf on the host key file on the server and paste the SHA256 fingerprint. FTPS or database: paste the server’s TLS certificate, or choose the publicly trusted option if it has a real CA certificate. It is required either way. Without it, any machine that answers on that address would be trusted, which is the whole of what pinning prevents.Map your columns and dry-run
For each feed, give the remote path (or the schema.view name for a database) and say which of your columns holds the SKU, the name, the price or the quantity. Then run a dry run and read the report before you switch anything on.Choose a schedule
Hourly, every four hours, daily, or manual. Runs are spread across the hour rather than all firing at once, and a run is capped at 10,000 rows — if your file is longer, the run says so rather than quietly importing part of it.
Capabilities
What you get
Three Feeds, Configured Separately
Products create and update catalogue entries. Prices update the price of products you already have, matched on SKU. Stock updates the quantity buyers see and quote against. Each has its own file, mapping and schedule, because they rarely come out of an ERP together.
Your Column Names, Not Ours
Map “Item Code” to SKU and “List Price” to price. Matching ignores case and surrounding spaces, and a headerless file can be mapped by column position instead. If a mapped column is missing from the file, the run stops and says which one — it does not write half a catalogue.
Dry Run Before Anything Changes
A dry run reads the real file and reports exactly what would happen: rows that would be written, SKUs not in your catalogue, and cells it could not read. Nothing is written. Stock and price changes are visible to buyers, so this is not a formality.
Three Transports, One Pipeline
SFTP, explicit FTPS, or a read-only PostgreSQL view. Only the way the rows arrive differs — mapping, validation, the upsert and the report are the same code, so a database feed behaves exactly like a file feed and nothing is a second-class path.
Every Connection Is Pinned
An SSH host fingerprint for SFTP, the server’s TLS certificate for FTPS and for the database. TackQuote checks it on every session, and if the server presents something different the connection is refused before your password is sent — not accepted with a warning. Plain FTP is not offered at all: it sends the password in the clear.
A Database Feed Cannot Write, And Cannot Run Away
You name a table or view — there is no free-text query field, and the SELECT is built from your database’s own catalogue, so nothing you type reaches SQL as text. The session is read-only at two independent levels, the statement carries a timeout and a row cap, and the connection test tells you plainly whether the role you gave it can write.
It Skips A File It Has Already Read
Each run records a digest of the file it processed. If the next scheduled run finds the same bytes — because last night’s export did not run — it reports “unchanged” instead of reprocessing ten thousand rows.
Honest Partial Results
One malformed row does not fail the file, and it is not swallowed either: the run reports how many rows were applied, how many failed and on which line. A run that reads a file and applies nothing is reported as an error, never as a quiet success.
FAQ
File Transfer (SFTP, FTPS, Database) questions
Can I use FTPS instead of SFTP?
Yes — explicit FTPS, the kind that starts on the normal control port and upgrades with AUTH TLS. TackQuote sends AUTH TLS before it sends your username, so the password can never travel in the clear, and it protects the data channel too. Implicit FTPS on port 990 is refused: it was never standardised and RFC 4217 deprecates it. SFTP is still the recommendation, because FTPS opens a second connection for every transfer and that is one more thing to get right.
Why can’t I use plain FTP?
Because it sends your password across the internet in readable text, along with your entire price list. This is not offered with a warning attached — there is nowhere in TackQuote to express “no encryption”, deliberately. If your ERP can only write to plain FTP, put an SFTP or FTPS service in front of the same directory; it is the same file over a channel that cannot be read in transit.
Can TackQuote read directly from my database instead of a file?
Yes, for PostgreSQL. Your DBA exposes a read-only view and you give TackQuote its name — there is no free-text query field, and there will not be one. TackQuote looks the view up in your database’s own catalogue, builds its SELECT from the column names the catalogue reports, and runs it inside a read-only transaction with a statement timeout and a row cap. MySQL and SQL Server each need their own driver and are not supported; for those, export the same view to CSV on a schedule and read it over SFTP.
What permissions does the database user need, and can it change anything?
CONNECT on the database, USAGE on the schema, and SELECT on the one view. Nothing else. TackQuote sets the session read-only in the connection itself and opens a read-only transaction on top of that, so a write would be refused twice over — but only your own GRANTs can actually guarantee it, which is why the connection test reports plainly whether the role it authenticated as is a superuser. It never issues anything but a SELECT.
My database uses a self-signed certificate. Does that work?
Yes, and it is the normal case for an on-premise server. Choose “pin the server certificate” and paste the certificate itself — TackQuote then trusts that one certificate and nothing else, which is stricter than a public CA, not weaker. What is not offered is an option to skip verification: encryption without verification protects you from someone listening and not at all from someone interposing. TLS itself is mandatory; a database server that cannot do TLS is refused rather than connected to in the clear.
Will this overwrite prices that came from my webstore?
Yes, if the SKUs match — and that is usually the point: your ERP is the price master. The price feed updates the price TackQuote quotes from, matched on SKU across your whole catalogue. It changes TackQuote only; it never pushes a price back to your webstore.
What happens if a row is broken?
That row is reported with its line number and the rest of the file is still applied. A price cell reading “call for pricing” is refused rather than turned into zero. If a whole column is missing from the file, the run stops before writing anything and names the column.
Can my file name include the date?
Yes. Use a single * in the file name — for example /out/products-*.csv — and TackQuote reads the most recently modified match. The * may only appear in the file name, never in a directory name.
What if a product is missing from today’s file?
Nothing, unless you switch on “deactivate missing products” for the products feed. Even then it is skipped whenever the file hit the 10,000-row cap, because “the file was cut short” and “these products were discontinued” look identical from here and guessing wrong would empty your catalogue.
Does TackQuote write anything to my server?
No. It opens a session, reads one file and disconnects. It does not upload, rename, archive or delete, so the account you give it can be read-only.
How big can a file be?
Up to 10,000 rows and 64 MB per run, and the same row cap applies to a database view. Both caps are reported when reached — a run that read part of a file always says so rather than presenting a partial import as a complete one.
Can I point this at a server on my internal network?
No, and that is deliberate rather than an oversight. TackQuote is not on your network, so an internal address is either unreachable or — worse — reaches something inside TackQuote’s own infrastructure. Private addresses, loopback, cloud metadata addresses and single-word hostnames are all refused before a connection is attempted, on every transport. Your server needs to be reachable from the public internet, ideally with TackQuote’s addresses allowed through your firewall.