What PostgreSQL logical replication moves, and when to use it
PostgreSQL logical replication copies row-level changes for the tables you choose. A publisher database exposes those tables through a publication, and a subscriber database pulls them through a subscription, so the subscriber receives inserts, updates and deletes as they happen. It works between different PostgreSQL major versions, which is why it appears in planning for major upgrades. Teams usually reach for it when they must consolidate data from several databases, share a selected subset of tables with another team or site, or move to a new major version with very little downtime.
Consolidation is the most common case. Several operational databases can publish their tables to one analytics or reporting database, where the data is combined for queries that cannot run against production. Data sharing works the same way: a subscriber receives only the tables in the publication, so the publisher decides what leaves its boundary. For a low-downtime major upgrade, the new server subscribes to the old one, catches up, and then the application cuts over. The PostgreSQL upgrading documentation describes this approach as allowing a major upgrade with only several seconds of downtime, although the actual figure depends on your write volume, table sizes and cutover process, so test it on a copy of your workload.
Physical streaming replication is usually the better fit when you need a full, byte-level copy of the whole cluster. It ships WAL to hot standby servers, which can serve read-only queries and can be used for high availability and failover. Because it replicates the entire cluster, a standby must run the same major version as the primary, and it cannot be used to publish a single table to a different version. If your goal is survival of a primary failure with an identical copy, choose physical replication. If your goal is selective, version-independent or cross-platform movement of data, choose logical replication.
Before you commit, confirm several points with your team and, where relevant, with the vendor or your own environment. Identify which tables have primary keys or replica identities, since updates and deletes depend on them. Check which schema changes must be coordinated between publisher and subscriber, because DDL is not replicated automatically. Decide who owns the subscriber's lag monitoring and the cutover runbook. These decisions determine whether the work is a short project or a multi-stage engagement, and they are the first items to settle in a written scope.
Which publication and subscription options fit each goal
This table compares the publication and subscription choices a team makes, from table scope and replicated operations to initial data copy, replication slots and row or column filters. Read each row against the goal it serves: consolidation, data sharing or cross-version migration. The main takeaway is that every option that narrows what flows also adds a rule someone must maintain, so confirm each cost in the PostgreSQL documentation for your version before you commit.
| Configuration choice | Goal it fits | Cost or trade-off to confirm |
|---|---|---|
| Publication for all tables in the database | Consolidation of a whole database into one analytics target | Replicates tables nobody intended to share. Confirm how new tables are added and who reviews them. |
| Publication for a chosen set of tables | Data sharing with a partner, team or downstream system | Each new table must be added by hand. Confirm an owner and a review step for changes to the set. |
| Replicated operations (insert, update, delete, truncate) | Append-only analytics feeds versus full state sync | Leaving out update or delete can leave the subscriber out of step with the publisher. Test the result with real queries. |
| Initial data copy on subscription creation | Cross-version migration and first-time consolidation | Copy time grows with data volume and adds load on the publisher. Measure it on a test copy of your data. |
| Replication slot creation or reuse | Migration cutover and resuming after a planned pause | An inactive slot keeps WAL on the publisher and can fill its disk. Monitor slot lag from the start. |
| Row filter on a publication | Sharing only one region, tenant or business unit | Filter support and expression limits depend on the PostgreSQL version. Confirm them in the current documentation. |
| Column list on a publication | Sharing a table without sensitive or internal columns | Replica identity columns must be included for updates and deletes to apply. Confirm version support and the rules in the documentation. |
| Subscriber on a newer major version | Low-downtime major upgrade | Sequence values and schema changes are not carried over automatically. Plan and test the cutover steps for your version. |
How publications, subscriptions and replication slots move changes
Logical replication runs on three objects that work together. A publication on the publisher lists the tables and the types of change, such as inserts, updates and deletes, that are offered to other databases. A subscription on the subscriber names the publisher connection and the publication it wants. A replication slot on the publisher records how far that subscriber has consumed the change stream. Each slot belongs to one subscription, so the slot is the part to inspect first when you need to know what a subscriber has received. Before you design anything, confirm in the high availability and upgrading documentation which PostgreSQL versions sit on each side of the link and which settings, such as wal_level and the replication slot limits, your versions require.
When a subscription is created or refreshed, each included table goes through an initial synchronization phase. The subscriber copies the existing rows of each table from the publisher in a consistent snapshot. Changes that happen during the copy are kept and applied after the copy finishes, so the subscriber catches up without a gap. Until a table finishes this phase, its state is visible in the subscriber's catalog views, and you should check that every table reaches the ready state before you cut over traffic. The initial copy is usually the longest and most resource-heavy part of the work, so plan the window and network capacity around it rather than around the steady-state traffic.
After synchronization, changes stream continuously from the publisher's write-ahead log to the subscriber, which applies them in commit order. The slot is what makes this reliable. The publisher keeps the WAL the subscriber still needs and does not remove it until the subscriber confirms that it has received and applied those changes. If the subscriber is stopped, slow or unreachable, WAL accumulates on the publisher's disk, and this can fill the volume and stop the primary. Ask your team to monitor the lag of each slot, set alerts on retained WAL size, and agree in advance who may drop an unused slot. Also confirm, in the failover documentation for your version, how slots are handled after a failover, because the publisher's role can change during an incident.
The same mechanism is why logical replication suits some major version upgrades. The upgrading documentation states that logical replication works between different major versions, which allows a major upgrade with only several seconds of downtime at cutover. The sequence is to build the new cluster, load the schema, let the subscription catch up, verify row counts and checksums on agreed tables, and then move application connections. Schema changes and sequence values are not carried by the stream in the same way as table rows, so each of those needs its own step. With PostgreSQL 14 reaching end of support on November 12, 2026, start the test runs early and time the cutover against your change calendar.
Setting up PostgreSQL logical replication in order
The sequence below moves from publisher settings to a tested subscriber and a controlled cutover. Each step ends with a check, so the team knows whether the next step can start. Skipping a check usually surfaces later as a stalled replication slot, a missing table or divergent data, which is harder to diagnose under production load.
Confirm publisher and subscriber settings
On the publisher, confirm that wal_level is set to logical, then review max_replication_slots and max_wal_senders against the slots and senders this subscription needs. On the subscriber, review max_logical_replication_workers and max_worker_processes, and confirm the major version pairing against the PostgreSQL upgrading documentation. Create a dedicated replication role and allow it in pg_hba.conf from the subscriber's address only. Changing wal_level requires a restart, so schedule that change first. Check: run SHOW wal_level and SHOW max_replication_slots on each side, and confirm the replication role can connect from the subscriber host.
Identify tables and replica identity
Build the list of tables to replicate and check that each one has a primary key or another suitable replica identity. Without one, UPDATE and DELETE changes cannot be matched on the subscriber, and the subscription will fail on those rows. Note tables with large row sizes, heavy write rates or sensitive data, since these affect sync time, lag and access decisions. The DBA or data owner signs off on the list. Check: query the publisher's catalog for the chosen tables and confirm every one reports a primary key or a deliberate replica identity setting.
Create the publication on the source
On the publisher, create a publication that names only the agreed tables. Publications carry row changes for the listed tables, and they do not carry schema changes, so any later DDL must be applied to both sides by hand. Avoid FOR ALL TABLES unless the whole database is meant to replicate. Confirm with the vendor documentation for your version how sequence values are handled, because sequences need their own cutover plan. Check: query pg_publication_tables for the publication name and confirm the output matches the approved list exactly.
Prepare matching target tables and schema objects
Create the target tables on the subscriber with the same names, column names and compatible data types as the publisher. Add the indexes and constraints the application needs, and review triggers on the subscriber, since a trigger that also runs on replicated rows can write duplicate or unexpected data. Create the sequences that the application will use after cutover, but leave their values to the cutover step. Check: compare column definitions from information_schema on both sides for each replicated table and confirm the diff is empty.
Create the subscription and watch initial sync
On the subscriber, create the subscription pointing at the publication and the replication role. Keep the initial copy enabled so existing rows are transferred, and truncate any target tables that already contain data to avoid conflicts. During the initial copy, watch the per-table state in pg_subscription_rel, where each table should move to a ready state. Watch pg_stat_subscription and the publisher's pg_stat_replication for progress and lag. Check: every table reports ready, the subscription is enabled, and the subscriber log shows no apply or constraint errors.
Validate sampled data and monitor lag
Once the tables are ready, compare row counts on a sample of tables on both sides. Also compare checksums or aggregate values on key business columns for the tables that matter most. Counts will differ while writes are active, so compare at a matching point, such as a short quiet window or a snapshot taken on both sides. Keep monitoring replication lag through the publisher's pg_replication_slots view while normal load runs. Check: sampled counts and checksums match at the same point, lag trends down under normal load, and no conflict or apply errors appear on the subscriber.
Run the cutover checkpoint before moving traffic
Start the write freeze by putting the application in maintenance mode or revoking write privileges on the publisher, following your runbook. Wait until the subscriber has applied all changes up to the publisher's current position, and confirm that lag is zero. Then set the sequences on the subscriber to the publisher's current values and run full validation: row counts, checksums on key tables, critical business queries and application smoke tests against the subscriber. Only when every check passes, repoint application connections. Confirm with the owners whether a reverse replication path exists for rollback, since it is not configured by default.
What PostgreSQL logical replication does not carry over
Logical replication copies row changes for the tables in a publication. It does not copy everything else that a database team treats as part of the system, so the work outside replication needs its own plan. The first category is schema. Added columns, new tables, changed types and dropped objects are not applied to the subscriber by the replication stream. When the publisher's schema moves ahead of the subscriber, the apply process can fail on rows it cannot accept, and the lag grows until someone intervenes. Treat schema change as a parallel process: write every DDL change as a versioned migration, apply it to both sides in a fixed order, and get approval from the owner of the replicated tables before it runs. Confirm in the documentation for your PostgreSQL version which DDL the replication model handles, because the answer determines how strict this process must be.
The second category is sequence values. Replication moves the rows that use a sequence, but the current value of a sequence on the publisher is not carried to the subscriber. If the new primary starts issuing values from a stale position, inserts can collide with rows already replicated, and where no unique constraint exists, duplicate values can go unnoticed. Plan a sequence synchronization step that runs at cutover. After writes stop on the source, read the current value of each sequence and set the matching sequence on the target above it. Include identity columns and sequences referenced by column defaults. Name an owner for this step, script it, and rehearse it on a copy of the environment. Ask the application team whether any sequence is cached, since cached blocks can also create gaps or overlaps after a switch.
The third category is objects that the replication model does not transmit. The list of restrictions in the PostgreSQL documentation for your major version is the authoritative source, and it changes between releases, so pull the current version when you plan the work. Teams commonly build the following by hand on the subscriber: roles and privileges, functions and procedures, triggers, extensions, and row-level security policies. Ownership and default privileges also need a decision, because objects created on the subscriber will not match the publisher unless someone defines them. Record each object type in an inventory with a named owner, a method for creating it on the target, and a comparison that runs before cutover.
Run the schema migration and sequence synchronization as a process with its own runbook, separate from the application release. Each run should have a version identifier, a record of which DDL was applied to which side, and a comparison of the two catalogs before replication resumes. Compare column definitions, constraints, indexes and sequence positions with a schema diff tool or a scripted query, and keep the output as evidence for the change record. Decide in advance whether DDL on the publisher is frozen during the cutover window. Teams that skip this step often find drift only after the switch, when fixing it means stopping writes again. This is also where the platform owner confirms that the replication role has the privileges it needs to read every published table.
Before cutover, the platform owner should run this checklist and record a sign-off for each item: (1) every publisher DDL change since the last rehearsal is applied to the subscriber and recorded; (2) column definitions, constraints and indexes match between the two sides for each published table; (3) each sequence on the target is set above its source value after writes stop; (4) every object in the inventory of unreplicated objects exists on the target and has been compared; (5) the replication role and its grants are verified; (6) the restrictions list for your PostgreSQL version has been reviewed and each item has an owner; (7) a DDL freeze is in effect for the cutover window; (8) the rollback path and its sequence handling are documented and have been rehearsed.
Security controls for replication connections and credentials
A subscriber must sign in to the publisher, and the link between them carries every replicated row. The controls below cover how that sign-in works, which database role it uses, how the traffic is protected in transit, and how the subscriber handles the data it receives. Confirm each item in the publisher's configuration and the subscriber's connection settings before the first subscription is created.
SCRAM password authentication
PostgreSQL documents password-based methods, and SCRAM is the password method to use for the subscriber connection. PostgreSQL 18 deprecated MD5 password authentication in favor of SCRAM, so any md5 entry left in the publisher's pg_hba.conf file is a finding to fix. Confirm that password_encryption is set to scram-sha-256 on the publisher and that the replication role's password is stored in SCRAM form.
Certificate authentication for the subscriber
Certificate authentication lets the publisher identify the subscriber by a client certificate instead of a shared password. It suits replication between sites, where rotating passwords across two systems is hard to coordinate. Confirm which certificate authority signs the subscriber's client certificate, how the publisher maps that certificate to the replication role, and when the certificate expires so renewal happens before the subscription breaks.
GSSAPI authentication with Kerberos
PostgreSQL documents GSSAPI as an authentication method, and it fits sites that already run a Kerberos realm. The subscriber then authenticates with its Kerberos service principal instead of a stored password. Confirm the keytab location on both hosts, the service principal names, and that the publisher's pg_hba.conf entry matches the realm the subscriber uses. Ticket lifetime and key rotation belong in the operating runbook.
Least-privilege replication role
The subscription connects as a role on the publisher, and that role should hold only what logical replication needs. Confirm it has the REPLICATION attribute, SELECT on each published table, and no ownership of application tables and no superuser rights. Keep the role separate from application and administrator accounts so its activity is visible in logs and it can be revoked without disturbing other services.
Encrypted link and restricted network path
Replicated rows cross the network between sites, so the link needs TLS and a narrow network path. Confirm the subscriber's connection string uses an sslmode that verifies the publisher's certificate, and that pg_hba.conf accepts the replication role only over hostssl connections from the subscriber's address range. Confirm that firewall rules open the PostgreSQL port only from the subscriber, and check TLS versions and ciphers against your own policy.
Protecting replicated personal data
Logical replication copies personal or regulated data to the subscriber, so the copy carries the obligations of the source. Confirm which tables and columns are in the publication and whether the subscriber needs every column. Confirm access controls on the subscriber, including row-level security where tenants or roles differ, encryption at rest, retention, and that deletions on the publisher, such as erasure requests, reach the copy.
Using PostgreSQL logical replication for a low-downtime major upgrade
For a major version move, the choice of method comes down to how much downtime the business will accept and how much preparation the team can carry. Dump and restore with pg_dumpall is the simplest method to reason about, but the database is unavailable for writes while the dump is taken, loaded and verified, so the window grows with data size. pg_upgrade converts the existing data directory in place and avoids copying most of the data, but the cluster must still be stopped for the upgrade run. Logical replication moves the cutover itself into a short window. The PostgreSQL upgrade documentation states that logical replication works between major versions, allowing major upgrades with only several seconds of downtime, which is why it suits systems that cannot take a planned outage.
The target release also shapes the decision. The PostgreSQL 18 release announcement notes that pg_upgrade retains planner statistics across major upgrades and adds parallel jobs and a --swap option. Those improvements make pg_upgrade more attractive where a short maintenance window is acceptable and the data can be checked in place. They do not change the trade-off for a system that must stay writable during the move. Logical replication requires the source to run with wal_level set to logical, a publication on the source, and a subscription on the target that copies the initial table data and then streams changes. Confirm with application owners whether each replicated table has a primary key or another replica identity, because updates and deletes depend on it.
The trade-off is that the team takes on validation work that dump and restore or pg_upgrade largely handle for them. Logical replication copies rows through a logical stream, so the team must confirm that the subscriber matches the publisher before cutover. Practical checks include row counts and checksums per replicated table, comparison of indexes, constraints and column types on both sides, and confirmation that the publication covers every table the application writes. Sequences are a specific risk. Standard logical replication does not carry sequence values in the versions covered by this page, and schema changes are not replicated either. Each sequence must be set on the new primary at cutover to a value above the highest key in use, and the schema freeze must be enforced in the change process. Confirm sequence and DDL handling against the documentation for your target version before writing the cutover script.
Managing the window before cutover is an operational task that runs for the whole synchronization period. The publisher holds a replication slot, and while the subscriber lags or is stopped, the publisher retains WAL that the slot still needs, so disk use on the source can grow quickly. Set alerts on slot lag and on free disk space before the subscription starts. Decide in advance who may run schema changes during the sync period. Rehearse the cutover on a copy: stop writes to the old primary, wait until the subscriber has caught up, set sequences, repoint the application and any connection pooler, and verify. Keep the old cluster available so it can be restarted if the new primary fails, and agree in advance the point after which rolling back would lose data.
Start the method decision with the version calendar. The PostgreSQL versioning policy lists November 12, 2026 as the end of support for version 14, so a team still running version 14 has a fixed deadline to plan around. Confirm the current date and the support end date for your version against the policy before scheduling. When you ask a partner for a quote, request a written scope that covers the replication design, validation scripts, sequence procedure, cutover runbook, rollback criteria and rehearsal plan, and identify any post-cutover support separately. Effort depends on data volume, number of tables, write rate and how many applications share the database, so ask how each of these was assumed in the quote.
Limits to confirm before committing to logical replication
Logical replication is only as predictable as the environment it runs in. Each limit below is something to verify in your own schemas, PostgreSQL versions and hosting before you commit a migration or consolidation plan to it. Confirm each one against the documentation for your exact version and a test environment that mirrors production.
Replicated object restrictions
The PostgreSQL documentation lists which objects and operations a publication carries and which it leaves out. Schema changes, sequence values and some object types may need separate handling, so review the restrictions section for each version you plan to run. Build an inventory of every table, sequence and object your application depends on, then mark which ones the documented behavior covers. Confirm the result by replicating a sample of that inventory in a test environment.
Matching table definitions
Logical replication applies row changes, so subscriber tables must already exist with compatible columns, data types and a usable replica identity. Schema drift between publisher and subscriber is a common cause of apply failures, especially when someone changes a column on one side during the rollout. Add schema comparison to your release checklist and confirm the replica identity for every table that receives updates or deletes. Run this check in a test environment against a recent copy of your schema.
Subscriber conflict behavior
A subscriber accepts changes from the publisher, and local writes on the subscriber can produce rows that conflict with incoming changes. When an apply worker hits a conflict or error, replication for that subscription stops until someone resolves it. Decide who may write to replicated tables on the subscriber, how conflicts will be detected and how the team will monitor subscription status. Confirm the conflict and error behavior for your version in the documentation, then test a deliberate conflict.
Performance under write-heavy loads
Replication lag grows when the publisher produces changes faster than the subscriber applies them. The publisher must also retain WAL until the subscriber confirms it, which can increase disk use and delay the subscriber's view of the data. Measure peak write rates, lag and WAL retention during a load test that matches your busiest period. Set alerts on lag and disk headroom before go-live, and confirm the results against your own workload and load profile.
Publisher and subscriber version pairing
Logical replication works between different PostgreSQL major versions, which is why it supports low-downtime upgrades. Version pairing still needs checking: confirm that both sides run supported releases and that the subscriber version works with the publisher version you run. The versioning policy lists supported versions, including 14, which ends support on November 12, 2026. Check the release notes for each version in the pair, and record the exact pairing you will test.
Managed service restrictions
Managed PostgreSQL services often expose logical replication through their own settings, limits and required parameters. Some restrict which roles can create publications or subscriptions, or whether the service can act as publisher, subscriber or both. Ask the vendor which settings you can change, how maintenance windows affect an active subscription and what happens during failover. Get the answers in writing, confirm them in your own account and document any vendor-specific limit that changes the plan.
Monitoring lag, slots and WAL retention after go-live
Go-live starts the work that keeps a logical replication subscription healthy. The platform team needs to watch three things continuously: how far the subscriber trails the publisher, whether the apply workers are erroring, and whether the replication slot on the publisher is still being consumed. On the publisher, the pg_replication_slots view shows each logical slot, whether it is active, and how far it has confirmed. The pg_stat_replication view shows the walsender connection and its lag positions. On the subscriber, pg_stat_subscription shows worker state and the last received and reported positions, and pg_stat_subscription_stats counts apply errors. Confirm the exact columns and their meaning against the documentation for your PostgreSQL version before you build dashboards on them.
The replication slot is the part of this work that most often causes an outage. A logical slot tells the publisher to keep WAL until the subscriber confirms it has consumed that WAL. If the subscriber is offline, paused, or has a failed apply worker, the slot stays inactive while WAL keeps accumulating on the publisher's disk. A forgotten slot from a decommissioned subscriber can fill that volume and stop the primary. The max_slot_wal_keep_size setting caps how much WAL a slot may hold, but a slot that exceeds the cap is invalidated and the subscriber must be resynchronized. Decide in advance which outcome you prefer. Size the WAL volume from measured write rates and the longest outage you are willing to tolerate, and ask your team to confirm both numbers before go-live.
Set alerts and a runbook before the subscription is switched on, not after the first incident. At minimum, alert on free space on the volume holding WAL, on any inactive logical slot, on growth in confirmed lag over a set window, on apply errors or a disabled subscription, and on an invalidated slot. Each alert should name an owner and a first action. The runbook should cover how to identify the slot and its subscriber, how to decide between restoring the subscriber and abandoning it, how to resolve an apply conflict or skip a failing transaction using the version-specific options in the subscription documentation, and how to drop an abandoned subscription. When a publisher is unreachable, the subscriber must first disassociate the slot before the subscription can be dropped, so rehearse that sequence on a non-production pair.
WAL held for a logical slot is separate from the WAL your continuous archiving retains for point-in-time recovery, and the two plans must agree. Archiving keeps segments for restores, while a slot keeps segments for consumers, so a recovery drill can behave differently from production when slots are involved. After a restore, replication slots may not exist on the restored publisher, and subscribers will need to be re-pointed or resynchronized. Review the continuous archiving documentation with your backup owner, check that archive retention covers your recovery targets, and test a restore of the publisher with the subscription configuration in place. Record which team owns the slot runbook and which owns the restore runbook, so neither is written in isolation.
Questions buyers ask before hiring help with PostgreSQL logical replication
What drives the cost of a PostgreSQL logical replication project?
The main cost drivers are the number of databases and publications, the number and size of tables in scope, how much downtime the business will accept during cutover, how much schema drift exists between source and target, and how much security review and testing the environment requires. Each one adds design, build and verification work. Fewer databases, a small set of replicated tables, a tolerant cutover window and a stable schema usually keep the work narrower. Ask for a written quote that itemizes these drivers, lists what is one-time (design, build, cutover, handover) and what recurs (support, monitoring, upgrades if retained), and states the assumptions behind each line.
How long does a logical replication build take?
Duration depends on the same drivers as cost, plus how quickly your team can make decisions and grant access to source and target environments. Because no duration figure is supplied for this topic, the right way to plan is to ask for a timeline inside the written scope, with milestones for design review, a test replication run, cutover rehearsal and go-live. Ask the provider which steps they have assumed you will perform and which they will perform, and what happens if a milestone slips because of your dependencies.
What does our team need to provide during the engagement?
Expect to provide named technical owners for the source and target databases, read access to schemas and replication settings, a test environment that resembles production, change windows for rehearsals and cutover, and sign-off from the application owners who will validate data after switchover. You will also need to confirm network paths between sites or platforms and who approves changes to firewall rules and credentials. Put these responsibilities in the scope so that delays from your side are visible and do not appear as provider overruns.
Can an internal DBA team set up logical replication without outside help?
Yes, many internal teams can, provided they have experience with PostgreSQL roles, WAL settings, publications and subscriptions, and they have time to test failure cases. The harder parts are usually not the initial commands but handling schema changes during replication, sequences that do not replicate, conflict handling, monitoring replication lag and rehearsing cutover under a downtime limit. Assess your team against those tasks honestly. An outside partner is most useful where the team lacks recent cutover experience, is short on time, or needs an independent review of the design and test evidence.
How is a fixed scope agreed before work starts?
DeployOpen most often works on a fixed-scope basis, which means the scope, deliverables and timelines are agreed in writing before work starts. For this topic, the written scope should name the source and target versions, the databases and tables to replicate, the excluded objects, the downtime target, the test and rehearsal plan, the handover items and the acceptance criteria. Changes that appear later, such as new tables or a different target version, should go through a written change process with a revised quote. Ask how that change process works before you sign.
What does logical replication not carry over, and how do we check for it?
Logical replication does not replicate schema changes such as DDL, and it does not carry over sequence values in the way many teams expect, so sequences need a separate synchronization step at cutover. Large objects, some object types and certain setup items also need checking against current PostgreSQL documentation for your versions. Ask the provider to produce an object inventory from your source database, compare it with what the publication covers, and document each gap with an owner and a resolution. Confirm these details against the PostgreSQL upgrading and replication documentation for your exact versions.
What should we ask for in a written quote for this work?
Ask for a quote that lists each deliverable, the environments in scope, the number of databases and tables, the cutover approach and downtime assumptions, the testing and rollback plan, and the responsibilities split between your team and the provider. Request separate lines for one-time build work and any recurring support or monitoring, and ask what is excluded. Also ask how assumptions are tracked, how changes are priced, and what documentation and knowledge transfer you receive at the end. A quote that cannot be traced back to these items is hard to compare with an internal plan.
How DeployOpen works on this
DeployOpen plans, implements, tests, documents and supports PostgreSQL logical replication inside infrastructure you control, including your cloud accounts, data centers or air-gapped networks. Each engagement starts from a written scope that defines which tables, sites and versions are in play before any configuration begins.
How we scope
- Inventory the tables, sequences and schemas that must replicate, and those that will not.
- Record the source and target PostgreSQL versions, platforms and sites in the written scope.
- Define the cutover window, rollback point and acceptable lag with your application owners.
How we build
- Configure publications and subscriptions, with replica identity set for every replicated table.
- Plan the objects logical replication does not carry, such as schema changes, sequences and large objects, and build them separately.
- Test replication lag, conflict handling and the cutover runbook in a staging copy before production.
How we hand over
- Document publication and subscription definitions, monitoring queries and the cutover and rollback steps.
- Walk your operations team through lag alerts, replication slot growth and what to do after a failed sync.
- Deliver the configuration in your repositories so your team can review and change it later.
How we support
- Engagements are fixed-scope, and ongoing support, upgrades and continuous testing are available as a retainer.
- Retainers can cover replication monitoring, minor release updates and planned changes to published tables.
- Confirm with us during scoping which post-handover support, if any, your team wants to buy.

