Professional services
Job workflow for a translation agency
A translation agency receives a document, assigns it to a translator and then a reviewer, tracks word count and deadline, and delivers to the client. Each freelancer sees only their own jobs, and the agency sees margin per job.
Automatically generated draft
Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.
Section 01 · What has to work
A translation agency needs an immutable assignment pipeline that calculates freelancer pay and agency margin per job against hard delivery deadlines.
Section 03 · Screens
Every screen, and what it is for.
- ›Client Portal — Client uploads documents and downloads completed translations, and the word count display must be instant.
- ›Agency Dashboard — Manager assigns translators and reviewers, and margin per job calculation must be instant.
- ›Translator Workspace — Freelancer accepts or declines jobs and submits translations, and the source text view must be instant.
- ›Reviewer Workspace — Editor reviews translation against source and requests revisions, and the diff highlight must be instant.
Anything not on this list is not in version one. That is what keeps a fixed price fixed.
Section 04 · The data model
What it stores, and who can read a row.
Job
id uuid, client_id uuid, translator_id uuid, reviewer_id uuid, source_text text, target_text text, word_count int, deadline timestamptz, rate_per_word numeric(10,4), margin numeric(10,2), status enum(unassigned, assigned, translating, reviewing, revised, delivered, cancelled)
Access · Agency reads all; translator reads assigned row; reviewer reads assigned row; client reads own client_id row.
User
id uuid, email text, role enum(agency_admin, translator, reviewer, client), default_rate numeric(10,4), created_at timestamptz
Access · Agency reads all; users read own id row.
AuditLog
id uuid, job_id uuid, actor_id uuid, event text, metadata jsonb, created_at timestamptz
Access · Agency reads all; others cannot read.
Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.
Section 05 · States
unassigned → assigned → translating → reviewing → revised → delivered | cancelled
Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.
Section 06 · Where this breaks
What bites products like this one.
Translators and reviewers modifying deadlines or rates during active pipeline stages.
Lock rate and deadline fields in the database once status moves past unassigned.
Incorrect margin calculation due to differing freelancer rates set after job creation.
Snapshot rate_per_word onto the Job row at the moment of assignment.
Section 08 · Deliberately left out
What version one does not do.
- ×Automated PDF document formatting and OCR — because custom layouts distort word counts, build plain text processing for v1.
- ×Stripe automated freelancer payouts — because international banking complexity delays launch, handle payouts via manual monthly export for v1.
This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.
Still open
What we would ask before quoting.
- How are translation rates structured: flat rate per word globally, or negotiated per freelancer per language pair?
- Does the client portal require automated credit card payment before delivery, or invoicing terms?
Half of this already exists
Doc Intake
The paperwork half of this is a solved problem: documents read on arrival, validated against your rules, and a person asked only about what does not add up.
It is one of our pre-built products: the code is handed over to you, adapted to your own wording and rules, and the rest of the specification above is built on top of it rather than from scratch.
Your product, not this one
Get this written for what you are actually building.
Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.
Next step
Find out if your idea fits in 10 working days.
Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.