Cookie Policy

What Druma stores in your browser, why, and how to control it.

Effective 5 August 2026 · Version 2026-08-05

This document is available in English only. The English version is the legally binding version.

What we use

Druma is a B2B operational tool. We do not use marketing cookies, advertising pixels, or third-party analytics, and we do not build a profile of you for advertising.

Almost nothing we store is an actual HTTP cookie. Druma's own code writes no cookies at all. What it does use is localStorage and sessionStorage — browser storage that stays on your device and is never sent automatically with requests — plus one IndexedDB database in the driver app for the offline upload queue. The only real cookie involved is the one our CDN provider sets for bot protection. Because storage of this kind is still "storing information on a user's terminal equipment" under Article 5(3) of the ePrivacy Directive, we describe all of it here.

None of the entries below require consent under Article 5(3): they are either strictly necessary to deliver the service you asked for, or they are preferences you set yourself. We do not set any entry for analytics, advertising, or cross-site tracking.

Inventory by purpose

Grouped by what it is for, rather than key by key — the app writes several templated families of entries, and listing every concrete key would run to hundreds of rows without telling you anything more.

PurposeKeys / prefixesWhere it is storedWhat it holdsDurationCategory
Signing you insb-<project>-auth-token (set by our authentication library)localStorageHolds your access and refresh token so you stay signed in between page loads. Used by every Druma surface — planner, driver app, client portal, carrier portal, the Outlook add-in.Until you sign out or the refresh token expiresStrictly necessary
Remembering which company you are working indruma_active_companylocalStorageMulti-company users switch between companies; this remembers the one you last selected so the app opens on it.Until changed or clearedStrictly necessary
Cookie-banner acknowledgementcookie-consentlocalStorage (despite the name, this is not an HTTP cookie)Records that you dismissed the notice on the public website, together with the version of the notice you saw, so a materially changed notice is shown again.Until clearedStrictly necessary
Language and appearancedruma_lang, druma_language (driver app), druma_marketing_locale (public website), druma_themelocalStorageYour interface language and your light/dark/system theme choice. The theme key is also read by a small inline script before the app renders, so the page does not flash the wrong colour scheme.Until changed or clearedFunctional
Interface layout preferencesdruma_sidebar, druma_client_sidebar, druma_nav_expanded, druma_avatar_url, druma_dispatcher_filter, druma_board_filters_v1, druma.cs.staleCheckCallHourslocalStorageWhether the sidebar is collapsed, which navigation groups are open, a cached copy of your profile-photo URL so the avatar paints instantly, your saved dispatcher-board filter, your planning-board filter, sort, grouping and column-visibility state, and your customer-service stale-check-call threshold.Until changed or clearedFunctional
Table column layoutdruma_col_order_<tableId>, druma_col_width_<tableId>localStorageOne pair of entries per data table, storing the column order and column widths you dragged. 27 tables across the app use them, so up to 54 concrete entries can exist. The <tableId> part is the table’s name, for example druma_col_width_orders.Until changed or clearedFunctional
Dismissed banners, tours and onboarding stepsdruma_banner_seen_<pageKey>, druma_tours_completed, druma_onboarding_welcomed_<companyId>, druma_onboarding_dismissed_<companyId>, druma_onboarding_dismissed_steps_<companyId>, druma_trial_banner_dismissed_<companyId>, druma_pwa_install_dismissed_at, druma_apk_install_dismissed_at, druma_planner_pwa_install_dismissed_atlocalStorageSo that a first-visit explainer, a product tour, an onboarding checklist step or an "install the app" prompt you already dismissed does not come back. There is one druma_banner_seen_ entry per page that has an explainer banner — 87 pages currently do. The tour and banner-dismissal state is also mirrored to your user profile in our database so it follows you across devices.Until clearedFunctional
Driver app offline statedruma_driver_queue, druma_driver_seq, druma_driver_shift, druma_driver_waiting, druma_dismissed_post_trip, druma_wake_lock_enabledlocalStorageThe driver app is built to work without signal. These hold the queue of status changes waiting to be sent, the sequence counter that replays them in the right order, the cached shift and remaining-driving-time state, a running waiting-time timer, the post-trip checks you already dismissed, and whether you asked the screen to stay awake during a trip.Until synced, or until clearedStrictly necessary (driver app)
Not losing work in progressdruma_order_draft_<companyId>_new, druma_recent_search_<userId>localStorageAn autosaved copy of a half-finished Add Order form, so an accidental refresh does not discard it, and your recent entries in the global search palette (up to eight, kept on your device only).Until saved, changed or clearedFunctional
Account setup and billing housekeepingdruma_invite_oauth_pending, druma_stripe_link_attempted_<companyId>localStorageA short-lived marker that you are part-way through setting up an invited account with a social login, and a one-shot flag that stops a duplicate billing-link call being made on every login for the same company.Until the flow completes, then clearedStrictly necessary
OAuth security state (ANAF connection)anaf_oauth_state, anaf_oauth_company_idsessionStorageA one-time anti-forgery token and the company identifier for an in-flight connection to the Romanian tax authority (ANAF). These are the only two sessionStorage entries the app uses, and they exist only while an administrator is connecting ANAF.Deleted when the flow finishes or the tab closesStrictly necessary
Bot management__cf_bmHTTP cookie, set by Cloudflare (third-party)Set by our CDN and edge-security provider to distinguish real browsers from automated traffic. This is the only genuine HTTP cookie in play; Druma itself does not write any cookie.30 minutesStrictly necessary

