Keeping the review text, reply draft, and publish result on one record (or a tight review ↔ reply pair) works well, as long as publishing only reads the final confirmed copy—especially for complaints that must not promise an unapproved refund.
Suggested flow:
- Ingest location, rating, original comment, and the external review id.
- The agent updates only draft-reply fields and submits a change request. A manager reviews the diff in the inbox, edits if needed, then approves—watching refund / remedy language closely.
- The external publisher pulls rows marked “approved, pending publish”, writes back success / failure, external reply id, and timestamp. Failures can return to pending publish without overwriting the original review.

(Local demo: review the agent’s draft in a change request, then approve or request changes.)
When a reviewer edits the reply, publishing should read the merged final field (or an explicit “final reply” field) and record which external review was answered on the same row, so you do not post twice.