A shared database table is not an integration
Reading another team’s tables feels fast. It also creates a custody fight the moment both sides write the same row. What looked like an integration is really an undeclared shared database with no contract, no version, and no clear owner when a column meaning drifts.
Contract-based API paths make ownership visible. System A publishes a payload for an agreed event; system B consumes it. If B needs a new field, the change is negotiated instead of silently scraped. Failures show up as retries and dead letters, not as mysterious nulls in a report someone runs on Friday.
Shared tables still appear in mature estates. Treat them as debt to retire, not as a pattern to copy. When we inventory connectors, a table read across team boundaries is scored as brittle until a contract replaces it—or until someone accepts the risk in writing.