From field to digital. Forward together.Gokbilge Engineering

Engineering notes

When data must stay in Türkiye: Firebase, Cloudflare, CDNs and IoT architecture

Data residency for SCADA, IoT, mobile and web projects: processing, logging and access boundaries across Firebase, Cloudflare, CDNs, LoRaWAN and Helium.

Two engineers reviewing a system connection plan beside server racks

Distinguish the legal assessment from a project's geographic boundary

Architecture should not assume that Türkiye imposes an unconditional ban on exporting every type of data. Personal-data transfers require assessment under the applicable KVKK framework; the Authority's guide and standard-contract materials are starting references. A project contract or applicable sector requirement may impose a narrower residency boundary. This article examines the technical scenario where specified data must be processed and retained in Türkiye. It translates that requirement into reviewable engineering boundaries without deciding the legal outcome for a particular organization.

Specify whether the requirement covers personal records, operational telemetry, keys or all logs. Storage, processing, support access, backups and network transit can have different scopes. A domestic database does not answer every question. Remote support can matter without a downloaded file, and the KVKK guide addresses remote access subject to its stated criteria. Keep legal transfer assessment separate from a project's stricter no-external-processing requirement. A generic privacy checkbox cannot substitute for the geographic boundary in that project's contract.

Section references: KVKK · Kişisel Verilerin Yurt Dışına Aktarılması Rehberi ↗KVKK · Standart sözleşmeler ve bağlayıcı şirket kuralları ↗

Map the system beyond its database connection string

A mobile app can write to a domestic API while using separate identity, crash-reporting and push providers. A locally hosted web panel may still trigger browser requests to a CDN, remote scripts, analytics or verification services. A SCADA gateway may retain observations locally but export health telemetry or crash dumps. Reviewing only the application server's egress misses these paths. Include clients, devices, management and support in one flow map and state the information carried by each connection.

Inventory includes IP addresses, installation identifiers, timestamps, user/device mappings and URL parameters as well as payloads. Do not classify every technical field as personal data in every context; assess linkability. But a requirement covering operational metadata cannot be satisfied merely by calling the temperature value non-personal. Record key custody, decryption location and access roles. Encryption and geographic residency are different properties: an encrypted external flow does not become a domestic flow simply because its content is protected.

Firebase projects do not have one universal residency guarantee

Treating Firebase as one product with one location setting is misleading. Resources such as Firestore, storage and application backends have product- or instance-specific locations. Selecting a region for one resource does not constrain every Firebase service, and an EU region is not processing in Türkiye. As reviewed on 20 October 2026, Firebase's privacy documentation states that Firebase Authentication operates from US data centers. If identity processing falls under a strict Türkiye-only requirement, placing the database elsewhere does not resolve that dependency. Review the actual products, features and contractual scope individually.

This is a compatibility finding for a particular requirement and service flow, not a universal prohibition on Firebase. An app with a local business API still needs separate inventory rows for identity, push, Crashlytics and analytics. Review unnecessary automatic SDK initialization without assuming that collection settings rewrite every location condition. Development, test and production builds may behave differently. Record resource regions, SDK versions and observed network behavior together; one region label in a console is not a complete evidence package.

Section references: Firebase · Product and resource locations ↗Firebase · Privacy and Security ↗

Push notifications, crash reports and browser dependencies

FCM introduces a notification flow separate from the app's local API. Keeping sensitive content out of notifications and fetching it through an authorized API session can reduce exposure. FCM documentation distinguishes transport protection from end-to-end content protection. Minimization or additional encryption does not remove the notification provider, however. If the residency requirement covers delivery metadata as well as message content, assess that remaining dependency explicitly rather than treating it as resolved by an encrypted payload.

Product design must also consider operating-system push, store and device-service relationships. Alternatives such as in-app polling or managed clients may need assessment under a strict requirement, with their own background execution, battery, latency and administration limits. On the web, inventory remote fonts, tag managers, error tracking and bot verification. Removing one SDK does not establish that every external flow has disappeared. Observe cold launch, sign-in, failures, offline operation and reconnection on the actual client.

Section references: Firebase Cloud Messaging · Encryption ↗

A local origin does not constrain a CDN or reverse proxy

A domestic origin does not establish that its CDN or reverse proxy processes requests within the same boundary. Review TLS termination, cacheable responses, WAF visibility and log destinations separately. Serving public images differs from proxying authenticated APIs, but visitor IPs, paths and security events may still fall within scope. Classify the flows rather than giving an entire domain one domestic or foreign label that conceals materially different handling of public assets and protected application traffic.

DNS-only service and HTTP proxying expose different data paths. DNS use alone does not mean the response body passes through that provider, while DNS and account metadata need their own assessment. Disabling cache does not necessarily disable inspection or logging. Reaching a Turkish point of presence also cannot prove the residency of every processing and storage step. Interpret observations with contracts and configuration; one IP-geolocation lookup cannot validate the entire chain.

Cloudflare: distinguish Türkiye Regional Services from metadata residency