About the templated entries. Three families expand into many concrete keys: druma_col_order_<tableId> and druma_col_width_<tableId> (one pair per data table — 27 tables, so up to 54 entries) and druma_banner_seen_<pageKey> (one per page with an explainer banner — 87 pages). Several others are suffixed with your company identifier or your user identifier, so their number depends on how many companies your account belongs to. Together this is roughly 140 concrete entries on a heavily-used account, all of them layout and dismissal preferences.

Offline upload queue (IndexedDB)

The driver app keeps an IndexedDB database called druma_uploads, with a single object store named pending. This one deserves calling out separately, because unlike everything else on this page it holds document content, not just a preference.

When a driver photographs a CMR, a proof of delivery, a damage report or a toll receipt in a place with no signal, the app cannot upload it immediately. Instead it writes the raw bytes of that photo or PDF into druma_uploads, together with the file name, content type, document type, the order and stop it belongs to, the destination storage path, the company and the user who captured it, and the time it was queued. CMR captures additionally carry any damage note the driver recorded.

  • Why it exists — so a capture survives a dead zone, a force-quit, or a flat battery, and uploads by itself when signal returns.
  • How long it stays — each record is deleted from the device as soon as its upload to Druma's storage succeeds. Records only persist while an upload is outstanding.
  • Where it lives — on the driver's own phone, inside the browser's storage for the Druma origin. It is not shared with any third party while queued.
  • Clearing it — clearing site data for the Druma origin, or uninstalling the app, deletes the queue and any capture that has not yet uploaded will be lost. Drivers should reconnect and let the queue drain before clearing site data.

Third-party requests

Beyond browser storage, some parts of Druma cause your browser to contact a third party directly. When that happens, that third party necessarily sees your IP address and basic request metadata. We list these here for completeness, because a page that claims to embed no third-party content should be honest about what it does embed.

  • Cloudflare — provides our CDN, hosting and edge security, and sets the __cf_bm bot-management cookie. All traffic to Druma passes through Cloudflare, so it sees request metadata for every page load. We do not control that cookie's lifecycle directly.
  • CARTO — supplies the basemap tiles behind most map views in the app (live map, planning map, orders, fleet, groupage, pricing and others). Your browser fetches those tiles straight from CARTO's CDN, so CARTO receives your IP address, your user agent, and the tile coordinates — which reveal the geographic area you are looking at. No account, order or customer data is sent.
  • OpenStreetMap Foundation — supplies the basemap tiles on a small number of secondary maps, with the same effect: IP address, user agent and tile coordinates reach the OSM tile servers. No account, order or customer data is sent.

What we do not embed. We do not embed Google Analytics, Facebook Pixel, Hotjar, Segment, or any other analytics or advertising script, and Druma's own code contains no tracking beacon. Web fonts are self-hosted from Druma's own domain — the app and website no longer load anything from Google Fonts, so no font request reaches Google.

Map tiles are the only third-party content the application requests from a user's browser, and they are functional rather than analytical: without them the map surfaces render blank. If you use Druma without opening a map view, no tile request is made.

Your choices

Strictly necessary entries — authentication, active company, the driver app's offline queue, OAuth security state, and the Cloudflare bot cookie — cannot be disabled without breaking the application.

Functional entries can be cleared at any time by clearing your browser's site data for druma.io. Doing so signs you out and resets your language, theme, sidebar, table layouts and dismissed banners. On a driver's phone, clearing site data also destroys any document still waiting in the offline upload queue — drain the queue first.

Because nothing on this page is used for analytics or advertising, there is no consent toggle to switch off. If we ever introduce optional analytics or marketing storage, we will update this page, add a granular consent panel to the banner, and require an explicit opt-in before setting anything.

Changes

We will revise this page if our browser-storage usage changes. The version and effective date at the top will be updated, and the version stamp recorded in the cookie-consent entry means the notice is shown again after a material change.