Location infrastructure for developers
Build location-aware apps without building location infrastructure.
Add continuous, background and motion-triggered location tracking to your application with an SDK built for apps that run all day - one that keeps working when the app is backgrounded, the network drops and the battery is at 12%.
No developers? Use our app instead - ready-made field workforce tracking, nothing to build.
TrackPoint
accepted- latitude
- 19.0760
- longitude
- 72.8777
- accuracy
- 8.5f
- speedMps
- 3.4f
- bearingDeg
- 184.2f
- provider
- "fused"
- movementStatus
- MOVING
- odometerMeters
- 18624.0
Captured on device. Delivered to your backend, not ours.
The problem
Location tracking is harder than getting GPS coordinates.
A single getCurrentPosition() call is a demo.
Production-grade tracking means owning an entire subsystem - one that keeps
working when the app is backgrounded, the network drops and the OS decides your
process is expendable.
- 01 Background execution
- 02 Permission management
- 03 Battery optimisation
- 04 Offline persistence
- 05 Synchronisation
- 06 Geofencing
- 07 Movement detection
- 08 Location history
- 09 Accuracy handling
Without an SDK
9 subsystemsEvery layer is yours to build, test, ship and maintain - twice, because Android and iOS disagree about all of it.
With Field Track 360
1 dependencyOne integration surface, the same on every platform. You write product code.
- Setup
- ~10 min
- Platforms
- 4
- Network to start
- none
Core capabilities
Everything you need to build location-aware experiences.
Use modular location capabilities instead of building the underlying infrastructure from scratch.
Real-time location
One fresh fix on demand, or a continuous stream as the device moves.
getCurrentLocation()
Background location
Capture continues in a foreground service, and survives a swipe-away and a reboot.
foregroundService
Geofencing
Define boundaries and respond to entry and exit events.
addGeofence()
Location history
Read stored points back, paged, for routes and activity timelines.
getPoints(query)
Movement detection
Moving and stationary states, so tracking can stand down when nothing is happening.
MotionChange
Distance and trips
Sessions, odometer and a built track with stops and speed bands.
getOdometerMeters()
Offline capture
Points persist locally with their own TTL and reconcile when the network returns.
PersistenceConfig
Plot and export
Build a track and export it as polyline JSON or GeoJSON.
exportGeoJson()
How integration goes
From SDK integration to location intelligence.
-
Add the SDK
Pull the package in with your platform's dependency manager.
gradle / spm / pub / npm -
Supply your licence
Read it from local.properties into a build config field.
FIELDTRACK_LICENSE -
Request permissions
Prompt for foreground and background location, following platform rules.
when-in-use → always -
Start tracking
Configure accuracy and interval, then open the session.
tracker.start(tag) -
Build your product
Ship live maps, geofence triggers, trip summaries and your own logic.
your code
Developer experience
Designed for developers. Built for fast integration.
Clear APIs, predictable behaviour, and documentation that matches the release you are actually holding.
A small API surface
Three calls to start tracking, and nothing on the Tracker surface throws - every fallible call returns a typed result. Licensing is handled inside the SDK: no endpoint to call, and no crypto for you to write.
-
Tracker.getInstance(context)idempotent, one per process -
tracker.ready(config)verify the licence, prepare -
tracker.start(tag)open a session -
tracker.stop()close it
One key, every platform
Native Android and iOS, with React Native and Flutter bridging to the same native code. A single access key covers all four.
- Android Kotlin
- iOS Swift
- React Native TypeScript
- Flutter Dart
Guides are published from each SDK's own README, so they match the release rather than a transcription of it.
Quick start
Start tracking with a few lines of code.
Prepare the tracker with your access key, then start a session. The key is verified on the device, offline - there is no activation call to wait for.
Read the documentation// Three calls: getInstance -> ready -> start.
val tracker: Tracker by lazy { Tracker.getInstance(this) }
when (val result = tracker.ready(
TrackerConfig.builder()
.license(BuildConfig.FIELDTRACK_LICENSE)
.build()
)) {
is TrackerResult.Ok -> Log.d("app", "ready: ${result.value}")
is TrackerResult.Error -> Log.w("app", "${result.code}: ${result.message}")
}
// Once permissions are granted. Before ready(), this is NOT_READY.
when (val session = tracker.start(tag = "commute")) {
is TrackerResult.Ok -> Log.d("app", "session ${session.value.id}")
is TrackerResult.Error -> Log.w("app", "${session.code}")
}
Kotlin 17 lines Full Android guide
import SwiftUI
import TrackerCore
struct MyApp: App {
init() {
// ready() belongs here - registering after launch completes throws.
Task { _ = await Tracker.shared.ready() }
}
var body: some Scene { WindowGroup { ContentView() } }
}
// The ladder is ordered: Always can only be asked for from When-In-Use.
let tier = await Tracker.shared.permissions().requestWhenInUse()
guard tier != .none else { return }
switch await Tracker.shared.start(tag: "delivery-run") {
case .success(let session): print("recording \(session.id)")
case .failure(let code, let message): print("refused - \(code.rawValue): \(message)")
default: break
}
Swift 22 lines Full iOS guide
import Tracker, { onTrackerEvent } from '@fieldtrack360/react-native-tracker';
const result = await Tracker.ready({
trackingMode: 'adaptive',
intervalMs: 1000,
});
if (!result.ok) console.warn('ready failed', result.code, result.message);
const started = await Tracker.start('morning-route');
if (!started.ok) console.warn(started.code, started.message);
const unsubscribe = onTrackerEvent((event) => {
if (event.type === 'location') {
console.log(event.point.latitude, event.point.longitude);
}
});
TypeScript 16 lines Full React Native guide
import 'package:trackit_flutter/trackit_flutter.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
// Subscribe FIRST - the stream has no replay.
Tracker.instance.events.listen(_handleEvent);
// Start readiness, but do NOT await it before the first frame.
final ready = Tracker.instance
.ready(const TrackerConfig())
.timeout(const Duration(seconds: 15));
runApp(MyApp(ready: ready));
}
// Once permissions are granted:
final session = await Tracker.instance.start(tag: 'commute');
Dart 18 lines Full Flutter guide
Use cases
One SDK. Many location-based applications.
Field workforce
Track visits, movement and field activity across a shift.
Logistics and delivery
Follow delivery agents, routes and trip progress in real time.
Fleet management
Monitor vehicle and device movement as it happens.
Ridesharing
Power live driver and passenger location experiences.
Location attendance
Build presence and attendance workflows tied to a place.
Asset tracking
Keep sight of mobile assets, equipment and connected devices.
On-demand services
Connect users with the nearest available provider.
Location experiences
Trigger in-app behaviour when someone arrives or leaves.
Built for the real world
Built for real-world location tracking.
Background tracking
Updates continue while the app is backgrounded, within what the OS permits.
- foreground
- updates
- background
- updates
- terminated
- OS-dependent
Behaviour varies with OS policy and the permission level granted.
Battery conscious
Trade update frequency against power draw, per tracking profile.
- high
- 5 s
- balanced
- 30 s
- low
- 5 min
Motion-triggered capture slows updates while a device is stationary.
Offline first
Points are persisted through a connectivity gap and reconciled afterwards.
Your app keeps receiving events locally throughout the outage.
Never goes dark
The licence is verified on the device. If our servers are unreachable, tracking carries on.
A tracking app should never stop because a server blinked.
Location data
Rich location data - and it is yours alone.
Every fix carries the metadata your product logic needs, not just a pair of coordinates. All of it stays on the device and goes to your backend.
latitude / longitude- Decimal degrees, WGS 84
accuracy- Horizontal radius, in metres
speed- Ground speed at the time of the fix
heading- Direction of travel, in degrees
movement- Moving or stationary state
timestamp- ISO 8601, UTC
Where it goes
-
1
The device captures a fix
Buffered locally if the network is gone.
-
2
Your app sends it to your backend
Your endpoint, your schema, your retention policy.
-
3
We receive a licence check
A key and an application id, occasionally. Never a coordinate.
There is no location ingestion endpoint to opt out of, because there is no location ingestion.
Security and privacy
Location data deserves strong protection.
Nothing to leak
We hold no location data, so there is no store of your users’ movements for anyone to breach - ours or yours.
Signed licences
Access keys are signed with Ed25519 and verified on the device. A key cannot be edited, extended or forged.
Permission-led
The SDK asks for what the platform requires and works within the level the user granted. It never routes around consent.
Encrypted in transit
The one call we do receive - the licence check - travels over TLS and its response is signed, so a hostile network cannot fake a revocation.
No certification claims are made on this page. Everything above is a control the product actually implements, and each one is documented in the integration guides.
Platform support
Build for the platforms your users already use.
Android SDK
Kotlin-first, with a foreground service and the fused location provider.
Integration guide →iOS SDK
Swift, built on Core Location with significant-change monitoring.
Integration guide →React Native
A typed JavaScript API bridging to the same native modules.
Integration guide →Flutter
A Dart plugin exposing the native location stream and callbacks.
Integration guide →One application key covers all four - a React Native app and a native Android app built from the same application id use the same licence.
Documentation
Everything developers need to start building.
01 · Guide
Quick start
Add the SDK, supply a key, and receive your first fix.
Read the guide →02 · Guides
Integration guides
Installation, permissions, background tracking and geofencing, per platform.
Explore guides →03 · Evaluate
Free trial key
A signed 30-day key, issued immediately. The same key keeps working when you buy.
Get a key →Pricing
Buy once. Ship forever.
Licences are perpetual and priced per application key - no renewals, no per-device fees, and no charge for how much location data you capture.
STARTER
For building 1 app
₹49,000
one-time
- 1 application key
- Perpetual licence, never expires
- One key covers every platform
STUDIO
For building 5 apps
₹1,75,000
one-time · ₹35,000 per app
- 5 application keys
- Perpetual licence, never expires
- One key covers every platform
TEAM
For building 10 apps
₹2,95,000
one-time · ₹29,500 per app
- 10 application keys
- Perpetual licence, never expires
- One key covers every platform
Not ready to buy? Start a free 30-day trial - a signed key, issued immediately, no card required.
What is a location tracking SDK?
A client library that owns the whole lifecycle of location data inside your app - acquiring fixes from the device, managing foreground and background permissions, surviving the OS killing your process, buffering while offline, and handing your code structured location events. It replaces the platform-specific plumbing you would otherwise write and maintain separately for every OS you ship on.
Which platforms are supported?
Native Android (Kotlin) and iOS (Swift), plus React Native and Flutter, which bridge to those same native SDKs. One access key covers all four - a React Native app and a native Android app built from the same application id use the same licence.
Can the SDK track location in the background?
Yes, and that is what it is built for. Background behaviour is still governed by the operating system: the user must grant background location access, and delivery frequency depends on OS power policies, app state and device conditions. The SDK works within those rules rather than around them.
Do you receive our location data?
No. The SDK sends no location data to us. It stays on the device and in whatever backend you send it to. The only thing our servers ever see is an occasional licence check, which carries a key and an application id - never a coordinate.
Does my app need internet to start tracking?
No. The access key is verified on the device, offline, using a signature - so tracking starts on a plane, on first launch, in a basement. We do check periodically whether a licence has been revoked, but if that check cannot reach us your app carries on working. A tracking app should never go dark because a server blinked.
How does the SDK affect battery usage?
Power draw scales with how often you request a fix and how precise it must be. Accuracy profiles and update intervals are configurable, and motion-triggered capture lets updates slow or pause while a device is stationary - so the cost matches what your use case actually needs rather than a fixed worst case.
What does a licence cost, and does it expire?
Licences are perpetual and priced per application key, quoted in your local currency. Buy once and that application is licensed forever, including builds already released. A year of SDK updates is included; when it lapses, everything you have shipped keeps working - you simply stop receiving new SDK releases until you renew.
Ready when you are
Build location intelligence into your application.
Integrate background location tracking without building the infrastructure underneath it. Start with a free 30-day key and keep the same key when you buy.