Cloudflare's region table, reviewed on 20 October 2026, lists Türkiye support for Regional Services, which constrains HTTPS decryption and processing within its configured scope. The same table does not list Türkiye support for Customer Metadata Boundary; its selectable metadata regions are the EU and US. Türkiye content processing therefore does not establish Türkiye storage for Customer Logs. If those logs are in scope, a separate incompatibility or unresolved boundary remains; the presence of a Turkish point of presence is not sufficient.

Keep content processing, log/analytics storage and TLS key location separate. Their region controls are not interchangeable. The DLS overview describes an Enterprise paid add-on, not ordinary-plan defaults. Cloudflare's metadata FAQ also distinguishes account, configuration and some operational data from Customer Metadata Boundary coverage. It would therefore be misleading to claim that one setting keeps all Cloudflare data in Türkiye. Verify account entitlements, purchased scope, enabled products and current documentation, retaining the review date and evidence version because product options can change.

20 October 2026: different components require different residency evidence
ComponentDocumented boundaryAdditional Türkiye-only review
Firebase AuthenticationUS identity processingResolve if identity data are in scope
Firebase resource regionProduct/instance locationOther SDKs and services are separate
Cloudflare Regional ServicesTürkiye option listedProduct scope and metadata remain separate
Cloudflare Customer Metadata BoundaryEU or USCannot be presented as a Türkiye log boundary
Private LoRaWAN networkServer and key locations depend on deploymentVerify roaming, support and logs
Helium IoT networkHotspot, HPR and LNS chainEvidence required for every relevant hop

Section references: Cloudflare · Region support ↗Cloudflare · Customer Metadata Boundary ↗Cloudflare · Metadata Boundary FAQ ↗Cloudflare · Data Localization Suite ↗

Review Cloudflare product combinations and subrequests separately

Regionalizing a hostname does not automatically determine residency for every additional product. Cloudflare's compatibility matrix distinguishes features and restrictions, including Workers.dev versus Workers deployed on a zone. Its limitations document states that Regional Services does not apply to Workers subrequests. A call from regional processing to an external API is therefore another flow. Review DNS, WAF, Workers, storage, Logpush and support against the actual configuration instead of treating hostname regionalization as a complete-system boundary.

Cache hierarchy also matters: Cloudflare documents different Regional Services compatibility for Generic Global/Custom Tiered Cache and Smart Tiered Cache. Exporting logs to a Turkish destination does not erase earlier processing or storage. Evidence needs enabled products, hostnames, regions, restrictions and the log lifecycle. Do not assume that every localization feature is active in an ordinary CDN setup. Use the purchased, configured and verified scope rather than extending a marketing statement to the whole system.

Section references: Cloudflare · Product compatibility ↗Cloudflare · Localization limitations ↗Cloudflare · Cache localization ↗

LoRaWAN is a networking standard, not a mandatory foreign cloud

LoRaWAN and a managed LoRaWAN service are different things. The standard separates end devices, gateways, network and application functions, with join and key responsibilities depending on version and deployment. A private network can operate those components on selected infrastructure. LoRaWAN does not inherently require foreign processing. Assess the chosen Network Server, Application Server, any Join Server, management tooling, access roles and external dependencies instead of assigning a country requirement to the radio standard itself.

Application encryption and routing or radio metadata have different visibility. Verify key roles and decryption points before claiming that intermediaries either see everything or see nothing. A suitable radio frequency plan does not establish server location. Inventory roaming, cloud consoles, time services, diagnostics and key backups. Self-operated open-source network software can increase control, but cannot eliminate the consequences of a poor deployment or external support access.

Section references: LoRa Alliance · LoRaWAN for Developers ↗LoRa Alliance · Security implementation ↗

Helium: a Turkish gateway does not establish the packet path's residency

Helium IoT introduces Helium Packet Router into the gateway-to-LNS path. A Turkish hotspot and a domestically hosted LNS do not together establish Türkiye-only handling throughout routing and management. Review HPR, configuration services, the selected LNS, integrations and logs separately. This does not establish that every Helium packet is processed in one particular foreign country. It establishes that domestic endpoints alone cannot prove residency for every relevant intermediary.

A decentralized-network label or encrypted payload cannot replace this review. Application decryption and network metadata processing are different questions. Public-network participation may improve coverage while adding dependencies and evidence requirements under a strict boundary. If geography, subprocessors, logs, retention and support cannot be substantiated, the result is unresolved scope rather than acceptance. A controlled private route may then need evaluation, including its operational and maintenance costs.

Section references: Helium · LoRaWAN architecture ↗

Build a reviewable domestic path for SCADA, IoT and applications

An alternative may combine field acquisition, local buffering, managed identity, domestic messaging/APIs, storage and observability. This is neither a prescribed product list nor an automatic compliance guarantee. Verify location, key custody, updates and management for every component. Separate SCADA control loops from central reporting so an external outage does not leave physical behavior undefined. Remote access needs defined targets, permissions, session evidence and permitted locations; the existence of a VPN alone is insufficient.

