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.

Site search. The search on this website stores nothing on your device: no cookie, no localStorage or sessionStorage entry and no identifier. If a search finds nothing, the words you typed may be sent to us and kept, in lower case with the language and the day, never with your IP address or any account, for up to 13 months, so that we can add the page that was missing. Words that look like an e-mail address, a web address or a number are never sent.

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 setupdruma_invite_oauth_pendinglocalStorageA short-lived marker that you are part-way through setting up an invited account with a social login.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.
  • Druma map tiles — every map in the app and the driver app draws its basemap from our own tile service, which runs on the same Cloudflare network. No separate map provider receives your IP address or the area of the map you are looking at.

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.