Backups, recovery, CI/CD, support bundles and test data may fall within the same boundary. Uploading a crash dump to an external ticket system can reintroduce the dependency. A Turkish provider name does not independently verify backup or support locations. Minimization, local redaction and restricted egress need operational testing. If network transit itself must stay domestic, state that separately and obtain carrier/routing evidence; server geography does not prove every Internet route.

What can a declared-flow inventory check establish?

The example reviews processing, storage, logs, backups, support access and key storage for each inventoried flow. Its synthetic policy accepts only TR. A declared foreign location requires review; missing locations or evidence remain unknown. The code discovers no traffic, authenticates no document and makes no KVKK compliance decision. Evidence identifiers are placeholders. It cannot prove that a form filled entirely with TR is accurate; it only makes the declared inventory and its gaps visible.

A synthetic edge flow with domestic processing but foreign logs requires review, as does foreign identity processing. Missing support or backup evidence cannot produce a positive result. The code infers no geography from a vendor name. Real review adds document dates, contracts, active settings, data classes and ownership. Unused features need justified exclusions rather than empty fields treated as approval. The inventory helps procurement and engineering discuss the same unresolved boundary.

Review of declared residency inventory, not a legal-compliance tool · Node.js
const assert = require('node:assert/strict');
// A review of declared inventory, not traffic discovery or legal compliance.
const dimensions = ['processing', 'storage', 'logs', 'backups',
  'supportAccess', 'keyStorage'];
function review(flow) {
  const findings = dimensions.map(dimension => {
    const item = flow.locations?.[dimension];
    if (!item || !Array.isArray(item.countries) || !item.countries.length)
      return { dimension, state: 'unknown' };
    if (item.countries.some(country => country !== 'TR'))
      return { dimension, state: 'outside-declared-policy' };
    if (typeof item.evidence !== 'string' || !item.evidence.trim())
      return { dimension, state: 'unknown' };
    return { dimension, state: 'documented-domestic' };
  });
  return { id: flow.id, findings,
    state: findings.some(f => f.state === 'outside-declared-policy')
      ? 'review-required'
      : findings.some(f => f.state === 'unknown')
        ? 'unknown' : 'documented-domestic' };
}
// All records below are synthetic; evidence IDs are placeholders.
const domesticLocations = () => Object.fromEntries(dimensions.map(d =>
  [d, { countries: ['TR'], evidence: 'example-evidence-' + d }]));
const localApi = { id: 'residency-manifest-api', locations: domesticLocations() };
assert.equal(review(localApi).state, 'documented-domestic');
const remoteIdentity = { id: 'example-identity', locations: domesticLocations() };
remoteIdentity.locations.processing = { countries: ['US'], evidence: 'example-review' };
assert.equal(review(remoteIdentity).state, 'review-required');
const mixedEdge = { id: 'example-edge', locations: domesticLocations() };
mixedEdge.locations.logs = { countries: ['DE'], evidence: 'example-review' };
assert.equal(review(mixedEdge).state, 'review-required');
const unknownSupport = { id: 'example-support', locations: domesticLocations() };
unknownSupport.locations.supportAccess = { countries: [], evidence: '' };
assert.equal(review(unknownSupport).state, 'unknown');
const unsupportedClaim = { id: 'example-claim', locations: domesticLocations() };
unsupportedClaim.locations.backups.evidence = '';
assert.equal(review(unsupportedClaim).state, 'unknown');
assert.equal(review({ id: 'empty-manifest' }).state, 'unknown');
console.log([localApi, remoteIdentity, mixedEdge, unknownSupport].map(review));

Acceptance evidence and Gokbilge Tech's engineering scope

Acceptance spans clients, devices and servers: launch, sign-in, notifications, failures, renewal, reconnection, restore and support sessions. DNS and network observations show destinations but cannot independently establish encrypted content, provider-internal retention or every support path. Combine them with provider evidence, contracts and configuration. Test behavior when external services are unavailable; blocking a connection and hiding errors is not a substitute. New SDKs or services reopen the inventory and affected acceptance cases.

As an independent software and hardware house, Gokbilge Tech can assess SCADA/IoT pipelines, firmware and mobile/web dependencies together. Scope may include flow inventory, technical interpretation of the residency requirement, alternative deployment and controlled acceptance evidence. Local engineering does not mean every component is domestically manufactured or every self-hosted deployment automatically secure. Identify the incompatible flow instead of attaching a blanket prohibition to Firebase, Cloudflare or Helium. Project-specific legal and sector conclusions need appropriate expert review; this article provides an engineering method.

  • Are data classes and processing, storage, access and transit requirements separate?
  • Were Firebase SDK flows and Cloudflare content, log and additional-product scopes verified?
  • Are LoRaWAN/Helium servers, routing, keys and support paths documented?
  • Do unresolved flows remain visible and were actual failure/recovery paths tested?

Technical references

Want to apply this approach to your system?

Discuss your technical requirements →