# Twelfth documentation - Full Context > Generated by docmd --- ## [Artefacts & shared documents](https://twelfth.ai/docs/artefacts/) --- title: Artefacts & shared documents description: Every file your workspace holds in one place, and how to share a Google Sheet or Doc with Twelfth so the assistant knows about it. lastmod: 2026-10-14 --- # Artefacts & shared documents **Artefacts** (`/app/artefacts`) is one table of every file your workspace holds, wherever it arrived: documents you shared with Twelfth, the spreadsheets and calendars linked as calendar sources, files attached in chat, Performance target workbooks and files kept with supplier notes. Search across all of them, filter by type with the chips above the table, and sort any column. A row opens the file: a shared document or target workbook in place, a chat attachment at the message it was said in, a calendar source in Settings → Calendars, a supplier file as a download. ## Share a document with Twelfth To let the assistant know about a document, such as a range plan, supplier terms, a buying policy or a category review, you can upload it or link it. **Upload** (or drop files anywhere on the page) to add a file from your computer: up to 10 files at a time, 10 MB each. An upload is kept as it is; re-upload to change it. **Link a file** keeps a Google or Microsoft file current without uploading anything or setting up a sync: 1. In Google, share the Sheet, Doc, Slides or plain-text file with **Twelfth's reader address** (shown in the dialog) as **Viewer**. It is the same address Settings → Calendars uses. 2. Paste the file's link. Twelfth checks it as you paste (the file's name and type, whether its contents can be read, and who in your workspace shared it) and shows the result before you add it. Choose whether it is for the whole workspace or one remit, and add a line about what it is for; the assistant reads that line to decide when the document is relevant. 3. Twelfth reads the file and keeps a text snapshot. From then on the assistant knows about the document in conversations within its workspace or remit scope and reads it when a question bears on it, citing it by title. The shared-document flow only reads; it never edits the document. Calendar and target templates, and spreadsheet destinations, have separate setup and writing rules. Google Sheets are read tab by tab; Docs and Slides as text; Word documents and PowerPoint decks as their text, tables included. PDFs and images are listed but cannot be read yet. Convert them to a Google Doc to include them. ### Who can add documents A workspace admin can add a document for the whole workspace or any remit. A remit owner can add documents to their own remit. Everyone can read the workspace-wide documents and those in their remits, and refresh any document they can read. ### How Twelfth keeps documents to your workspace Sharing a Google file with Twelfth does not make it available to every workspace. Twelfth checks its owner and the person who shared it: an active member with a verified email must vouch for it. A matching company email domain or a pasted link alone does not qualify. For a new file whose owner or sharer belongs to several workspaces, ask a colleague who belongs only to the intended workspace to share it. Each file stays bound to one workspace after unlinking; another workspace needs a separate copy. Access is checked again on reads and refreshes. If access is lost, the text snapshot is cleared and Artefacts shows why. See [Google sharing and access](/settings/integrations/google-files/sharing/). ### Keeping documents current A snapshot refreshes automatically when it is more than an hour old and the assistant reads it; open the document from the table and choose **Refresh** to read it again now. Very large files are capped, and the page says so. **Remove** takes the document out of Twelfth; the file in Google is untouched. The **Updated** column shows when the file itself last changed; under it, a linked file says when Twelfth last read it. ### OneDrive and SharePoint Paste a OneDrive or SharePoint link into **Link a file**. There is nothing to share: Twelfth reads it with your workspace's connected Microsoft 365 account, once that account has granted access to files (Settings → Integrations → Microsoft 365). See [Microsoft files as AI context](/settings/integrations/microsoft-365/files/) for supported content and scope. ## Using these files elsewhere - **In a chat**, the paperclip offers **From Artefacts or a drive…**: find a spreadsheet by name in Artefacts, Google Drive or OneDrive, and its biggest tab goes with your next message, as a file from your computer would. - **On a new project**, **Attach artefacts** ticks documents already here, takes uploads and drops, and on its **Google Drive or OneDrive** tab finds a sheet by name or takes a pasted link, linking it into Artefacts as it attaches. ## Other files on the page - **Linked calendar sources**: the sheets and calendars read for your planning calendars. Managed in Settings → Calendars; listed here so a linked sheet can be found. - **Files attached in chat**: spreadsheets attached to a conversation. The rows live in the message; the card opens the turn they were said in. Visible to whoever can see the chat. - **Screenshots**: pictures sent to the assistant in a chat. The card opens the turn they were sent with. Visible to whoever can see the chat, which for a private chat is only you. - **Note files**: files dropped, pasted or attached into a supplier note or a project's log, where they sit in the text as a small badge. Visible to whoever can read the note: the supplier within your remits, or a project you can see. - **Target workbooks** and **Supplier note attachments**: the Performance target uploads and the files kept with supplier notes, as before. To manage company, category, remit or buyer targets, including ongoing sheet sync and starter templates, use [Sales and performance targets](/targets/). --- ## [Twelfth AI and chats](https://twelfth.ai/docs/assistant/) --- title: Twelfth AI and chats description: Ask Twelfth about your commercial work, turn a conversation into reviewed action, and find every chat you can access. lastmod: 2026-10-16 --- # Twelfth AI and chats Twelfth includes an assistant you can ask about your commercial work. It can explain a recommendation, pull together context, or draft a piece of work for you to review. Conversations you start are saved as **chats** so you can return to them. Standalone chats are private unless their creator shares them in a way the workspace allows. ## Starting a chat - Use **New chat** in the left rail (the primary create action) to open a blank conversation. - Ask a question or describe something you want to get done. Twelfth answers from your workspace context. - Open the **work assistant** drawer from the header to chat alongside whatever page you are on, without leaving it. ## Attaching a spreadsheet or a screenshot Any chat composer takes a file with your question: click the paperclip, drag the file onto the page, or paste a screenshot into the message box (Cmd+V on a Mac, Ctrl+V on Windows). - **Spreadsheets** (.xlsx, .xls, .csv) are read in your browser and the rows go with the message. - **Screenshots** (PNG, JPEG or WebP) are shown to the assistant as a picture, so you can ask about a screen from a system Twelfth is not connected to. Before it is sent the image is resized and stripped of its metadata, including any location a phone added. Figures the assistant reads off a screenshot are yours, not Twelfth's: the answer marks them "(read from your screenshot)", and the note under the answer says they have not been checked against your data. Follow-up questions in the same chat still see the most recent screenshot. The picture is kept in Twelfth's file storage with the chat, visible to you and to anyone the chat is shared with, and listed on **Artefacts** as a screenshot. - **Charts from Excel** arrive from [Twelfth for Excel](/extensions/excel/#twelfth-for-excel-ask): the figures the chart plots and Excel's picture of it. The chat draws the chart live from the figures, with **Excel's picture** one click away, and the assistant reads the figures rather than the picture. It is listed on **Artefacts** as an Excel chart, linked to the turn. ## When Twelfth asks first If your request leaves open something that would change the answer, such as which product, which period, which retailers or how wide a scope, Twelfth asks before it assumes. The questions arrive together in one card under its message: - Pick a choice for each question. Some questions take more than one choice, marked **Pick any**. - Type your own answer in the box under any question if none of the choices fits. - Press **Send answers** (or Cmd+Enter). Your answers go back as one message, and Twelfth carries on from there. - Press **Skip, use your judgement** to let Twelfth decide. It says what it assumed, so you can correct it. When there is one obvious choice, Twelfth uses it and says so in a line rather than asking. A chat waiting on your answer shows **Your turn** in the chat list, and the **Chats** item in the left rail shows how many are waiting. In Slack, Teams or Google Chat the same questions arrive as a message; reply in the thread with your answers. ## Choosing the model The pill in the composer toolbar shows the model and thinking strength your next message uses, for example **Gemini 3.8 Flash Auto**. Click it to search for a different model, set **Thinking** (Auto, Instant, Balanced or Thorough), or turn Plan first on or off. In a chat it also sets **Show working**, which is how much of its working Twelfth shows while it answers. Your model and thinking choices are remembered in this browser. ## Dictating a message Click the microphone beside the send button and speak. Your words are typed into the message box at the cursor, and you can edit them before you send. While Twelfth is listening, the phrase it is still hearing shows in grey beside the microphone. Click the microphone again, press Esc or send the message to stop. The first time, your browser asks for permission to use the microphone. Dictation uses your browser's own speech service, so it works in Chrome, Edge and Safari but not Firefox. In Chrome and Edge the audio is sent to the browser maker's speech service to be turned into text. You can still use your computer's own dictation (on a Mac, press the Fn key twice) in any chat box. ## Plan first Press **Shift+Tab** in the message box, or click the checklist icon beside the paperclip, when you want to agree the approach before Twelfth does the work. The composer shows that plan mode is on: a striped band along its top edge, a tinted border, and a **Plan** badge. Press Shift+Tab again, or click the badge, to turn it off. Instead of answering, Twelfth replies with the steps it would take (what it will look up, over which period and scope, and what it will hand back) and any questions it still has. Press **Go ahead** to run the plan. Plan first switches itself off once you agree a plan. To change the plan, type what you want different instead and Twelfth revises it. ## Tables and charts Prose is the assistant's default. When the rows are the answer it draws a table; when the shape of the data is the answer it draws a chart, and it says when a set shown is partial. Four kinds: - **Line**: change over time, such as weekly units or price history, with one line per retailer or supplier where that helps. - **Bar**: a ranking or a comparison of a few items on one measure. - **Scatter**: how two measures relate across one set of items, when the question is about the relationship or the outliers: price against units sold, margin against velocity, cover against sales rate. Points are named, and sized where a third measure matters. - **Matrix**: a portfolio read, when you are deciding what to do with a set of categories, suppliers or lines: invest, milk or harvest; protect or prune; "where is the money"; "which of these are my cash cows". Each item is placed by two measures in four named quadrants. The default is the performance grid from the methodology, gross margin against sales volume, with **Flagship** (high margin, high volume), **Core traffic** (low margin, high volume), **Maintain** (high margin, low volume) and **Rehab** (low margin, low volume). Ask in growth-and-share terms and it uses **Stars**, **Cash cows**, **Question marks** and **Dogs** instead, or name your own four. The splits fall at the medians of the items shown unless you give cutoffs, so the bands are relative to your own portfolio, not absolute, and a category's role can override its cell. Every chart has a **Table** toggle to see the rows behind it, and **Keep** on a chart or table in a project conversation writes it into the project's record. In [Twelfth for Excel](/extensions/excel/#twelfth-for-excel-ask) a chart in an answer is placed in the workbook as an Excel chart rather than drawn in the pane. ## Checking a source A numbered, underlined phrase in an answer opens its source card. Click it, or focus it and press Enter, to see the supporting figure, product and provenance. Press Escape to close the card and return to the phrase. These source values are recorded with the answer; they do not update when today's stock changes. An answer can still include a **Figures cited** disclosure when its evidence is grouped by product. A phrase without a source control has no inline citation. ## From conversation to action Twelfth can help organise and explain the work, and it can propose a task or a decision. What it proposes is **not committed**. It lands in [Triage](/triage/) for you to review, adjust and commit, with a link back to the conversation that produced it. ::: callout note "Recommendations remain yours" The assistant helps you think and draft. Anything that changes price, stock, or orders still passes through the [decision pipeline](/pipeline/), where you commit it deliberately. ::: ## Taking an answer somewhere else Every turn carries an options menu beside its **You** / **Twelfth** byline: - **Copy link to this message**: a link that opens the conversation and scrolls to that exact turn. Copying a link does not grant access: a colleague can follow it only if the conversation has been shared with them or their remit, or the workspace allows link sharing. Arriving on one flashes the message it points at. - **Copy message text**: the answer on its own, without the surrounding chrome. - **Open this message**: jumps to the full-page conversation at that turn. Shown when you are reading the chat somewhere else, such as the drawer. Tables inside an answer have their own menu in the top-right corner: - **Copy for spreadsheet**: tab-separated text, which Excel and Google Sheets split into columns when you paste. - **Download CSV**: the same table as a `.csv` file. ::: callout note "Figures leave as data" A cell a spreadsheet would run as a formula is exported as text, so a table built from an uploaded supplier sheet or a scraped page cannot execute when you open it. ::: ## Sharing a standalone chat The person who started a standalone chat can choose **Share** from the conversation header. What they can choose depends on the workspace's [chat-sharing policy](/settings/workspace/#chat-sharing): - **Private**: only the person who started the chat can open it. - **Workspace link**: any active member of the same workspace who has the link can read it. The chat is unlisted, so it does not appear in other people's chat history. - **Specific people or remits**: selected people and everyone currently assigned to a selected remit can read it. These recipients see the conversation in chat history with a **Shared** badge and can use the **Shared with me** filter. A shared chat is read-only for recipients. They can see the whole live conversation, including past and future messages, attachments, and working traces, but only the creator can continue it or change a proposal. A category, product, supplier, or other badge records what the conversation is about; it never grants access. Remit sharing follows current remit assignments, so access changes when the workspace changes who owns that remit. ::: callout warning "Changing the workspace policy revokes existing shares" When an owner or admin changes the workspace's chat-sharing policy, every shared standalone chat becomes private and its previous recipients are removed. Chat creators can share again under the new policy. ::: ## Finding past chats **Chats** in the left rail lists every conversation you have started, including drafts, plus conversations explicitly shared with you or one of your remits. Open one to pick up where you left off; a shared conversation opens read-only. Link-shared conversations stay out of the list and open only from their link. Use the three-dot menu at the top right of a chat, or hover over its row in the inner sidebar and open the three-dot menu, to **Archive chat**. Archiving hides it from your history and keeps its messages and sharing intact; it only affects your own list. Choose **Archived** above the history to find archived chats, then open a chat’s three-dot menu and choose **Restore chat**. ## The work assistant drawer The right-hand drawer follows you across the app with three tabs: - **AI chat**: ask about the current page or your work. - **Docs**: the documentation that maps to the page you are on. - **Support**: send feedback, optionally with the current page and a screenshot. On a full-page chat the conversation on screen **is** the chat, so the drawer drops its **AI chat** tab there and keeps Docs and Support. The AI button in the header takes you to the conversation you are already reading rather than opening a second one beside it. ## Connecting an external assistant Owners and admins can also connect a compatible external assistant (Claude, ChatGPT, and others) to the workspace over a read-only connection. See [AI and agents](/settings/ai-and-agents/). ## Related - [How work flows through Twelfth](/pipeline/) - [Working in Triage](/triage/) - [Workspace chat-sharing policy](/settings/workspace/#chat-sharing) - [AI and agents](/settings/ai-and-agents/) --- ## [Your daily briefing](https://twelfth.ai/docs/briefing/) --- title: Your daily briefing description: "The morning read on your commercial book: what changed overnight, what Twelfth surfaced into Triage, and what needs your attention today." lastmod: 2026-10-06 --- # Your daily briefing The **briefing** is your morning read on your commercial book: what changed overnight, what Twelfth has surfaced into [Triage](/triage/), and what is worth your attention today. Read the summary on **Home**, or open **Briefing** from the global search (**⌘K** / **Ctrl K**) for the full read. ## What it covers - the decisions ready for you today, - signals that crossed a guardrail overnight, - promotions approaching a commitment date, and - a portfolio and category read (in the deeper weekly brief). ## Delivery and timing The workspace sets a starting point for everyone: the delivery time, the channel (email, in-app, or both), and whether a longer **Monday deep brief** goes out. Owners and admins set these in [Briefings & alerts](/settings/briefings-and-alerts/). You can override the delivery for yourself in [Notifications](/settings/notifications/) without changing anyone else's. Change when your brief arrives, where it is delivered, or turn the deep brief on or off. ::: callout tip "Read, then act" The briefing points you at the work. You do the work in [Triage](/triage/). ::: ## Related - [Notification preferences](/settings/notifications/) - [Briefings & alerts](/settings/briefings-and-alerts/) - [Working in Triage](/triage/) --- ## [The Decisions log](https://twelfth.ai/docs/decisions/) --- title: The Decisions log description: A permanent, timestamped record of every decision you have committed, and how each sat against what was recommended. lastmod: 2026-10-06 --- # The Decisions log **Decisions** is the end of the [decision pipeline](/pipeline/): the permanent ledger of what your team has committed. When a decision is recorded out of a project's [Pending](/pending/) stage, it lands here as a timestamped entry that cannot be edited, only added to. Open **Decisions** from the left rail. The **Flow** view on the same page maps the pipeline itself (see [Reading the flow view](/overview/)). ## What each entry records Every entry captures both sides of the call: - **What you committed:** the final quantity, value, or change you decided on. - **What was recommended:** the engine's original figure, kept alongside yours. Holding both means anyone can see where a human call differed from the recommendation, and by how much. The log records the commercial judgement as well as the outcome. ## Finding a decision Decisions are shown as a timeline, grouped by period with a running count on each heading, newest first. Search by title, product, SKU, or supplier to narrow the list, open any entry for its full detail, or export the record. When nothing matches you'll see *"No decisions match"*; a brand-new workspace shows *"No decisions recorded yet"* until the first decision is committed. ## Why it matters The Decisions log is the audit trail for commercial policy: - **Accountability:** who committed what, and when. - **Learning:** where recommendations were consistently adjusted, so the guardrails and the engine can be tuned. - **Continuity:** a new team member can read the recent record to understand how the team decides. ::: callout note "Read-only by design" You cannot change a logged decision. History is fixed; you add to it by recording more decisions out of a project's [Triage](/triage/) and [Pending](/pending/) stages. ::: ## Recall: asking what was decided, and why In a workspace with **Decision recall** turned on, the record can be read back without opening the log. Twelfth keeps the rationale, any reason for going against the recommendation, and the figures as they stood when each decision was committed, and several places read them: - **The assistant.** Ask *"What did we decide on Maison Aurele last Christmas, and why?"* in the chat drawer, or in Teams, Slack or Google Chat. For a named season it reads your trading calendar for the dates first; if there is none, it asks which half-year you mean rather than guessing. The answer is a dated list: what was decided, who recorded it, their rationale quoted in their own words, the lines that went against the recommendation and why, any negotiation outcome, and a link to each entry. - **The supplier record.** A **Decisions** tab beside **Activity** on each supplier or brand lists the same decisions over the last 12 months, newest first. The season picker switches to a named period from your trading calendar, or to the previous 12 months. - **Your own AI tools.** Over [MCP](/settings/ai-and-agents/mcp/), `recall_decisions` is a read-only tool. A workspace key reads the whole business; a person connected with their own sign-in reads their remits, exactly as in the app. What you can see matches the log: a buyer reads the decisions in their own remits, and an answer scoped that way says *"in your remits"*, so a short or empty answer never suggests nothing was decided elsewhere. Negotiation outcomes (agreed, or walked away and why) come from supplier negotiation projects you can open. ::: callout warning "What was decided, not whether it worked" Recall reads what was decided and why. It does not read outcomes: Twelfth has not yet measured whether a past decision paid off, so no answer says it did, and every answer and the Decisions tab say so. Ask about current trading and you get current trading, labelled as such, not as the result of a decision. ::: Recall starts at your workspace's first committed decision. Decisions made before Twelfth, in spreadsheets or elsewhere, are not imported. ## Related - [How work flows through Twelfth](/pipeline/) - [Projects](/projects/) - [The Pending stage](/pending/) - [Guardrails](/settings/guardrails/) --- ## [Price changes](https://twelfth.ai/docs/decisions/price/) --- title: Price changes description: Review and commit the price recommendations Twelfth surfaces in Triage, and see how your committed price compares to what was recommended. lastmod: 2026-10-06 --- # Price changes A **price** decision changes the price on one or more lines. Price recommendations are one of the decision types that flow through the [pipeline](/pipeline/): Twelfth surfaces them in [Triage](/triage/), you commit them, and they wait in [Pending](/pending/) until the change is pushed to your operational system. ## What Twelfth recommends The engine surfaces a price when it has drifted from where it should sit: margin under pressure, a competitor move, a cost change flowing through, or a line sitting outside its category rules. Each recommendation shows the **recommended price** next to the current one, with the reasoning and evidence behind it. ## Reviewing a price change 1. Open the item in **Triage** to see the recommended price and why it changed. 2. Adjust the price where you know something the engine does not, such as a supplier agreement, a planned promotion or a positioning call. 3. **Commit** the change. It moves to Pending, grouped under the **Price** type. ## Guardrails Price decisions respect your [workspace guardrails](/settings/guardrails/). A change that would take a line below the **category gross-profit floor**, or a value above your **authority limit**, is held for review or sent to a manager for sign-off instead of moving ahead. ::: callout warning "Nothing changes until it is raised" Committing a price decision records your intent. The price itself changes only when the decision is raised out of [Pending](/pending/) into your operational system. ::: ## Related - [How work flows through Twelfth](/pipeline/) - [The Pending queue](/pending/) - [Guardrails](/settings/guardrails/) --- ## [Purchase orders](https://twelfth.ai/docs/decisions/purchase-orders/) --- title: Purchase orders description: "Review and commit buy recommendations: the replenishment orders Twelfth surfaces from lead times, cover and demand before a line runs short." lastmod: 2026-10-06 --- # Purchase orders A **purchase order** (PO) decision commits a buy: a replenishment order to a supplier. POs are one of the decision types that flow through the [pipeline](/pipeline/): Twelfth surfaces them in [Triage](/triage/), you commit the order, and it waits in [Pending](/pending/) until it is raised with the supplier. ## What Twelfth recommends The engine surfaces a buy when a line is running short before its next delivery, taking supplier **lead times** into account (set overrides in [Suppliers](/settings/suppliers/)). Each recommendation shows the **recommended order quantity** and the demand and cover behind it. ## Reviewing a purchase order 1. Open the item in **Triage** to see the recommended quantity and the reasoning. 2. Adjust the quantity where you know more than the engine, such as a supplier minimum, a promotion, a range change or a case-pack constraint. 3. **Commit** the order. It moves to Pending, grouped under the **Purchase order** type, ready to raise. ::: callout tip "Adjusted quantities are recorded" When you commit a quantity that differs from the recommendation, Twelfth keeps both, so the [Decisions log](/decisions/) shows exactly where your judgement changed the order. ::: ## Guardrails Purchase-order decisions respect your [workspace guardrails](/settings/guardrails/). An order above your **authority limit** is sent to a manager for sign-off before it can proceed. ## Related - [How work flows through Twelfth](/pipeline/) - [Supplier lead times](/settings/suppliers/) - [The Pending queue](/pending/) --- ## [Stock transfers](https://twelfth.ai/docs/decisions/transfers/) --- title: Stock transfers description: Review and commit recommendations to move stock between locations before it becomes a shortage or an overstock. lastmod: 2026-10-06 --- # Stock transfers A **transfer** decision moves stock between locations. Transfers are one of the decision types that flow through the [pipeline](/pipeline/): Twelfth surfaces them in [Triage](/triage/), you commit the move, and it waits in [Pending](/pending/) until the transfer is booked. ## What Twelfth recommends The engine surfaces a transfer when stock is in the wrong place: one location is short on a line while another is long on it. Rebalancing avoids a buy at one site and a markdown at another. Each recommendation shows the **recommended quantity, source, and destination**, with the cover position at each end. ## Reviewing a transfer 1. Open the item in **Triage** to see the recommended move and the cover on both sides. 2. Adjust the quantity or lane where you know more, for example a location that is about to receive a delivery or a lane that is impractical this week. 3. **Commit** the transfer. It moves to Pending, grouped under the **Transfer** type, ready to book. ::: callout note "Multi-location moves" A single recommendation can span several source or destination locations. Review each leg before committing so the whole move reflects what you intend. ::: ## One lane, several buyers A transfer item is **one screen per lane**. Everything moving from the warehouse to a given store is in one place, instead of the same move being split across a dozen items you have to visit in turn. This makes a lane the one kind of item that belongs to no single buyer, so the grid **sections it by whose lines they are**. There is one headed list per remit, showing the people who hold it, how many lines it holds, how many you have decided, and the units it adds up to. Collapse the sections you are not working on. ## Narrowing a long list The **Display** menu offers a filter for every categorical column the item spans: remit, supplier, category, and the lane's own From and To where a lane holds more than one. Each value shows how many lines sit behind it, counted against whatever else you have already set. Anything currently narrowing the table is listed as a chip beneath the toolbar, and removing a chip undoes that filter. **Group by**, in the same menu, changes which of those the sections split on, or turns sectioning off for one flat list. An export carries the split as its first column, so a sectioned screen does not flatten into a pool in a spreadsheet. Sign-off works the same way. Each buyer commits their own lines, the lane stays open until the last of them has, and the item records one decision per person instead of one in total. ::: callout note "Seeing only your own lines" If you administer the workspace you read every remit, so a lane opens with everybody's lines on it. Switch the header control from **Whole business** to **My remit** to narrow every view (the lane, Suppliers, a category's SKUs) to the remits assigned to you, and to sign off only your own lines. If the control says there is no remit assigned to you, ask an admin to set your range in [Remits](/people/); until then there is nothing to narrow to. ::: ## Related - [How work flows through Twelfth](/pipeline/) - [The Pending queue](/pending/) - [Purchase orders](/decisions/purchase-orders/) --- ## [Watch list](https://twelfth.ai/docs/decisions/watch-list/) --- title: Watch list description: The watch list holds items you are monitoring without an action due yet, kept in view so you are ready to act when they move. lastmod: 2026-10-06 --- # Watch list The **watch list** holds items you are monitoring without an action due yet. It is one of the decision types in the [pipeline](/pipeline/), but unlike a price change or a buy it commits attention rather than an order. You are choosing to keep a line in view until something changes. ## When to use it Add a line to the watch list when: - it is close to a threshold but not there yet, - you want to see how a recent change plays out before acting, - a supplier or promotion situation is developing, or - you want a teammate to keep an eye on it too. ## How it flows Watched items sit in [Pending](/pending/) under the **Watch list** type. There is no order to raise. Instead, Twelfth keeps surfacing the item in [Triage](/triage/) when the signal you are watching for arrives, at which point you can commit a real decision (a price change, a buy, a transfer) or drop it from the list. ::: callout tip "Watching is not deciding" Nothing on the watch list affects price, stock, or orders. It is a way to stay ready without committing to an action before you need to. ::: ## Related - [How work flows through Twelfth](/pipeline/) - [Working in Triage](/triage/) - [The Pending queue](/pending/) --- ## [API compatibility](https://twelfth.ai/docs/developers/compatibility/) --- title: API compatibility description: How Twelfth evolves public APIs without version numbers in URL paths or breaking existing integrations. lastmod: 2026-10-19 --- # API compatibility Twelfth public APIs use stable, unversioned URL paths. A path describes a resource or capability, not a release number. ## What Twelfth preserves Once an operation is public, Twelfth does not: - remove or rename its path, method, request field, response field or documented error code; - make an optional input required; - change a field to an incompatible type or narrow the values it accepts; - silently change a write's meaning, permission boundary or idempotency behaviour; or - reuse an identifier for a different resource. Deprecated contract elements remain supported. An exceptional security or legal requirement may make continued operation impossible; Twelfth will publish the impact and use HTTP `Deprecation` and `Sunset` headers where advance signalling is practical. ## Additive changes Twelfth may add: - optional response fields; - new resources and operations; - new optional request fields; and - new event types. Clients should ignore response fields they do not understand. Values intended to grow are documented as extensible strings rather than closed enums, because adding a value to a closed enum can break generated clients. If a capability needs genuinely different semantics, Twelfth publishes a new, clearly named resource or operation and keeps the existing one working. It does not create `/v2`, `/v3` or other version-number paths. ## Building a resilient client - Read the machine-readable `code` on `application/problem+json` errors rather than matching message text. - Ignore unknown response fields. - Follow `Retry-After` and `RateLimit-*` headers. - Deduplicate webhook deliveries by `webhook-id` and make mutation retries idempotent. - Use the current [OpenAPI document](https://twelfth.ai/openapi.json) as the transport contract. For help with a proposed integration, email [hello@twelfth.ai](mailto:hello@twelfth.ai). --- ## [Developer API](https://twelfth.ai/docs/developers/) --- title: Developer API description: Connect server-side software to Twelfth's small REST API with a workspace key and stable, unversioned resource paths. lastmod: 2026-10-19 --- # Developer API Twelfth's public REST API starts with two useful reads: ```text GET https://api.twelfth.ai/workspace GET https://api.twelfth.ai/tasks ``` The first returns the workspace identity and operating defaults attached to the key. The second returns the workspace's current open, unsnoozed tasks. More resources will appear here only when their public contracts and permissions are ready. Twelfth's browser `/api/...` routes are private application routes and are **not** supported for customer integrations. ## Authentication Create a **workspace API key** under **Settings → AI & agents → API keys**. A key belongs to the workspace, not a person. Give each server, script or automation a separate labelled key so it can be audited and revoked independently. Send the key as a bearer token: ```http Authorization: Bearer ``` Keys are shown once and stored hashed. This API is for server-side use: do not put a key in source control, browser code, URLs or workflow names. ## Machine-readable contract The [OpenAPI 3.1 document](https://twelfth.ai/openapi.json) is the canonical machine-readable contract. Browse the same contract in the [API reference](/developers/reference/). An operation absent from that document is not a supported external operation. Errors use `application/problem+json` (RFC 9457) with a stable machine-readable `code` and recovery `hint`. Every response advertises its rate-limit policy; successful responses include the remaining quota and reset time. Rate-limited requests return `429` and `Retry-After`. ## Paths and compatibility Twelfth uses stable, unversioned resource paths. It does not put API version numbers in URLs and evolves published operations without breaking existing callers. See [API compatibility](/developers/compatibility/) for the rules clients and Twelfth both follow. ## Example ```sh curl https://api.twelfth.ai/workspace \ --header "Authorization: Bearer $TWELFTH_API_KEY" ``` The response is `{ "workspace": { ... } }`. Use its timezone, currency and country when interpreting dates and money from future resources. ## Related - [API reference](/developers/reference/) — endpoint index - [`GET /workspace`](/developers/reference/workspace/) — workspace identity and defaults - [`GET /tasks`](/developers/reference/tasks/) — current tasks - [API keys](/settings/ai-and-agents/api-keys/) — create and revoke workspace keys - [API compatibility](/developers/compatibility/) — stability and deprecation rules - [Webhook destinations](/settings/integrations/destinations/webhooks/) — deliver committed decisions to your systems --- ## [API reference](https://twelfth.ai/docs/developers/reference/) --- title: API reference description: Twelfth's small read-only REST API, with one focused page per endpoint and a canonical OpenAPI contract for agents. lastmod: 2026-10-19 --- # API reference Twelfth's public API is deliberately small and read-only. Each endpoint has a focused page with generated request, response, schema, authentication, and error details. ::: callout note "One contract, two useful forms" People can browse one page per endpoint. Software and agents should read the canonical [OpenAPI 3.1 JSON](https://twelfth.ai/openapi.json) directly. The `info.version` value required by OpenAPI describes the contract document; Twelfth does not put version numbers in URL paths. ::: ## For agents Use these sources in order: 1. [OpenAPI JSON](https://twelfth.ai/openapi.json) for operations, schemas, authentication and stable error shapes. 2. [Developer API](/developers/) for credential choice and the boundary between public and internal routes. 3. [API compatibility](/developers/compatibility/) before generating a client or proposing a contract change. 4. [`llms.txt`](https://twelfth.ai/docs/llms.txt), [`llms-full.txt`](https://twelfth.ai/docs/llms-full.txt) or the [OKF bundle](https://twelfth.ai/docs/okf/) for the wider product and workflow context behind an operation. Do not infer customer API support from browser `/api/...` routes or examples in application code. If an operation is absent from the public OpenAPI document, it is not a supported external HTTP operation. ## Endpoints ::: card "Get workspace" icon:building-2 Read the workspace identity and its timezone, currency, and country defaults. [Open `GET /workspace`](/developers/reference/workspace/){.docmd-button} ::: ::: card "List current tasks" icon:list-checks Read up to 100 open, unsnoozed tasks across the workspace, ordered by due date. [Open `GET /tasks`](/developers/reference/tasks/){.docmd-button} ::: ## Need another read? Tell us the resource, fields, workflow, and expected request volume. Requests help decide which small, stable endpoint comes next. [Request an endpoint](mailto:hello@twelfth.ai?subject=Public%20API%20endpoint%20request&body=Resource%20or%20workflow%3A%0AFields%20needed%3A%0AExpected%20request%20volume%3A%0AWhat%20this%20will%20automate%3A){.docmd-button} --- ## [List current tasks](https://twelfth.ai/docs/developers/reference/tasks/) --- title: List current tasks description: Read the current open, unsnoozed tasks across a Twelfth workspace. lastmod: 2026-10-19 --- # List current tasks `GET /tasks` returns up to 100 current tasks across the workspace. **Current** means the task is open and is not snoozed into the future. Tasks with due dates come first, earliest due date first. Tasks without a due date follow them. Tasks with the same due date retain creation order. The endpoint is read-only and does not return completed, cancelled, or currently snoozed tasks. ```sh curl https://api.twelfth.ai/tasks \ --header "Authorization: Bearer $TWELFTH_API_KEY" ``` ```openapi openapi-tasks.json ``` ## Need another task field or view? Tell us whether you need another field, completed tasks, filters, or pagination, and what the integration will do with it. [Request a task API capability](mailto:hello@twelfth.ai?subject=Public%20API%20tasks%20request&body=Field%2C%20filter%2C%20or%20view%20needed%3A%0AWhat%20this%20will%20automate%3A%0AExpected%20request%20volume%3A){.docmd-button} [All endpoints](/developers/reference/) · [API compatibility](/developers/compatibility/) --- ## [Get workspace](https://twelfth.ai/docs/developers/reference/workspace/) --- title: Get workspace description: Read the identity and operating defaults of the workspace attached to a Twelfth API key. lastmod: 2026-10-19 --- # Get workspace `GET /workspace` returns the workspace identity and the timezone, currency, and country defaults to use when interpreting dates and money from other resources. ```sh curl https://api.twelfth.ai/workspace \ --header "Authorization: Bearer $TWELFTH_API_KEY" ``` ```openapi openapi-workspace.json ``` ## Need another workspace field? [Request a workspace field](mailto:hello@twelfth.ai?subject=Public%20API%20workspace%20field%20request&body=Field%20needed%3A%0AWhat%20it%20represents%3A%0AWhat%20this%20will%20automate%3A){.docmd-button} [All endpoints](/developers/reference/) · [API compatibility](/developers/compatibility/) --- ## [Twelfth for Excel](https://twelfth.ai/docs/extensions/excel/) --- title: Twelfth for Excel description: Twelfth's products, pricing, tasks and projects as Excel tables you can refresh; a chat beside the sheet whose charts land in the workbook as Excel charts. lastmod: 2026-10-08 --- # Twelfth for Excel **Twelfth for Excel** brings Twelfth into the workbook you're already in. It adds **Twelfth** to the **Home** tab, which opens a pane beside the sheet. It works in Excel on Windows, Mac and the web. ## Install You need a Twelfth workspace. New to Twelfth? [Book a demo](https://twelfth.ai/book-a-demo). ### For your whole team (Microsoft 365 admin) 1. In the [Microsoft 365 admin centre](https://admin.microsoft.com), go to **Settings → Integrated apps** and select **Upload custom apps**. 2. Choose **Office Add-in**, then **Provide link to the manifest file**, and enter `https://twelfth.ai/office/manifest.xml`. Select **Validate**, then **Next**. 3. Choose who gets it: everyone, or specific people or groups. Select **Next**, accept the permissions, then **Finish deployment**. **Twelfth** then appears on the **Home** tab in Excel for those people, on Windows, Mac and the web. It can take a few hours to show up; signing out of Office and back in can speed it up. Updates arrive by themselves, so there's nothing to reinstall. ### Just for you If your organisation lets people add their own add-ins, you can try it before your admin rolls it out. Save [the manifest](https://twelfth.ai/office/manifest.xml) as a file, then: - **Excel on the web:** **Home → Add-ins → More add-ins → My add-ins → Upload my add-in**, and choose the file. - **Excel on Windows:** **Home → Add-ins → More add-ins → My add-ins → Upload my add-in** (or ask your admin, where uploads are turned off). Twelfth for Excel will also be in Microsoft Marketplace; this page will link to it once it's listed. ## Sign in 1. Select **Twelfth** on the **Home** tab. 2. Select **Approve in your browser**. Twelfth opens in the browser you already use, so you don't sign in again. 3. Choose the workspace and what the add-in may read. To manage tasks from Excel, turn on **Allow changes** (see [Extensions](/extensions/#extensions-reading-and-allow-changes)). Select **Allow access**. 4. Go back to Excel. The pane is ready. If your Microsoft 365 account is linked to Twelfth (you sign in with **Continue with Microsoft**), Excel signs you in by itself on your other devices after the first time. **Sign in here instead** uses Excel's own sign-in window when the browser isn't an option. ## Add **Add** puts Twelfth data in the workbook as an Excel table, on a new sheet. To put it at the selected cell instead, change this in the pane's **Settings → General**. Pick a kind of data, set its filters, then select **Add**: - **Products**: your range. Search by name, brand or SKU; the filter button narrows by category, remit and supplier. Choose the order (lowest cover, fastest selling, most units, lowest GP%, most open findings and more) and how many rows: 100, 250, 500 or 1,000. - **Pricing**: a tracked set, one row per product. It shows your price and average, then each competitor's price, average, price index (100 is parity) and stock. Choose the basis first (last seen, or a 4, 8 or 12-week average), then select the set. - **Tasks**: open tasks, yours or everyone's, filtered by due date and remit, with links back to Twelfth. - **Projects**: live, closed, archived or all, with stage, owner, open and overdue tasks, and go-live. - **Fill**: figures beside a column of your own SKUs (see below). Figures are numbers, so they sum, average, chart and pivot. GP% is a real percentage. Prices are in your workspace's currency, which the column header names. A figure Twelfth hasn't measured is an empty cell, never 0. Each row links back to Twelfth. Progress shows on the button you selected, and the result appears underneath, with **Show** to jump to the table. Hover over a control to see what it does. ![Add → Products: search, filters, order and row count](/assets/images/excel-add-products.png){width=300} ![Add → Pricing: the basis, then the tracked sets you can add](/assets/images/excel-add-pricing.png){width=300} ### Fill figures beside SKUs 1. Select a column of SKUs in your sheet. 2. On **Fill**, choose the columns: name, supplier, stock, on order, cover, velocity, units for the last 4 weeks and year, GP%, price or open findings. 3. Select **Fill beside selection**. The figures go in the columns to the right, with headers above if there's room. A SKU Twelfth can't read for you shows **Not found in Twelfth**. The pane asks before it writes over cells that already have data. ![Fill asking before it writes over 12 cells that already have data](/assets/images/excel-fill.png){width=340} ### Mark tasks done from the sheet With **Allow changes** on, select rows in a tasks table from Twelfth, then select **Mark selected done** on **Add → Tasks**. Twelfth closes those tasks, then refreshes the table. Tasks tables added before 2026-10-06 have no task id column, so add the table again first. ![Add → Tasks: filters, the added table, and Mark selected done](/assets/images/excel-add-tasks.png){width=340} ## Workbook **Workbook** lists every table in this workbook that came from Twelfth; the tab shows how many. Select a table to go to it. **Refresh** reads the current version into the same table, in the same place, with the same filters. Pivot tables, charts and formulas that point at it keep working. **Refresh all** refreshes every one. The list is saved in the workbook, so it's there when you or a colleague open the file again. ![Workbook: two linked tables, each with Refresh, and Refresh all](/assets/images/excel-workbook.png){width=340} ## Today The **Today** tab shows what's overdue, due today and due this week, in your workspace's calendar. - **Search** looks through all your open tasks. - With **Allow changes** on, tick the circle to **mark a task done**, or use the clock to **snooze** it until tomorrow or next week. - **Add all open tasks to a sheet** puts them in the workbook as a table. - **Create a task in Twelfth** (with **Allow changes** on) makes a task for you, with the selected cells as its details. ![Today: overdue, due today and this week, with search, mark done and snooze](/assets/images/excel-today.png){width=340} ## Ask **Ask**, at the top right of the pane, is a Twelfth chat beside the sheet. Select cells first and they go with your question; remove the chip to leave them out. Answers come from your Twelfth workspace, tables appear in brief in the pane, and every conversation is saved in your Twelfth chat history. It is one chat in two places. **Open this chat in Twelfth** carries it on in the browser, and a question typed in the browser (or in Slack, or anywhere else Twelfth answers) appears in the pane as it is answered, marked **Asked in Twelfth**; while it runs, the pane waits for it, with **Stop** to hand. A question typed in the pane streams in the browser the same way. ![Ask: an answer about the selected cells, with a table in brief](/assets/images/excel-ask.png){width=340} ### Charts in the workbook Ask for a chart and it lands in your workbook, not in the pane: a new sheet with the rows as a table and an Excel chart drawn from them, the moment the answer arrives. The card under the answer says which sheet, with **Show**, **Undo** (removes the sheet) and **Save to chat**. Bar, line and scatter charts come through as those Excel charts; a matrix (the four-quadrant portfolio read, see [the assistant](/assistant/#tables-and-charts)) comes through as a scatter, with the quadrants named on the card and in the answer, since Excel has no quadrant chart. Because the chart is Excel's own, it stays live when you edit the cells, and it pivots, formats and copies like any chart you made yourself. A chart in an answer to a question asked in the browser is not added unasked; its card offers **Add to workbook**. ### Charts from the workbook The chart button in the composer attaches whatever chart is selected in the workbook, yours or one Twelfth placed. Excel gives the figures it plots (for column, bar, line and scatter charts, in Excel versions with the newer chart API) and a picture of it; both go with your question, or **Save to chat** does the same for a chart Twelfth just placed. In the browser the chart is drawn live from the figures, with Excel's picture one click away, and it is listed on **Artefacts** as an Excel chart linked to the turn. If you type nothing, the question is "What does this chart show?". ## Settings The gear in the pane opens: - **General**: where new tables go, whether Today shows your tasks or everyone's, whether it refreshes every 15 minutes, and **Privacy**: whether the pane shares usage data with Twelfth. - **Appearance**: match Excel's light or dark theme in your Twelfth palettes (the default), match your Twelfth theme, or choose Light, Oatmeal, Dark, Midnight or Plum. - **Account**: the workspace, who you're signed in as, the version, **Manage in Twelfth** and **Sign out**. ## Privacy and access The add-in reads only through your own connection: your workspace, your role, your remits. It stores its sign-in in Excel's add-in storage on that device, and the table list in the workbook. End it any time in **Settings → AI & agents** in Twelfth. The pane **shares usage data** with Twelfth: which features you use, errors the pane hits, and a replay of the pane itself, so we can see what works and fix what doesn't. Your sheets and Twelfth's answers are never included, and anything you type is hidden in the replay. Turn it off any time in **Settings → Privacy** on that device; see the [Privacy Policy](https://twelfth.ai/legals/privacy). ## Related - [Extensions](/extensions/): how extensions connect, and **Allow changes** - [Generic MCP](/settings/ai-and-agents/mcp/) --- ## [Extensions](https://twelfth.ai/docs/extensions/) --- title: Extensions description: Twelfth inside the tools your team already uses, such as Excel and Raycast. How extensions connect, what they can read, and how "Allow changes" works. lastmod: 2026-10-16 --- # Extensions Extensions put Twelfth inside the tools your team already works in, so a buyer can use Twelfth's figures and tasks without switching windows. | Extension | Where it runs | What it does | | --- | --- | --- | | [Twelfth for Excel](/extensions/excel/) | [Excel on Windows, Mac and the web](/extensions/excel/#twelfth-for-excel-install) | [Products, pricing, tasks and projects as Excel tables you can refresh; figures beside a column of SKUs; today's tasks; a Twelfth chat about the selected cells, shared live with the browser, whose charts land in the workbook as Excel charts](/extensions/excel/#twelfth-for-excel-add) | | [Twelfth for Raycast](/extensions/raycast/) | [Raycast on Mac](/extensions/raycast/#twelfth-for-raycast-install) | [Today's actions, product search and projects from the launcher and menu bar; Raycast AI; a quick way to ask Twelfth](/extensions/raycast/#twelfth-for-raycast-commands). Read-only. In review for the Raycast Store | ## How an extension connects Every extension uses the same connection as an AI assistant: Twelfth's [MCP endpoint](/settings/ai-and-agents/mcp/), signed in as you. 1. You sign in to Twelfth and choose **one workspace**. 2. You choose what the extension may read. It reads as you: your role, your remits, nothing outside them. 3. The connection appears under **Settings → AI & agents**, next to your assistants. End it there at any time; it stops at once. An extension never sees your password. It keeps a token that renews itself, so you sign in once per device. ## Reading, and "Allow changes" A new connection only **reads**. When you connect, the consent page also offers **Allow changes**. It is off unless you turn it on. With **Allow changes** on, the connection can use the write tools you approve at consent, acting as you: - **Mark a task done** - **Snooze a task** until tomorrow or next week - **Create a task** for yourself - **Run one of your own routines** - **Change workspace chat defaults**, for Twelfth staff with workspace owner/admin access and required MFA Figures, prices, orders, suppliers, remits and other settings stay read-only. Runtime controls remain staff-only even for older grants. Eligible staff must reconnect and approve the updated grant before chat-default changes are available. The same rules as the app apply: for example, a task with order lines still needs an outcome in Twelfth. Every change is recorded against the connection. To turn it on later, connect again and switch it on: in Excel, use any **Allow changes** button. Twelfth for Raycast only reads, so it makes no changes either way. To turn it off, end the connection in **Settings → AI & agents** and connect again without it. **Settings → AI & agents** shows each connection as **read-only** or **can make changes**. Workspace API keys never make changes. ## Related - [Twelfth for Excel](/extensions/excel/) - [Twelfth for Raycast](/extensions/raycast/) - [Generic MCP](/settings/ai-and-agents/mcp/): the endpoint, the tools, and connecting an assistant - [AI & agents](/settings/ai-and-agents/) --- ## [Twelfth for Raycast](https://twelfth.ai/docs/extensions/raycast/) --- title: Twelfth for Raycast description: Today's actions, product search, projects and a quick way to ask Twelfth, from the Raycast launcher and menu bar on your Mac. lastmod: 2026-10-06 --- # Twelfth for Raycast **Twelfth for Raycast** puts your Twelfth workspace in the [Raycast](https://www.raycast.com) launcher on your Mac: what to do today, your range, your projects, and a quick way to start a Twelfth chat. It only reads; it can't change anything in Twelfth. ## Install Twelfth for Raycast is in review for the Raycast Store. When it is listed, open Raycast, search the **Store** for **Twelfth** and select **Install**. ## Sign in 1. Run any Twelfth command. Twelfth opens in your browser. 2. Sign in, then choose the workspace and what the extension may read. Select **Allow access**. 3. Go back to Raycast. The command loads. You stay signed in on that Mac. The extension sees only what you see in the app: your role, your remits, your projects. ### Sign in with a workspace API key A workspace owner or admin can paste a **workspace API key** (`twelfth_mcp_…`) into the extension's preferences instead of signing in. Create one in **Settings → AI & agents**. A key reads the whole workspace rather than one person's remits, so **Mine & Unassigned** isn't available with it. ## Commands | Command | What it does | | --- | --- | | [**What Should I Do Today**](#twelfth-for-raycast-commands-what-should-i-do-today) | Your open actions, grouped as overdue, due today, this week, next week and later, in your workspace's calendar | | [**Twelfth Today**](#twelfth-for-raycast-commands-twelfth-today) | A menu bar count of your overdue and due-today actions | | [**Search Products**](#twelfth-for-raycast-commands-search-products) | Your range, with stock, cover, sales, GP% and open findings | | [**Projects**](#twelfth-for-raycast-commands-projects) | Projects with their stage and open and overdue tasks | | [**Ask Twelfth**](#twelfth-for-raycast-commands-ask-twelfth) | Opens a Twelfth chat with your question filled in | ![The five Twelfth commands in the Raycast launcher](/assets/images/raycast-commands.png) ### What Should I Do Today Your open actions, overdue first. The dropdown switches between **Mine & Unassigned** and **Everyone's**. For the selected action: ![What Should I Do Today: open actions grouped by when they're due, with assignee and due date](/assets/images/raycast-today.png) - **Open in Twelfth** (`↵`) - Show the detail: due date, assignee, remit and where it came from (`⌘D`) - **Ask Twelfth About This** (`⌘⇧K`) - **Copy Title**, **Copy Link** and **Open All Tasks** ### Twelfth Today A menu bar item that shows how many of your actions (yours and unassigned) are overdue or due today. It turns red when something is overdue and refreshes every 15 minutes. Select an action to open it in Twelfth. ### Search Products Search by name, SKU, brand or supplier. The dropdown sorts by **Most Open Findings**, **Lowest Cover**, **Fastest Selling**, **Longest Since Sold**, **Lowest GP%** or **Name**. `⌘D` shows the detail: SKU, category, supplier, remit, stock on hand, on order, days of cover, velocity, units for the last 4 weeks and year, days since sold, price and GP%. Prices are in your workspace's currency. A figure Twelfth hasn't measured shows as **—**, never 0. **Ask Twelfth About This Product** (`⌘⇧K`) starts a chat about it. ![Search Products sorted by Most Open Findings, with the detail panel open](/assets/images/raycast-search-products.png) ### Projects Live, closed, archived or all projects, with stage, owner, and open and overdue tasks. **Ask Twelfth for a Status Update** (`⌘⇧K`) starts a chat about the selected project. ![Projects: live projects with workflow, open tasks and stage](/assets/images/raycast-projects.png) ### Ask Twelfth Type a question after the command and Twelfth opens in your browser with a new chat. It also works as a Raycast fallback command: type a question in the launcher, then pick **Ask Twelfth**. ## Raycast AI In Raycast AI, mention `@twelfth` to ask about the same data. For example: - `@twelfth what should I do today?` - `@twelfth which products have the lowest cover?` - `@twelfth which projects have overdue tasks?` Answers include a link to each action, product or project in Twelfth. ## Privacy and access The extension reads only through your own connection: your workspace, your role, your remits. It is read-only, so it can't mark tasks done or change anything else, even if you turned on **Allow changes** when you connected. Raycast keeps the sign-in on your Mac. End the connection any time in **Settings → AI & agents** in Twelfth. ## Related - [Extensions](/extensions/): how extensions connect - [Twelfth for Excel](/extensions/excel/) - [Generic MCP](/settings/ai-and-agents/mcp/) --- ## [Get started](https://twelfth.ai/docs/getting-started/) --- title: Get started description: "Set up a Twelfth workspace step by step: name it, invite your team, set shared defaults and connect your data, so everyone works from the same rules." lastmod: 2026-10-19 --- # Get started Twelfth helps commercial teams move from scattered signals to clear decisions and owned action. Start by setting the shared defaults your team will work from. 1. **Choose your workspace.** Open **Settings → Admin → [Workspace](/settings/workspace/)** to add a recognisable name and logo, and **Personal → [My workspaces](/settings/my-workspaces/)** to switch if you belong to more than one organisation. 2. **Set the team defaults.** In the **Business** group, set the timezone, currency, country and tax basis in [Regional & commercial](/settings/regional-and-commercial/), the commercial limits in [Guardrails](/settings/guardrails/), and briefing delivery and alerts in [Briefings & alerts](/settings/briefings-and-alerts/). 3. **Invite your team.** In **Admin → [Members](/settings/members/)**, invite colleagues as members or admins. They can sign in with their Microsoft work account, their Google account or email and password; see [Signing in](/signing-in/). Use domain access only if people with verified company email addresses should be able to join automatically. 4. **Protect access.** Ask everyone to set up two-factor authentication under **Personal → Account → [Security & access](/settings/security-and-access/)**. Owners and admins can require it for the whole workspace in [Workspace security](/settings/workspace-security/). 5. **Open Projects.** The daily sync opens a [project](/projects/) per supplier, remit and lane and fills it with the lines worth a look. **Settings → Business → [Projects](/settings/projects/)** decides which workflows people can start by hand and, for each workflow, rules such as who raises a supplier order. ## Explore Products Open **Products** for a summary of your range: product counts, products with open work, sellable units, recent sales and categories worth a closer look. Pricing workspaces also show market position and links to lines above or below market. Open a category, task or pricing signal to investigate; **All products** opens the full catalogue. The inner sidebar groups **Products**, **Pricing**, **Promotions** and saved views by type. **Pre-orders** appears only in The Gamesmen workspace. Owners and admins can choose **Create view**, pick a type and save its filters. Product views support search, categories, suppliers, remits and open-task filters; pricing views support categories, remits, competitors and selected lines; promotions views support project, supplier, period and decision state. Saved views stay scoped to the reader’s permitted products. In **Pricing**, use **Overview** for market position and competitor comparisons, or **Items** for a table with more room to scan your lines. Hover over or tap an own-price figure to inspect its exact amount, price basis and available history. Stock and sales totals come from the latest source snapshot, with the measurement count shown beside each total. A dash means the source has not measured a figure. Category cover counts use the category’s target or the workspace default. Pricing uses its own comparison coverage; uncounted lines are not zero-priced lines. ## Make it personal Each person can choose their own home view, notifications, briefing override, and display preferences. Those choices do not change the workspace defaults. ## Optional: connect an AI assistant Owners and admins can connect a compatible AI assistant from **Settings → Data & AI → AI & agents**, and let the team ask Twelfth where they already work from **Comms & chat** (Slack, Google Chat or Microsoft Teams). The AI connection is read-only and workspace-scoped. See [AI and agents](/settings/ai-and-agents/) and [Comms & chat](/settings/comms/). ::: callout tip "Tip" Start with the defaults and member access. You can refine notification and briefing preferences once the team has used Twelfth for a few days. ::: --- ## [Home](https://twelfth.ai/docs/home/) --- title: Home description: "How to read Home: the sales sentence and its comparisons, your projects, the routines timeline, your top tasks, and the bar that opens Twelfth AI." lastmod: 2026-10-19 --- # Home **Home** is the first page you see after signing in. It answers three questions: how your part of the business is trading, what has run while you were away, and what is waiting on you. It is a starting point rather than a working page: every section links through to the place where the work is done. If you are setting up a new workspace, start with [Get started](/getting-started/) instead. Top to bottom, Home shows: 1. A **greeting and one sentence** on your sales and the tasks waiting on you. 2. **Projects**, the projects in flight. 3. The **Ask about this workspace** bar, which opens [Twelfth AI](/assistant/). 4. **Routines**, a timeline of what has run and what runs next. 5. **Top tasks**, the work assigned to you, due first. 6. **Target risks**, only when a category is on course to miss its sales target. On a wide screen, Projects and the Ask bar take the left column, with Routines and Top tasks beside them. On a narrow screen they stack in the order above. ## The opening sentence Home opens with a greeting, then one sentence about your sales, for example: > Good morning, Sam. So far this week Gaming has done $48,210 inc GST — up 6.2% on the same days last year. 3 tasks are waiting on you today. ### Which sales, and over what period The figure is **sales** from your connected trading data, for the most recent week it holds. The words at the start tell you which period you are reading: | Lead | Period | | --- | --- | | **So far this week** | The current week, which has not finished yet. | | **In the week to** 19 Oct | The most recent finished week, ending on that date. | | **Over the four weeks to** 12 Oct | The last four finished weeks, when you have chosen that comparison. | | **Over the past year** | The past year, when your data has no weekly figures. | Beside the figure is its tax basis, such as "inc GST" or "ex GST". After it comes the change, **up** or **down** by a percentage. When there is nothing to compare against, the change is left out. If your workspace has not connected a sales data source yet, the sentence is left out and Home opens on the greeting and your tasks. ### What it is compared with By default the figure is compared with the same period a year earlier. While the week is still open, it is compared with the **same days last year**, not the whole week, so a Monday is not read as an 80% fall. When more than one comparison is available, the comparison phrase is underlined. Select it to choose another: | Option | Compares | | --- | --- | | **Same week last year** / **Same days last year** | This week with the same week, or the same days, a year ago. | | **The week before** | The finished week with the week before it. Only offered once the week has finished. | | **Four weeks to** 12 Oct | The last four finished weeks with the four weeks before them. Only offered when both four-week blocks are complete. | Your choice is remembered in this browser. If the comparison you chose is not available, for example because a new week has started, Home goes back to last year. ### The breakdown Hover over the figure for the detail behind it: the dates of the week and the date the data is up to, the same week last year, last week, the four-week block, and the split by remit, each with its change. The split lists up to eight remits and says how many more there are. Select the figure to open the trend in **Performance**. ### Whose sales The sentence names who the figure covers: - **One or two remits** are named, for example "Gaming" or "Gaming and Electrical". - **More than two** reads "your 3 remits", for example. Hover over it to see the list. - In the **All** view, it reads **your portfolio**, because the figure covers the whole business. ### Tasks waiting The sentence ends with how many tasks are assigned to you and still open: "**3 tasks** are waiting on you today." Select the count to open [Tasks](/tasks/). When there are none, it reads "No tasks are waiting on you today." ## Projects **Projects** lists up to six of the live [projects](/projects/) you can see. **See all** opens the full Projects page. With nothing open, it reads "No projects in flight." Each row shows: - the project's name, or the supplier's name and logo for a supplier project, with the remits or categories it covers; - a chip when an approval is waiting on you; - a chip such as "2 tasks past due" when tasks in the project are overdue, or how the project ended; - the next due date, when it has one; - its current stage, with a dot for each step, and its progress; - when it was last touched. Select a project's name to open it. ## Ask about this workspace Under Projects is a bar labelled **Ask about this workspace**. Select it to open Twelfth AI in a panel beside the page, with your workspace as the subject. You type in that panel, not on Home, and the panel stays open as you move to other pages. See [Twelfth AI & chats](/assistant/). If the AI service cannot be reached, the bar is greyed out and a note under it says why. ## Routines **Routines** shows the routines you own and the routines shared with the whole workspace, up to eight. Routines that need a look come first: one whose last run failed, then one that was paused for a reason, then the rest by when they next run. **See all** opens the full Routines page. Each routine has a row on a shared timeline. The timeline runs from a point in the past, through today, to a week ahead. ### How far back Choose how far back the timeline reaches: | Option | Shows | | --- | --- | | **Since last visit** | Everything since you last opened Home in this workspace. Only offered when that was within the past week. | | **1d** | Yesterday and today. | | **1w** | The past week. | The stretch since your last visit is shaded, and a line marks when you were last here. Home opens on **Since last visit** when it can, and on **1w** otherwise. Your last visit is recorded per workspace, in this browser. Next to the options, a short line sums up what you missed, for example "4 runs since your last visit · 1 raised work · 1 failed", or "Nothing has run since your last visit". Hover over it for the time of your last visit, in Melbourne time. ### Reading the timeline Each dot before today is a run. Its colour says how the run went: **Raised work**, **No action needed**, **Partly checked**, **Run failed**, or **Running**. Runs since your last visit have an outline. Hover over a dot for the result, the date and the run's summary. Select it to open that routine's runs. Dots after today are runs still to come. The filled dot is the **Next run**. Select one to open the routine. A paused routine has no future runs, and its row reads "Paused", with the reason when one was given. A chip such as "2 open" counts the open tasks from that routine that are yours. Select a routine's name to open it. The line for today and the day columns follow Melbourne time. ### Before you have any routines With no routines yet, the section explains what a routine is and offers **New routine**, plus example routines you can start from. Selecting an example opens the routine builder with that sentence already filled in. ## Top tasks **Top tasks** shows up to eight of the open tasks assigned to you. Tasks with a due date come first, soonest first. Tasks without one follow, newest first. **See all** opens [Tasks](/tasks/) and shows the full count, for example **See all 12**. Snoozed tasks are left out until the snooze ends. When nothing is waiting, it reads "No tasks waiting on you." Each row shows the task type's icon, the title, and where the task came from: the routine or project that raised it, or **Chat**, **Manual**, **Added**, or **twelfth** for work Twelfth raised from your data. It shows "4 flagged" when lines in the task have been flagged, and when it is due. Select a row to open the task. The colour of the row shows how urgent it is. Days are counted in Melbourne time. | Row | Label | Meaning | | --- | --- | --- | | Red tint | **Overdue ·** 17 Oct | The due date has passed. | | Gold tint | **Due today** | Due today. | | Plain | **Due** 24 Oct, or no date | Due later, or no due date. | ## Target risks If your workspace tracks sales targets in Performance, Home can show **Target risks** at the foot of the page. It lists each category projected to finish the month short of its sales target. For each one it shows the projected shortfall, the outlook at the current pace against the target, and a suggested next step. Pace does not allow for seasonality. Select a category or the next step to open it, or **Performance** to see all targets. When no category is at risk, the section does not appear. See [Sales and performance targets](/targets/). ## Me and All Owners and admins who also hold their own remits see a **Me** / **All** switch in the app header. Buyers do not see it, because what they can see is already their own remit. | Section | **Me** | **All** | | --- | --- | --- | | Opening sentence | Your own remits, named in the sentence. | The whole business, as "your portfolio". | | Projects | Projects in your remits. | Projects across the business. | | Top tasks | Tasks assigned to you in your remits, plus your tasks that have no remit. | Every task assigned to you. | | Target risks | Your remits. | The whole business. | Top tasks only ever shows tasks assigned to you, whichever view you are in. The choice is remembered in this browser and applies on other pages too. ## Asking Twelfth AI Twelfth AI reads the same figures as Home. Some questions to ask from the **Ask about this workspace** bar: - "Why is Gaming down on the same week last year?" - "Which of my overdue tasks should I do first?" - "What did my routines find since Friday?" If a figure in an answer does not match Home, check the **Me** / **All** view and the comparison chosen in the opening sentence first. Both change what is counted. For a fuller morning read, see your [Daily briefing](/briefing/). --- ## [Welcome to Twelfth](https://twelfth.ai/docs/) --- title: Welcome to Twelfth description: Documentation for Twelfth, a shared operating space where commercial teams turn everyday signals into clear decisions and owned action. lastmod: 2026-10-06 --- # Welcome to Twelfth Twelfth gives commercial teams one place to turn everyday signals into clear decisions and accountable action. Set up your workspace once, then use Twelfth to keep the team aligned on priorities, briefing rhythms, decision guardrails, and who needs to act. ## Start here ::: grids ::: grid ::: card "Get started" icon:rocket [Get started →](/getting-started/){.card-cta} ::: /card ::: /grid ::: grid ::: card "How work flows" icon:git-branch [See the pipeline →](/pipeline/){.card-cta} ::: /card ::: /grid ::: grid ::: card "Settings overview" icon:sliders [Browse settings →](/settings/overview/){.card-cta} ::: /card ::: /grid ::: grid ::: card "Pricing intelligence" icon:chart-no-axes-combined [Track prices and report →](/price-intelligence/){.card-cta} ::: /card ::: /grid ::: /grids ## Set up your workspace ::: grids ::: grid ::: card "Workspace members" icon:users [Manage members →](/settings/members/){.card-cta} ::: /card ::: /grid ::: grid ::: card "Categories" icon:tag [Manage categories →](/settings/categories/){.card-cta} ::: /card ::: /grid ::: grid ::: card "Suppliers" icon:truck [Open suppliers →](/settings/suppliers/){.card-cta} ::: /card ::: /grid ::: grid ::: card "Guardrails" icon:gauge [Set guardrails →](/settings/guardrails/){.card-cta} ::: /card ::: /grid ::: grid ::: card "AI & agents" icon:bot [Connect AI →](/settings/ai-and-agents/){.card-cta} ::: /card ::: /grid ::: grid ::: card "Security & access" icon:shield-check [Review security →](/settings/security-and-access/){.card-cta} ::: /card ::: /grid ::: /grids ::: callout note "Personal vs workspace" Settings are grouped the way the Settings page is: **Personal** is yours alone (preferences, account, notifications, your workspaces); **Business**, **Capabilities**, **Admin** and **Data & AI** belong to the whole workspace. The [settings overview](/settings/overview/) lists every section under its group and who can change it. ::: --- ## [Reading the flow view](https://twelfth.ai/docs/overview/) --- title: Reading the flow view description: Flow is a read-only map of the decision pipeline, showing how much work moves from Triage into Pending across every project, by decision type. lastmod: 2026-10-06 --- # Reading the flow view **Flow** is a read-only view of the [decision pipeline](/pipeline/) as a whole. Where a project's Triage and Pending stages show individual lines and Decisions shows individual records, Flow shows the **movement**: how much work is moving from Triage into Pending across every project, broken down by decision type and volume. Open **Decisions** from the left rail and switch to **Flow**. (Older links to *Overview* or *Stats* open the same view.) ## What it shows - **Where work is concentrated:** which decision types (price, purchase orders, transfers, watch list, promo, clearance) dominate this week. - **Where work is piling up:** a large Triage volume that is not converting into committed decisions. - **Throughput:** whether the team is keeping pace with what Twelfth is surfacing. ## Reading the flow diagram The **Triage → Pending → Outcome** diagram is one cohort of lines followed left to right. Each band is a decision type, and each box is where those lines have got to: | Box | What it means | | --- | --- | | **Entered triage** | Every line the flow accounts for: still in Triage, sitting in Pending, or already recorded in the selected window | | **Awaiting review** | Still in Triage. Surfaced for you, but **not yet reached Pending** | | **Reached pending** | Made it to Pending, including lines since decided or dropped | | **Uncommitted** | In Pending right now, **not yet recorded as a decision** | | **Decided** | Recorded as a decision during the selected window | | **Dropped** | Removed from the flow during the selected window, with the reason shown under the diagram | ::: callout note "Two clocks in one picture" Triage and Pending counts are **live**: what is in those queues right now. Outcomes (decided and dropped) are **windowed**: only what happened in the 7d, 30d, or 90d period you have selected. Changing the window changes the outcome columns, not the live ones. ::: The narrow bands are labelled in a card beside the diagram rather than inside the box, so a decision type with only a handful of lines is still readable. ## How to use it Flow is deliberately read-only, so you can't act on a single line from it. Use it to plan where to spend attention, then open the [project](/projects/) and do the work in its [Triage](/triage/) or [Pending](/pending/) stage. ::: callout tip "Home vs Flow" **Home** is your starting point for the day, with your briefing and the composer for asking Twelfth. **Flow** is the map of the pipeline itself. Home answers *what should I do next?* and Flow answers *where is the work flowing?* ::: ## Related - [How work flows through Twelfth](/pipeline/) - [Projects](/projects/) - [The Decisions log](/decisions/) --- ## [The Pending stage](https://twelfth.ai/docs/pending/) --- title: The Pending stage description: Pending holds the lines you have settled inside a project but not yet recorded, such as an order still to be raised or a price change still to be pushed. lastmod: 2026-10-06 --- # The Pending stage **Pending** is the middle stage of every engine-fed [project](/projects/) and of the [decision pipeline](/pipeline/). It holds the lines you have settled but whose decision has not yet been recorded: the purchase order still to be raised, the price change still to be pushed, the transfer still to be booked. Open a project from **Projects** in the left rail and choose **Pending** in the stage strip. It reads the same work as Triage through a different filter: Triage is what you have not settled, Pending is what you have. ## One stage, every decision type Pending rolls up all decision types. The type is a label on the work, and every type shares this one stage: | Type | What it commits | | --- | --- | | [Price](/decisions/price/) | A price change on one or more lines. | | [Purchase order](/decisions/purchase-orders/) | A buy or replenishment order to a supplier. | | [Transfer](/decisions/transfers/) | Moving stock between locations. | | [Watch list](/decisions/watch-list/) | Items you are monitoring, with no action due yet. | | Promo / clearance | Promotional and clearance decisions. | ## Recording the decision Open a piece of work in Pending to see its settled lines, the committed values, and how they compare with what was recommended. When every line is settled, **Record decision** writes the decision record for it. You can add a **rationale** as context for the permanent record. The dialog warns that recording cannot be undone. A supplier project spans every buyer holding that supplier's lines, so the batch as a whole waits on the project's **gate** (who has to agree, and whether it is ready) before the order is raised. See [Projects](/projects/#raising-an-order) for what raising does and [Settings → Projects](/settings/projects/) for who may raise it early. ::: callout note "Nothing is stuck" An empty Pending stage means everything you have settled has been recorded. Lines you settle in [Triage](/triage/) land here automatically. ::: ## Related - [Projects](/projects/) - [How work flows through Twelfth](/pipeline/) - [Working in Triage](/triage/) - [The Decisions log](/decisions/) --- ## [Remits](https://twelfth.ai/docs/people/) --- title: Remits description: Remits shows who owns each commercial section in your workspace. Spot shared coverage, find gaps, and see the categories assigned to each person. lastmod: 2026-10-06 --- # Remits **Remits** shows who owns each commercial section in your workspace. Use it to spot shared coverage, gaps, and the range assigned to each person. Open **Settings → Categories & remits** and switch to the **Remits** view, or search for "Remits" in the command palette. ## Understand the coverage map - **Custom remits** come from your buyer mapping and contain an explicit set of SKUs. - **Product sections** follow the categories in your product data and cover SKUs that are not claimed by a custom remit. - **Allocation at a glance** compares each person's current section load. Open a section to see where it came from and which products it contains. Open a person's name to see their profile and decision history. Right-click a remit badge, or long-press it on a touch screen, to filter the table you are currently reading to that remit or open its product details. Selecting the active remit again clears that filter. In places that cannot be filtered by remit, the menu still opens the remit details. Owners and admins can use **+** on a section to assign several people at once, or select a person in **Allocation at a glance** to change every section they cover. Remits use the workspace's [managed categories](/settings/categories/), the other view of the same page, so ownership sits on one shared set instead of free text. ::: callout note "Remits vs Members" **Remits** is for commercial ownership. **[Members](/settings/members/)** is the admin directory for invitations, profiles, roles, access, and member export. ::: ## Related - [Workspace members](/settings/members/) - [Your profile](/settings/profile/) --- ## [Performance](https://twelfth.ai/docs/performance/) --- title: Performance description: "Read sales, units and GP against last year, compare categories, check mix and promotion, and see where Performance figures come from." lastmod: 2026-10-19 --- # Performance **Performance** in the left rail shows your trading history: sales, units and gross profit (GP) over a window you choose, each set against the same weeks last year. It is one page with several views. You set the scope once, at the top, and every view reads that same scope. The tabs change the question you ask; they don't change which trading you are looking at. Performance is switched on for each workspace once its trading feed is connected. If you see **Performance is not enabled for this workspace**, ask Twelfth to turn it on. ## The views | Tab | What it shows | | --- | --- | | **Trend** | Units, sales and GP over the window, this year against last year | | **Targets** | Monthly sales against your activated targets. See [Sales & performance targets](/targets/) | | **Mix** | Each category, remit, supplier or channel's share of sales and of GP | | **Promotion** | How much of the trade ran on promotion, and the margin it made | | **Cut** | One measure across two dimensions, as a matrix | | **Promo calendar** | Which weeks each product line sold on promotion | **Targets** and **Cut** are turned on separately for each workspace, so you may not see every tab yet. The page address records the tab, categories, window and comparison mode, so you can bookmark a view or send the link to a colleague. Each person still sees only what their remit allows. ## Choose the scope Three controls sit above every view. **Filters** picks categories. Leave it empty for **All categories**, or tick the ones you want. You can search by category name or by remit name. A category you only hold part of shows the remits you hold beside it. **Total** and **Compare** decide how a selection of several categories is read. **Total** adds them into one figure. **Compare** shows each category separately. Choose 2–5 categories to compare; until you have picked at least two, the page keeps showing the total and asks for **Choose at least two categories.** If you tick more than five, the first five are compared. This control only appears on **Trend**, **Targets** and **Promotion**, and only when more than one category is available to you. **Mix**, **Cut** and **Promo calendar** always read the selection as one pool. The trading window is **1w**, **1m**, **6m** or **12m**: one week, four weeks, 26 weeks or 52 weeks. The default is **12m**. ## Trend Trend shows three charts side by side: **Units**, **Sales** and **GP**. Each one has the window's total and its change **vs LY** in the corner. Under each chart, a table lists every period with **This year**, **Last year** and **vs LY**, so all the numbers in the chart are also in the table. The period length follows the window: | Window | Each bar is | | --- | --- | | **1w** | A day, where the feed has daily figures; otherwise the week | | **1m**, **6m** | A week, labelled by the day it ends | | **12m** | A month, made of the weeks that end in it | At **12m**, the first and last months can hold fewer than four weeks of the window, and the table says how many. A period that is not yet complete is still drawn, and the table marks it **Partial or missing**. A note such as **10/12 periods complete** under the headline means some periods have gaps. Last year means the same weeks one year back: the same week-endings 52 weeks (364 days) earlier, so weekdays line up. Growth is left blank where last year has no figure to compare against. In **Compare** mode each category gets its own bars, in its own shade. Last year is the same shade, lighter. Use the menu on each chart to download the table as CSV or XLSX, copy it, or ask Twelfth about it. ### What changed in trading Above the charts, **What changed in trading** picks out the categories whose sales moved most. It always uses the **latest 4 weeks** of complete trading, against the **prior 4 weeks** and against **last year**, whatever window the charts show. Each card shows sales over the four weeks, then units, gross profit and gross margin against the prior four weeks. Margin changes are in percentage points. Open a card to see **Where trading changed**: the suppliers, channels or promotional sales that moved most. These views overlap, so the amounts don't add up to the total. **Next steps** suggests where to look next, such as checking availability on lines that are losing units, or reviewing prices and costs where margin fell by more than one point. Each step links to the right view for that category, and **Why this action** explains the evidence. **Full comparison and source dates** shows the exact dates behind each comparison. ## Targets The Targets tab begins with your target plans, then shows **Monthly category sales**: actual sales against target for each calendar month. Each month's row has **Actual**, **Target**, **vs target**, **Coverage / basis** and **Target from**, which links to the plan or uploaded file the target came from. Months follow the calendar exactly, whatever the window's week boundaries are. Above the plans, **How sales are tracking** labels each category's month **On track**, **Watch** (5% or more below plan) or **Material risk** (10% or more below). For a month in progress, Twelfth estimates month-end sales at the current daily pace. It does this only when the feed confirms every day of the month so far, and only after at least seven days. The estimate does not account for seasonality. The same material risks appear on Home under **Target risks**. How to set up, sync and activate targets is covered in [Sales & performance targets](/targets/). ## Mix Mix shows where the trade sits. Pick **Category**, **Remit**, **Supplier** or **Channel** next to the window control. Only the splits your trading feed carries are offered, and a note explains any that are missing. The **Chart** tab draws share of sales and share of GP for the top 12 values. The rest are combined as **Other**. The **Table** tab lists every value with **Sales**, **Share of sales**, **Share LY** (with the change in points), **GP** and **Share of GP**. Category and supplier names link to their pages. ## Promotion Promotion compares promotional and full-price trading over the window, by category: | Column | Meaning | | --- | --- | | **On promotion** | Sales made on a promotion | | **Penetration** | Promotional sales as a share of all sales | | **Realised margin** | The margin those sales actually made | | **Full-price margin** | The margin the same lines make at full price | | **Gap** | Realised margin less full-price margin, in points | Rates are calculated from the window's totals, never averaged from weekly rates. This view needs each sale to be marked as promotional or full price. If your feed doesn't carry that, the tab says **This trading feed carries no promotion flag**. ## Cut Cut builds a matrix. Choose **Rows**, **Columns** and **Measure** (**Units**, **Sales** or **GP**). Columns can be any dimension, **Month**, or **Whole window** for a single column. Every cell shows its value and its change against the same weeks last year. Rows and columns have totals. An asterisk marks a figure built from partial or missing periods. A month is the weeks that end in it, and **(part)** marks a month the window only partly covers. Category headings open [Products](/products/) filtered to that category; supplier headings open the supplier's page in [Suppliers](/suppliers/). ## Promo calendar The promo calendar lists product lines down the side and the window's weeks across the top, with a mark in each week a line sold on promotion. It uses the same promotion flag as the Promotion tab. When there are many lines, it shows those with the most promotional sales; narrow the categories to see the rest. Each line links to its product page. ## Where the numbers come from Performance reads one of two sources, and the footer under every view says which: | Source | Footer says | How it behaves | | --- | --- | --- | | A warehouse feed your business publishes | **imported** and the time of the last import, in Melbourne time | The feed's own weeks, months and completeness. It takes priority whenever it has data for your workspace | | Your workspace's own sales lines (for example from Shopify) | **read from this workspace's sales lines** | Read live, so new sales show on the next load. Weeks run Monday to Sunday in your workspace's time zone | On sales lines, GP is sales less units multiplied by each product's catalogue cost, on the same tax basis as sales. Where a cost is missing, GP for that period is shown as unknown rather than guessed. **Data basis**, next to the filters, shows the span the figures cover, the currency and whether sales include or exclude tax (for example `inc GST`). On a short window that is still under way, it says how many days are in so far, such as `5 of 7 days in`. Figures in different currencies or tax bases are never added together; Trend shows them in separate rows. The footer also shows **Trading through** and the last day of data. It adds **stale: waiting for a fresh import** when a warehouse import is overdue, and **some periods are partial or missing** when they are. When the data is more than two days behind, the benchmark cards say **Trading data is stale** and target risk labels pause until fresh data arrives. If there is nothing to show, the page tells you why. **Trading history is importing** means a first import is under way. **No trading history in this scope** means the feed is connected but has nothing for the categories and remit you can see. **Trading history is not connected yet** means no source is connected. ## Remits and what you see Performance only ever shows the trading in your remits. A buyer sees their own remits. An owner or admin who also holds remits of their own can switch between **Me** (their remits) and **All** (every remit in the workspace) in the page header; the choice applies to every view. Where you hold only part of a category, its figures cover your part only. The **Remit** split in Mix and Cut shows how your trade divides between remits. See [Remits](/people/) for how remits are assigned. ## Asking Twelfth AI The assistant uses the same scoped calculations as this page, so its answers match what you see. Try: - *"Which categories are behind their sales target this month, and by how much?"* - *"What changed in Board Games over the last four weeks compared with the four before?"* - *"Which suppliers lost the most share of sales this year compared with last?"* --- ## [How work flows through Twelfth](https://twelfth.ai/docs/pipeline/) --- title: How work flows through Twelfth description: The Triage → Pending → raised path every line takes inside a project, and the work that turns a recommendation into a committed, logged decision. lastmod: 2026-10-06 --- # How work flows through Twelfth Twelfth turns overnight signals into a short list of things worth your attention, then keeps each one moving until it becomes a decision you own. Everything travels the same path, whatever the decision type: **Triage → Pending → raised.** Those are the stages inside a [project](/projects/). The daily sync opens a project per supplier, per remit or per lane and fills it with lines; the stage strip across the top of the project says how many lines are in each stage. Once a line is raised it lands in [Decisions](/decisions/), the permanent record in the left rail. This page explains what each stage is, who acts, and what "done" means, so a buyer, category manager (CM), or commercial lead can see the whole flow at a glance. ::: callout note "The short version" Twelfth **surfaces** a line into **Triage**. You **settle** it, as recommended or with your edits, and it moves to **Pending**. You **record the decision**, and when the batch is **raised** it lands in **Decisions** as a permanent record, including how your call compared to what was recommended. ::: ## The three stages | Stage | What it holds | Who acts | Leaves the stage when | | --- | --- | --- | --- | | **Triage** | Lines Twelfth has surfaced that you have not settled yet | You (the buyer / CM) | You settle the line | | **Pending** | Lines you have settled, waiting on the rest of the batch | You, or whoever raises orders | The decision is recorded and the batch is raised | | **Raise the order** (or **Done**) | What has been decided, and the control that closes the batch | An owner, or every buyer — the workspace's rule | The batch is raised or closed; the record moves to Decisions | ## Stage 1 — Triage [Triage](/triage/) is the review. Each morning's engine run surfaces the lines that need a human look (a price that has drifted, a line running short before its next delivery, stock stranded in the wrong location) and puts them in the project for their scope. Working a triage line is the core of the job: 1. **Open the work.** You see the recommendation, the numbers behind it, and the evidence Twelfth used to reach it. 2. **Check it against reality.** Adjust the recommended quantity or value where you know something the engine does not. Nothing is committed while you are looking. 3. **Settle the line.** As recommended, or with your edits. It moves to **Pending**. ::: callout tip "Your edits are the decision" Settling a line with a changed quantity or value is still your decision. Twelfth records *what you decided* and, separately, *what it recommended*, so the two can be compared later. ::: ## Stage 2 — Pending [Pending](/pending/) holds the lines you have settled but whose decision has not yet been recorded: the purchase order still to be raised, the price change still to be pushed, the transfer still to be booked. When every line of a piece of work is settled, **Record decision** writes the decision record, with a rationale if you want one on file. Pending rolls up **every decision type**; the type is a label on the work: - **Price**: a price change - **Purchase order**: a buy / replenishment order - **Transfer**: moving stock between locations - **Watch list**: items you are monitoring with no action due yet - plus promo and clearance decisions ## Stage 3 — Raised The last stage of a project is where the batch closes. For a supplier buy it is **Raise the order**: the consolidated order is written as a CSV on the project with a record of who raised it and when. **Nothing is sent to the supplier**. The file is the hand-off until an integration carries it. Price reviews and transfers reach **Done**. Whether an owner may raise an order while another buyer's lines are still open is the workspace's rule under [Settings → Projects](/settings/projects/). Every recorded decision lands in [Decisions](/decisions/), the ledger, showing **what you committed** and **what was recommended**, so anyone can see where a human call differed from the engine, and why. It is read-only: you cannot edit history, only add to it. ## Seeing the whole flow The **Flow** view under Decisions is a read-only map of everything moving from Triage into Pending, broken down by type and volume. Use it to see where work is piling up, which decision types dominate this week, and whether the team is keeping pace, without opening a single line. See [Reading the flow view](/overview/). ## Who does what Twelfth proposes and people decide. The engine never commits a decision on its own; a person always reviews before anything is recorded. [Guardrails](/settings/guardrails/) determine when a decision needs a second pair of eyes: a line below the category gross-profit floor, or a value above your authority limit, is held for review or sent to a manager for sign-off rather than moving ahead as normal. ::: callout warning "Recommendations are not decisions" Nothing Twelfth surfaces is binding until a person settles it and the decision is recorded. A recommendation left in Triage has no effect on price, stock, or orders. ::: ## Next steps - [Projects](/projects/): the container the stages live in - [Working in Triage](/triage/) - [The Pending stage](/pending/) - [The Decisions log](/decisions/) - [Reading the flow view](/overview/) - [Guardrails](/settings/guardrails/) --- ## [Read the pricing Brief](https://twelfth.ai/docs/price-intelligence/brief/) --- title: Read the pricing Brief description: Scope the weekly read to a seller portfolio, understand the price index, and move from observations to the SKUs behind them. lastmod: 2026-10-14 --- # Read the pricing Brief The **Brief** is the weekly editorial view of your tracked set. It highlights meaningful competitor price moves, stock changes, exposed lines, and categories that stayed quiet so you can decide where to spend attention. Open **Brief** from the left rail. ## Choose the range you are reading Use **Reading for → Sellers** to select one or more seller portfolios, or choose every seller for a marketplace-wide read. The index tiles, category observations, SKU counts, and coverage summary update to that scope. The Brief may open on a commonly reviewed seller when that seller exists in the workspace. Clear or change the selection whenever you need a different portfolio. ## Read the index tiles Use **Last seen**, **4 wk**, **8 wk**, or **12 wk** to change the comparison window. It is the same choice the Tracked set's **Prices** control offers, under the same names. See [Choose what a price comparison means](/price-intelligence/tracked-set/#choose-what-a-price-comparison-means). - **Last seen** compares the most recent price observed for each listing against the competitor's most recent. It is the latest observation rather than a live lookup, so on a weekly-collected retailer it can be a few days old. Its note counts lines that are over, under, or level with the market. - **4, 8, and 12 wk** compare rolling average prices using SKUs with enough matched history. - The index is your marketplace price ÷ the competitor's price × 100. **100** is price parity. Above 100 means your price is above the competitor's; below 100 means it is below. - A dash means there is not enough matched history for a reliable index. Click an index tile to open the Tracked set with the same seller, competitor, and time-window scope. ## Work through this week's observations Each category row explains what happened, why it matters, and which lines have the largest dollar gap. Its disposition is deliberately a prompt: - **Needs a decision** or **Needs a conversation** marks a category that deserves attention. - **Watch** marks movement that does not currently expose a seller strongly enough to call for action. Use **Ask twelfth about this** to continue with the observation in a chat. Use **See the SKUs** to open the exact category and SKU set behind the claim. ## Tracking suggestions and coverage A **Not yet tracked** suggestion identifies a range that may be worth adding. **Add to tracked set** accepts it; the new lines can appear before competitor matching and history are complete. **Show me why** opens a chat with the reason for the suggestion. The coverage strip at the bottom shows how many SKUs are tracked and matched, the retailer feeds represented, and the last and next scrape times. Treat low or newly added coverage as context when reading a dash or a thin index. ::: callout tip "The Brief is the explanation, not the evidence table" Use the Brief to find the story, then open the [Tracked set](/price-intelligence/tracked-set/) or a [tracked SKU](/price-intelligence/tracked-sku/) to inspect the lines and history behind it. ::: --- ## [Pricing intelligence](https://twelfth.ai/docs/price-intelligence/) --- title: Pricing intelligence description: Follow competitor prices across your tracked range, understand what moved, and turn the read into seller-safe reports. lastmod: 2026-10-06 --- # Pricing intelligence The **Pricing intelligence** module follows competitor list prices across the SKUs you have asked Twelfth to track. It turns those observations into three connected surfaces: 1. **[Brief](/price-intelligence/brief/)** explains what moved and where attention may be needed. 2. **[Tracked set](/price-intelligence/tracked-set/)** shows the underlying SKU-level coverage, prices, stock state, and index. 3. **[Reports](/price-intelligence/reports/)** keeps internal weekly briefs and creates seller-safe reports for external conversations. Clicking a product in the Tracked set expands its **[tracked SKU detail](/price-intelligence/tracked-sku/)** in the table, so you can inspect price history and the rolling index without losing the current filters. Direct SKU links still open the full-page detail and its follow-up actions. Workspace owners and admins manage the fixed SKU basket and selected retailer feeds in **[Tracked pricing set](/price-intelligence/tracked-pricing-set/)** under Settings. The workspace plan controls how many SKUs and retailers the set may contain. ## What the module can and cannot tell you Pricing intelligence compares observed **list prices and availability**. It helps you see where your marketplace price has moved away from competitors, where a competitor cut or went out of stock, and which lines deserve a conversation. It does not see sales, margin, funding, or a seller's commercial constraints unless those data are supplied elsewhere. Treat an index difference as a signal to investigate. It is not an instruction to change price. ::: callout note "A shared tracked set" The tracked set and collected price history belong to the workspace. Filters change your view of that data; they do not change what the workspace is tracking. ::: ## A practical weekly workflow 1. Start in **Brief** and choose the seller portfolio you are reviewing. 2. Open an index tile or category's **See the SKUs** action to carry that scope into the Tracked set. 3. Filter the table, then expand a SKU to inspect its price and index history in place. 4. Continue through Reports when the evidence needs a seller conversation. 5. Preview the outward-facing report before emailing it. ## Related - [Read the Brief](/price-intelligence/brief/) - [Manage the tracked pricing set](/price-intelligence/tracked-pricing-set/) - [Use the Tracked set](/price-intelligence/tracked-set/) - [Inspect a tracked SKU](/price-intelligence/tracked-sku/) - [Create and send reports](/price-intelligence/reports/) --- ## [Create and send pricing reports](https://twelfth.ai/docs/price-intelligence/reports/) --- title: Create and send pricing reports description: Keep internal weekly briefs separate from seller-safe reports, preview the exact outward-facing content, and email it from Twelfth. lastmod: 2026-08-28 --- # Create and send pricing reports **Reports** holds two document types for two different audiences: - **Weekly briefs** are internal. They can name competitors, compare sellers, and preserve the week's pricing-intelligence narrative. - **Seller reports** are external. Each report contains only that seller's range and position against the market; it never exposes another seller's name, price, or tracked lines. Open **Reports** from the left rail. A link from a [tracked SKU](/price-intelligence/tracked-sku/) can arrive with that SKU's seller already selected. ## Generate a seller report When a seller is selected and there is no current-week draft, choose **Generate _seller_'s report**. Twelfth creates a seller-safe draft from that seller's tracked lines and the relevant observations for the week. The list labels each document as **Draft · generated** or **Sent**, and records whether it came from the Brief or was created manually. ## Preview before sending Choose **Preview** to inspect the exact report body. The preview leads with a plain-language summary, the lines that need attention, areas where the seller is ahead, and a coverage note. **Full line detail** expands the underlying SKU table with the seller's price, competitor comparisons, stock state, and a suggestion per SKU. A seller report excludes: - other sellers' names and prices, - sales and margin data, and - tracked SKUs outside the selected seller's range. Use **Ask twelfth about this** in the preview to prepare the seller conversation from the same report context. ## Email a seller report Choose **Email**, enter the recipient, and confirm **Send**. Twelfth emails the seller-safe HTML shown in Preview. Weekly briefs do not expose an Email action from this page because they are internal documents. ::: callout warning "Preview is the final check" Confirm the seller, reporting week, coverage note, and line-level suggestions before sending. Pricing intelligence is based on observed list prices and availability, so add any commercial context the recipient needs outside the generated report. ::: ## Related - [Pricing intelligence overview](/price-intelligence/) - [Read the pricing Brief](/price-intelligence/brief/) - [Use the Tracked set](/price-intelligence/tracked-set/) - [Inspect a tracked SKU](/price-intelligence/tracked-sku/) --- ## [Manage the tracked pricing set](https://twelfth.ai/docs/price-intelligence/tracked-pricing-set/) --- title: Manage the tracked pricing set description: Import or export the workspace's SKU basket, define tracked views, manage the permitted retailer mix, and understand the plan-controlled collection limits. lastmod: 2026-10-14 --- # Manage the tracked pricing set **Tracked pricing set** in Settings defines what Pricing intelligence collects for the workspace. It connects a fixed basket of customer SKUs to one or more retailer feeds; the resulting observations appear in the operational [Tracked set](/price-intelligence/tracked-set/). Workspace members can view the configuration. Owners and admins can replace and save the product basket and tracked sets. Twelfth staff manage which retailers and listing types are collected; workspace owners and admins choose which permitted retailers appear in the pricing mix. Use the four tabs to move between **Tracked sets**, **Products**, **Retailers**, and shared **Settings** such as delivery checks. Products is the full list Twelfth tracks once; tracked sets are reusable pricing views over that list. A link from the Tracked set opens the relevant tab directly. ## Workspace plan The **Workspace plan** card shows two allowances: - the maximum number of unique SKUs in the basket, and - the maximum number of retailer feeds selected for coverage. These values are organisation contract controls provisioned by Twelfth. They are read-only in customer Settings and may differ between workspaces. Contact your Twelfth representative if the set needs more capacity. The customer selector currently exposes **Australian retailer feeds only**. Twelfth may operate feeds in other regions, but they do not appear or become selectable until regional support is enabled for customers. ## Import products Choose **Import CSV or Excel** or **Paste GTINs or CSV**. The import accepts: - one GTIN per line for backward compatibility, or - CSV or Excel with **Customer SKU**, **Product Title**, **Brand**, **Category**, **Own Price**, and **Currency**, plus optional GTIN, MPN, pack, fitment, grouping, and retailer product-URL fields. Customer SKU is the durable workspace key. GTIN/Barcode/EAN/UPC and brand plus MPN are optional cross-retailer matching signals. Rich pack, model, variant, and fitment attributes help prevent false matches. The import replaces the current draft basket and renders it as a searchable table. Review the customer SKU, product name, brand, category, identifiers, and tags, and remove unwanted rows before saving. Duplicate customer SKUs collapse to one row. Choose **Download CSV** to keep a copy of the current basket before replacing it. ::: callout warning "A fixed replacement set" Saving publishes the complete basket shown on the page; it is not an append-only upload. Export or retain the source CSV before replacing a large existing set. ::: ## Define tracked sets **Everything** always includes every product in the uploaded list and every retailer approved for the workspace. Add a named tracked set when a team needs a narrower working view. Select **Everything** or **View prices** on any published set to open that pricing view in the app. A named set can select individual customer SKUs, categories, or tags from the uploaded product feed, plus a subset of the approved retailers. Search inside the product selector by customer SKU, product name, GTIN, brand, or category. Product filters are inclusive: a product belongs when it matches any selected product, category, or tag. Leaving either dimension on **All** keeps its wildcard. The same SKU can appear in several sets without being matched or scraped twice; sets change the working view, not the underlying collection record. ## Retailer coverage Your workspace sees only the retailers Twelfth has assigned to it. **Listings** shows the listing types being collected. Owners and admins use **Shown** to leave a retailer out of prices, market comparisons and chat, or restore it. These switches save immediately. Collection continues while a retailer is hidden, so restoring it retains its history. Hidden retailers still count towards the collection allowance. Twelfth staff see the full Australian catalogue, its readiness and request states, and can change **Tracked** and the **1P** or **Marketplace** listing types within the plan allowance. At least one listing type must remain enabled for every selected retailer. Coverage changes are saved with **Save tracked pricing set**. Contact Twelfth to change which retailers your workspace tracks. Every selected retailer is approved for the fixed SKU basket. Named tracked sets may narrow that list for a working view. Collection deduplicates exact GTIN, or normalised brand plus MPN, retailer targets across customer workspaces; SKUs without those identifiers stay organisation-scoped. That sharing does not expose one customer's set or data to another. A workspace is never offered its own retailer. A retailer withheld from the workspace remains visible only when it is an existing selection, with a **Remove** state and the reason, so it can be removed safely. ## Delivery checks Enable **Delivery checks** when price comparison should include evidence for configured Australian postcodes. The workspace defaults can be overridden by more specific retailer, listing-type, seller, or product rules managed through the service. ## Save and view prices Choose **Save tracked pricing set** to publish a new revision into the watch pool. New or changed targets may remain unmatched until a collection run identifies the retailer listing and accumulates enough history. Choose **View tracked prices** to return to the [Tracked set](/price-intelligence/tracked-set/) and inspect current coverage and observations. --- ## [Use the Tracked set](https://twelfth.ai/docs/price-intelligence/tracked-set/) --- title: Use the Tracked set description: Filter the workspace's tracked SKUs, compare against the last price seen or a rolling average, review coverage and export the underlying data. lastmod: 2026-10-14 --- # Use the Tracked set The **Tracked set** is the evidence table behind Pricing intelligence. It shows every SKU the workspace has asked Twelfth to watch, the seller range it belongs to, where it is matched, its observed price position, and when it was last seen. Open **Tracked set** from the left rail, or follow a tile or category link from the [Brief](/price-intelligence/brief/) to arrive with that scope already applied. ## Narrow the table The controls above the table filter or reshape the current view: - **Filters** groups category and subcategory, tags, seller, retailer columns and price position. Active choices appear as removable chips above the table. - **Prices** chooses how to read every comparison on the page. It sits on the toolbar instead of inside **Filters** because it narrows nothing. It changes what each figure means. See [Choose what a price comparison means](#choose-what-a-price-comparison-means). - **Retailer columns** chooses up to four competitor columns. Twelfth initially ranks them by coverage for the rows currently on screen and respects the retailer subset of a named tracked set. - **Columns** shows or hides any table column. The table always keeps at least one column visible. - **Any index → 5%+ over any** keeps lines where at least one shown comparison places your price materially over the market. Links from the Brief can also apply matched-SKU, competitor, seller, and price-basis filters. The URL holds these choices, so a shared link opens the same view. ## Choose what a price comparison means A cell reading **vs Repco · $59** is ambiguous on its own: it could be what Repco is charging this morning, or their average over the last month. Those are different numbers that answer different questions. The **Prices** control on the toolbar sets both halves of the reading, and its label always states the current one, so you can tell a table of averages from today's shelf prices. **Prices shown** is which days the comparison covers: - **Last seen** is the most recent price actually observed for each listing. This is the read a supplier conversation turns on, and the only one that reflects a rival who corrected their price yesterday. It is the latest observation, not a live lookup, so on a retailer collected weekly it can be a few days old. - **4 wk**, **8 wk**, **12 wk** average the observed daily prices over that period. An average is the fair read of where a competitor sits, because a single observation can be a promotion, a listing error or a stale scrape. **Comparisons show** is which figure it prints: - **Price** is money, the figure you quote and negotiate. - **Index** is your price ÷ theirs × 100, where 100 is parity and above 100 means you are priced above them. A column of indices is comparable down its whole length whatever the articles cost. The two are independent. Asking for money does not cost you the rolling average, and asking for the last price seen does not force you onto an index. > **Set where the page opens** > > Both choices start from your own preferences in [Settings → Preferences](/settings/preferences/#pricing) and can be changed per page from the toolbar. Choosing on the page writes the choice into the address, so a reload keeps it and a pasted link opens on the same basis for a colleague. Ask the assistant to "show prices on the last price seen" and it will propose the preference change for you to confirm. Click a heading to sort. Right-click a heading for ascending, descending, clear-sort, hide, and reset-width actions. Drag a heading's right edge to resize its column, or double-click the edge to restore the default width. Large tracked sets load progressively as you scroll while keeping the filters and headings visible. ## Read a row - **Barcode** is the tracked SKU identifier. Click the row or product name to expand its price and index charts in place; press **Right arrow** to expand, **Left arrow** or **Escape** to collapse. - **Seller** shows how many marketplace sellers carry the article. Select the count to reveal every seller name observed on the latest scrape; older rows may show the representative seller until the next scrape fills the roster. - **Seen at** uses a dot for each displayed retailer: in stock, out of stock, or not matched. - **Our price** is your own last observed price, shown when **Prices shown** is **Last seen**. On a rolling basis the heading changes to **Our avg**, the matched average for that period. - **Our trend** is how far your own observed list price moved across the period: **flat**, or a signed percentage such as **+3.2%**. It always covers four weeks on the **Last seen** basis, and the selected period on a rolling one. Expand the row to see the price history. The comparison is in the **vs retailer** columns. - **vs retailer** is the comparison itself, printed on whichever basis and figure the **Prices** control is set to. - **Last seen** tells you how fresh the row's observation is. The Tracked set's index is your marketplace price ÷ the competitor's price × 100. **100 is parity**, a value above 100 means your price is above the competitor's, and a value below 100 means it is below. Copper text marks a line where your price is at least about 5% over a competitor. A dash means the SKU is unmatched or lacks enough paired price history; **OOS** means the retailer was matched but is currently out of stock. ## Suggestions, managing the set, and export Suggested category rows are not yet part of the tracked set. Choose **Add to tracked set** or **Dismiss**. Newly accepted lines may remain unmatched until collection has observed and paired them. Choose **Edit tracked set** to open [Tracked pricing set](/price-intelligence/tracked-pricing-set/) in Settings. Workspace owners and admins can import the fixed GTIN basket, review its product attributes, define named views, and select the Australian retailer feeds collected against it. The plan's SKU and retailer allowances are shown there but cannot be changed by a customer. Use **Export** for the tracked-set CSV or 12 weeks of daily prices. GCS and BigQuery destinations require export setup. ::: callout tip "Keep your place" Inline SKU detail keeps the current filters, sort, columns, and scroll position in view. Collapse the row to continue scanning the same list. ::: ## Related - [Inspect a tracked SKU](/price-intelligence/tracked-sku/) - [Manage the tracked pricing set](/price-intelligence/tracked-pricing-set/) - [Read the pricing Brief](/price-intelligence/brief/) - [Create and send reports](/price-intelligence/reports/) --- ## [Inspect a tracked SKU](https://twelfth.ai/docs/price-intelligence/tracked-sku/) --- title: Inspect a tracked SKU description: Expand one SKU inside the tracked table, inspect its price history and rolling competitor index, or use its full page for follow-up actions. lastmod: 2026-10-16 --- # Inspect a tracked SKU A **tracked SKU detail** gives one article enough room for its price history, rolling competitor index, detected events, and current observation. Click a row or product name in the [Tracked set](/price-intelligence/tracked-set/) to expand the detail directly beneath that row. A direct SKU link such as `/app/tracked/LEG-0003` opens the full-page version with follow-up actions. ## Start with the header The header identifies the SKU, tracked seller, product title, current marketplace price, and how many competitor feeds currently match the article. It also summarises the strongest available four-week comparisons. Choose **12 wk**, **6 mo**, or **12 mo** to change how much history is fetched for both charts. If collection started recently, the charts begin at the earliest observation available rather than filling the requested range with assumed data. ## Price history **Price history** plots the observed daily list price for your marketplace and each matched competitor. Prices use step lines because a list price remains in effect until another price is observed. Detected competitor cuts, stock events, and other observations appear on the timeline when available. ## Index vs each competitor **Index vs each competitor** plots a rolling four-week index for the same article: your marketplace price ÷ the competitor's price × 100. - **100** is parity. - **Above 100** means your marketplace price averaged above the competitor. - **Below 100** means your marketplace price averaged below the competitor. The rolling series begins only after enough paired history is available. A missing line or value usually means the SKU was not matched or there were not enough days with both prices. ::: callout note "One index scale" The Pricing page, the Brief, the Tracked set and the SKU detail all use the same index: your price ÷ the competitor's × 100, where 100 is parity and a higher value means your price is further above theirs. ::: ## Work in the tracked table The inline detail keeps the filtered table in place. Click the row again, choose the close control, or press **Escape** to collapse it. On the product-name control, **Right arrow** expands and **Left arrow** collapses the detail. ## Continue from the full page The full-page SKU route adds these actions: - **Ask twelfth about this** opens a conversation using the SKU, selected range, competitor movement, and a prompt for next steps. - **Table view** replaces the visual charts with accessible daily values; choose **Chart view** to switch back. - **Add to seller's report** opens [Reports](/price-intelligence/reports/) with the SKU's tracked seller selected. Generate or open the seller's report there, then preview it before sending. - **Tracked set** returns to the filtered list you opened the SKU from when that context is available. ::: callout warning "Price position is not a pricing decision" The page shows list-price position and observed availability. Check margin, funding, sales response, and the seller relationship before recommending a change. ::: ## Open product listings Expand a product row to find the image and public listing badges on the right. **Your store** and the image open the customer's own public listing when a catalogue mapping or uploaded own-store URL is available. Matched competitor product pages appear underneath. Current position is grouped into stock, sales, and pricing figures, with open work below. The own-store link also appears on the full product page. In Pricing's **Product pages**, the own-store listing comes first and is marked **you**. Own-store listings carry Twelfth referral UTMs. Competitor links remove campaign and click-tracking parameters and suppress the browser referrer. --- ## [Products](https://twelfth.ai/docs/products/) --- title: Products description: "Find any line in your range, read its stock, sales and cover, and open its product page for open work, notes, chats, supplier links and price history." lastmod: 2026-10-19 --- # Products **Products** is where every line you can see lives, whether or not anything is recommended about it today. A line with no open work still has a place here: you can search for it, sort and narrow the list, and open it. The area has three layers: 1. The **Product overview**, a summary of your range and what needs a closer look. 2. The **product list** (**All lines**), a searchable table of every product, with the figures for each. 3. A **product page** for each line, with its open work, notes, chats and history. The inner sidebar, under **Product views**, moves between them. It groups the overview, the product list, **Pricing**, **Promotions** and any saved views by type. **Pricing** appears in workspaces with [Pricing intelligence](/price-intelligence/), and **Pre-orders** appears only in workspaces set up for it. ## What you see depends on your remit Everything in Products is **scoped to your remit**. A buyer sees the products in the remits they hold, and nothing else. The totals, the list, the filters and saved views all count only those products. An owner or admin sees every remit. An owner or admin who also holds a remit of their own gets a **Me** / **All** switch in the page header. **Me** narrows everything to their own remits; **All** shows every remit in the workspace. The switch only ever narrows what you are allowed to see, never widens it. The overview says which you are reading: the **Products** figure reads **In your readable remits** or **Across the business**. A product whose remit has no owner is still listed for owners and admins. Its page says so: "This product’s remit is unassigned. Its work is visible only to owners and admins." ## Product overview Opening **Products** with nothing selected shows the **Product overview**: "What needs a closer look across your range." **All products** in the header opens the full list. ### Totals Four figures lead the page. Each one is a link into the list. | Figure | What it means | | --- | --- | | **Products** | How many products you can see. Opens the full list. | | **With open work** | Products on open tasks. Opens the list filtered to them. | | **Sellable units** | Total sellable stock, with how many products have a stock measurement. Opens the list sorted by stock, highest first. | | **Sold · 4 weeks** | Store and online units sold over the last four weeks, with how many products report sales. Opens the list sorted by units sold. | Under them, the snapshot date says when the stock and sales figures were taken. Partial totals include measured products only. When cover can be measured, a link such as **12 below cover target** opens the list sorted by cover. ### Pricing at a glance In a workspace with [Pricing intelligence](/price-intelligence/), the next panel summarises your market position: a headline such as "4% above market" or "In line with market", your overall index, and three tiles, **Above market**, **In line** and **Below market**, each opening that slice of Pricing. A note under the tiles says how many priced lines were counted, how many were unmatched and how many were excluded. Index 100 is market parity. **Open pricing** opens the full Pricing view. Without pricing, the panel is **Explore your products** instead. Either way it can list **Live promotions** and, where the workspace has it, **Pre-orders**. ### Open product work **Open product work** lists up to four open tasks on your products, soonest due date first, then most flagged lines. Snoozed tasks are left out until their snooze ends. Each row shows the task title, its supplier, project, routine or remit, its due date, and either how many lines are flagged or how many lines it has. Select a row to open the task. **All tasks** opens [Tasks](/tasks/). ### Category watch **Category watch** lists your categories with open work first. The first six show by default; **Show all 14 categories** (or however many you have) lists the rest. | Column | What it means | | --- | --- | | **Category** | Opens the product list filtered to that category. | | **Products** | Products in the category, in your current view. | | **With open work** | Products on open tasks or with active recommendations. Each product counts once. Opens the list filtered to that category and to open work. | | **Below cover** | Products whose cover is below the category's target, or the workspace default when the category has none. Set targets in [Categories](/settings/categories/). | | **Sellable units** | Sellable stock across products with a stock measurement. | | **Sold · 4 wk** | Units sold over the last four weeks, where reported. | Hover a figure for its share of the category and how many products were measured. A dash means unmeasured, not zero. ## The product list **All lines** (called **All items** in some workspaces) is the full table. Under it, **With open work** opens the same list filtered to products on open tasks, and any saved product views follow. ### Search The search box at the left of the toolbar searches by product name, SKU, the source system's ID, supplier code, category and supplier. The list narrows as you type, and a spinner in the box shows a search is running. Clear the box to get the whole list back. ### Columns Every row starts with the **Product** column, which is always shown. It holds: - the product name, which opens the row in place (see [Opening a row](#opening-a-row)); - the **SKU**, which copies to your clipboard when you select it; - the source system's ID and the supplier's code, where they differ from the SKU; - the product's **category** and **remit**; - a **Pre-order** label, where the line is a pre-order. The figure columns come from the latest stock and sales snapshot. Choose which ones show from **Display**; **Reset to default** restores the default set. Your choice is remembered in this browser. | Column | Shown by default | What it means | | --- | --- | --- | | **Supplier** | Yes | The supplier the source names for this line. | | **Sellable units** | Yes | Available units across the network, net of customer allocations. | | **In store** | No | Sellable units on the shop floor. The rest is in the warehouse. | | **On order** | No | Units already on order from the supplier. | | **Sold · 4 wk** | Yes | Store and online units sold over the last four weeks. | | **Sold · 1 yr** | No | Store and online units sold over the last year. | | **Days since sold** | No | Days since the line last sold anywhere. | | **Rate of sale** | No | Units per week. | | **vs year** | No | Rate of sale over the last month against the line's own rate over the last year. It is not a like-for-like comparison with the same weeks last year. | | **Days’ cover** | Yes | Sellable units divided by daily rate of sale. Unavailable when either is unknown or the rate is zero. | | **GP%** | No | Reported gross margin for the line. | | **Price** | No | Current sell price, tax-inclusive, in the source's currency. | | **Open tasks** | Yes | Open work items with an active recommendation naming this line. A count links to the product page's work items. | Hover a column heading for what it measures. A dash always means the source does not measure that figure, never zero. The note under the table says which snapshot the figures come from. If no stock and sales snapshot is connected, it says so: stock, sales and cover are unavailable, while the catalogue, remits and open work are still current. Sales over a chosen period, growth and margin history belong to Performance, not to this list. ### Sorting Select a column heading to sort by it, and again to reverse. A new figure column sorts biggest first, and names sort A to Z. Products the source does not measure sort last either way. If you hide the column you sorted by, the list sorts by name until you show it again. The list loads more rows as you scroll. ### Filters **Filter** opens one searchable list of everything you can narrow by, grouped as **Category**, **Remit**, **Supplier**, **Product attribute** and **Tasks**. **Tasks** offers **Has open tasks** and **No open tasks**. Each option shows how many products it would leave, counted with your other choices already applied, so nothing on offer returns an empty list. Lines with no category are grouped as **Unmapped**, and lines with no supplier as **No supplier**. Active filters show as chips under the toolbar, one per group. Clear a chip to drop that group, or **Clear all** to drop every filter. Clearing filters leaves your search and sort alone. You can also narrow from a row: - Select a **category** label to show only that category. Select it again to clear it. - Select a **remit** label to see what is in that remit. Right-click it for **Filter by this remit**. - Select a **supplier** to open that supplier's page in [Suppliers](/suppliers/). Right-click it for **Filter by this supplier**. Right-clicking a category also offers **Go to category page**. The list's search, sort and filters live in the page address, so a link you share opens the same list, and back and forward step through your changes. ### Images and export **Images** sets where product images appear: **Inside expanded row** (the default) or **Always in product row**, and the thumbnail size. This is your personal preference, the same one in [Preferences](/settings/preferences/). Images appear when your product feed publishes them. The **⋮** menu exports the list as XLSX or CSV, copies it as CSV or as a table, or hands it to an AI assistant. An export includes **Product**, **SKU**, **Category** and **Remit**, plus the columns you have showing. It holds the rows loaded so far, so scroll to the end first if you want the whole list. ### Opening a row Select a row, or its product name, to open it in place. The name stops truncating, and a panel opens underneath with: - **Physical on hand** and **Stock at cost** for the line. The ⓘ beside them explains how they were counted and valued. - **Current position**: every figure the snapshot holds for the line, hidden columns included, grouped as **Stock**, **Sales** and **Pricing & work**. Hover a figure for what it measures and the date it was true. - **Open work**: each open work item on the line, with its headline recommendation figures. Select one to open it. "Nothing open on it right now." means there is none. - **Open product page**, which opens the line's own page. - On the right, the product image (when images sit inside the expanded row), a **Your store** link to your own listing where one is known, and, in a pricing workspace, **Competitor pages** with the competitor listings matched to the line. Select the row again to close it. Right-click a row for **Open in new tab** or **Copy link** to its product page. ## Saved product views Owners and admins can save a filtered list as a view. **Create view** asks what you want to watch: **Products**, **Pricing**, **Promotions** or **Pre-orders**, depending on what the workspace has. For a product view, set a search and filters; the dialog says how many products match. **Create view** saves it, gives it a suggested name, and opens **Name this view** so you can change the name. A saved view appears in the inner sidebar under its type. On a saved view, the pencil renames it and the cross removes it. **Add view** beside a sidebar heading goes straight to creating a view of that type. Saved views are shared across the workspace, but each person still sees only the products in their own remits. ## Pricing, tracked sets and promotions **Pricing** in the sidebar opens **Market position**, with **Above market** and **Below market** under it. It is the same table described in [Pricing intelligence](/price-intelligence/). A tracked set opens as its own view, described in [Tracked set](/price-intelligence/tracked-set/). **Promotions** opens **Live promotions**, with **Awaiting decisions** and **Past promotions** under it. **Pre-orders**, where it appears, opens **Upcoming releases**: upcoming products in release order, with a release timeline. ## The product page Each product has its own page. You reach it from **Open product page** in an opened row, from a task, from a supplier's range, or from a chat answer that names the SKU. It is the workspace's own record of the product, and needs no pricing to be set up. **Back** returns to wherever you came from. ### Header The header names the product, then lists what identifies it: - **Your store**, a link to the product's listing on your own site, where one is known; - the **SKU**, the source system's ID and the supplier's code, each copyable; - its **category**, which opens the category page, and its **supplier**, which opens the supplier's page in [Suppliers](/suppliers/); - its **remit**. Where a supplier has a portal set up, a link opens the product there: **Primary** for the line's own supplier and **Also from** for an alternate one. Each says whether it opens the product directly or the portal's home page, and shows the supplier's buy price with its tax basis and the date it was last seen, where known. Portals are set in [Suppliers settings](/settings/suppliers/). **Ask twelfth** opens the assistant with the product already named, so you can ask about it without leaving the page. Nothing is sent until you write your question. The **⋯** menu holds **Copy link**, **Copy product name** and **Copy SKU**, and research links: **Market prices** (a shopping search for the product name), **Web search**, and **By barcode** when the SKU is a barcode. If your workspace has said where its product records live, the menu's first item opens the product in your source system. ### Labels and source details Under the header, Twelfth may show labels it has worked out about the product, such as dangerous goods or a known supply problem. The ones that would change what you do lead, highlighted; the rest follow under **Also inferred**. Each inferred label shows how sure the guess is. A label someone in your team set says **set here** instead. **Source details** opens a short block of who and what stands behind the figures: - the product's **owners**, or "Unassigned" when its remit has no owner; - **Figures computed**: the date the figures were computed for; - **Catalogue synced**: when the catalogue last synced; - **Remit source**: **Buyer mapping** or **Product attribute**, which is where to go to change it; - a warning when the data is a snapshot or synthetic demonstration data rather than a live feed. The two dates are kept apart on purpose. The catalogue keeps syncing after a product stops appearing in the source, so a recent sync does not mean the figures are recent. ### End of life The lifecycle line says whether the product is **Marked end of life** or **Not marked EOL in Twelfth**. If you hold the product's remit, or you are an owner or admin, **Options** lets you **Mark end of life**: - **Record EOL in Twelfth only** saves the decision and its context, and changes nothing else. - **Mark EOL and update the connected system** also sets the mapped end-of-life value in your connected system. It is only available once an admin has set up a lifecycle mapping in [Integrations](/settings/integrations/). Either way you write why, for example "Supplier discontinued this product", with the plan for remaining stock and a reference if you have one. Twelfth records the trading figures at the time with the decision. Once a product is marked, **Review EOL options** lets you see the routine checks muted for it so you can resume them, reverse EOL in Twelfth only, or reverse it and restore or change the value in your connected system. **History** lists every lifecycle change, newest first: what was done, whether the connected system confirmed the update, who did it and when, in Melbourne time, with the note, the figures captured, and **View decision** to open it in [Decisions](/decisions/). If the latest update failed or its outcome is unknown, the page says it needs review. ### Stock value **Physical on hand** and **Stock at cost** show the product's physical units, including units already allocated to customers, and their value at cost, with the unit cost. The ⓘ explains how they were counted and when. When the inputs are missing, it says so rather than showing zero. ### Work items, notes, chats and price history The rest of the page is tabs. Each tab shows its count. **Work items** lists every work item the product has appeared on, open or settled. Each card shows: - the item's title and where it stands, such as **Buy review — open**, **Price review — committed**, **Transfer review — dismissed** or **Clearance review — no longer proposed**; - its headline figures, in the item's own terms, such as **Available**, **Units / wk**, **Cover** and **Recommended** on a buy review, or **Price**, **Margin** and **Delta** on a price review; - the reason and note when the buyer changed the recommendation; - the remit, the date the figures were computed for, and who raised the decision. Open items are highlighted and decided items are shaded. Select a card to open its task. A product that has never come up says: "Nothing has been proposed on this product yet." **Notes** holds anything your team has written about the product. Write a note in the box and choose **Add note**, or press Cmd+Enter (Ctrl+Enter on Windows). Notes are kept against the SKU, not against a task, so a note written today still reads on next month's review. Notes written on a task show which one, and anyone can add a reaction. **Chats** lists conversations with Twelfth AI that named this product. A chat opened about the product is marked **asked about**; others merely mentioned it. Asking about a product by name or SKU is enough to add the chat here. **Price history** appears only when your source publishes a price and cost history for the product. **Price & cost history** charts **Cost paid**, **Supplier cost**, **Cost**, **Sell price** and **RRP** over time, led by the last price paid and its date. A cost line is what the product master was set to; a point is a delivery that was invoiced. Costs are ex tax and prices are inclusive of tax, and the chart does not convert between them. The open tab is kept in the page address, so a link can open straight onto **Notes** or **Price history**. ### A SKU you do not hold If a link names a SKU that is not in your remits, or that the workspace does not carry, the page says "We don’t hold this SKU." It still shows the SKU to copy and the research links, so the link does not dead-end. ## Asking Twelfth AI Twelfth AI reads the same products, scoped to the same remits. Useful questions: - "Which products in Board Games are below their cover target and have nothing on order?" - "What have we decided on SKU 9300000123456 this year, and why?" - "Which of my lines haven't sold in 90 days?" If a number in an answer does not match this page, check the **Me** / **All** switch first: it changes which products are counted. --- ## [Projects](https://twelfth.ai/docs/projects/) --- title: Projects description: "Everything in flight and the work inside each one: what a project is, how the daily sync fills it, and how a supplier order is raised." lastmod: 2026-10-06 --- # Projects A **project** is the container your work sits in. It has a scope (a supplier, a remit, a lane, or whatever you name), a workflow that says what its stages are, and a start and an end. Open **Projects** from the left rail. The list opens on what is live; the control above it reaches closed and archived projects. ## Where projects come from Most of them open themselves. Each overnight engine run puts the lines worth your attention into the project for their scope: | Workflow | One project per | Opened by | | --- | --- | --- | | Supplier buy | Supplier | The daily sync | | Price review | Remit | The daily sync | | Transfer | Lane | The daily sync | | Log a problem | Whatever you name | You, usually from a conversation | | Supplier negotiation | Category | You, from **New project** | A supplier project spans every buyer holding that supplier's lines. Mattel across three remits is **one** project and three sets of lines. Each buyer sees their own share of it. New lines land in the project that is already open, so a supplier you are part-way through is refreshed rather than replaced. Once it is raised, the next sync opens a fresh one. ## The stages inside a project The stage strip across the top of a project says how many **lines** are in each stage. A project is never "in Pending" as a whole while a line sits untriaged, so the current stage is the earliest one still holding lines. | Stage | What is in it | | --- | --- | | **Triage** | Lines you have not settled yet. Opening one is the review you have always done: the grid, the evidence, your adjustments. | | **Pending** | Lines you have settled, waiting on the rest of the batch. | | **Raise the order** (or **Done**) | What has been decided, and the control that closes the batch. | Clicking a stage opens it without leaving the project, and the URL carries it, so a link to Pending is still a link to the project. ## Raising an order **Raise the order** closes the batch and writes the consolidated order as a **CSV file** on the project, with a record of who raised it and when. **Nothing is sent to the supplier**: sending it is the next step, and until it exists the file is the hand-off. Whether you can raise it while lines are still open depends on the workspace's rule (**Settings → Projects**): - **Every buyer signs off**: the order waits until nothing is left open. - **An owner may raise it early**: an owner or admin can raise it anyway. The override is recorded, and the units still open move into a new project for the same supplier, so nothing in flight is lost. ## When a project closes itself This happens in two cases, and both are recorded in the log: - **It emptied out.** The engine stops producing work for a scope: a supplier drops out of the recommendations, or a remit is re-partitioned so its lines move to another remit. Every line in the project closes, nothing was ever committed, and after a day of that it closes itself. Nobody has to raise an empty order to clear it, and the scope is free again if the engine comes back to it. - **It went idle.** Everything was committed and then left alone for the window your workspace set (**Settings → Projects**, off unless you set one). Neither ever closes work you still have open. ## The rail beside a project Every project carries the same rail whatever its workflow: the **gate** (who has to agree, and whether it is ready), **tasks out** (with somebody else) and **tasks back** (with you), the **documents** attached to it, the **artefacts** it has produced, and its **log**, including every sync that added to it. ## Starting one by hand **New project** offers the workflows this workspace has switched on, and asks for a name and an owner (you, unless you say otherwise). A conversation with Twelfth can be promoted into one with **Make this a project**: the chat stays the record of how it started, and the project carries it from there. ## Workflows A **workflow** is the template a project is started from: its scope, its stages in order, who has to agree before it closes, and what it counts progress in. Every project pins the version of the workflow it was started on, so a workflow can change without rewriting a project already running on it. | Workflow | Scope | Started by | Progress counted in | Stages | | --- | --- | --- | --- | --- | | **Supplier buy** | One supplier | The daily sync | Lines | Triage → Pending → Raise the order | | **Price review** | One remit | The daily sync | Lines | Triage → Pending → Done | | **Transfer** | One lane | The daily sync | Lines | Triage → Pending → Done | | **Log a problem** | Whatever you name | You | Tasks | Work it out → Done | | **Supplier negotiation** | One category, several suppliers | You | Suppliers | Strategy → Ask → Negotiate → Sign-off → Apply | | **Pre-orders** | One window — a year or a half | You | Lines decided | Offers → Commit → Live → Done | The first three are the engine's own: the sync opens them, and they cannot be started by hand or switched off. The rest are offered on **New project** unless an admin has narrowed the list under [Settings → Projects](/settings/projects/). ### Coming soon Workflows that are designed but not built yet appear as dashed **Coming soon** cards on New project: **Range review**, **Buy plan**, **Promotion plan** and **Season plan**. Opening one shows the stages it will have and records that you want it, which is what decides the order they get built in. If none of them is the process you run, **Request a custom workflow** at the foot of the panel takes a name, a description of how the work goes, and optionally a document that describes it. A custom workflow is your own order of stages from the same library. ## Pre-orders A **pre-orders** project is one window of pre-orders, such as "2027 pre-orders" or "F27 H2", worked from the suppliers' offers to the last line landing. It replaces the new tab in the pre-order sheet: the lines, the quantities, the money by supplier and by month, and where every line stands live on the project instead. ### Starting one **New project → Pre-orders** asks for a name, the **year** a month means ("February" on a 2027 window is February 2027; it defaults to the year in the name), and an optional **budget** to commit against. Several windows can be live at once. ### Adding offers **Add offers** on the project's Status reads a spreadsheet (a supplier's offer sheet, or a tab of the sheet you keep today) or rows pasted from one. Choose the tab when a workbook has several. The headings are found wherever they are (a title row above them is fine) and read by what they say: Range, Products, SKU/barcode, Supplier, ETA, QTY, Buy Price, Offer number, Embargo date and REX SKU, and the usual variations of each. A total typed into a heading and a Month column that repeats the ETA are left out; the month comes from the ETA. Nothing is refused for being incomplete. An ETA of `TBC` or `Q1`, a missing price or a missing quantity is kept as typed and flagged. A row already on the window (the same article, supplier and offer) is skipped, so reading the same sheet twice adds nothing. The answer says how many lines were added, how many were already there, which rows did not read and why, and how each heading was read. A barcode is matched to your catalogue even when the sheet has dropped its leading zero, and a matched line carries its Retail Express SKU. A line with no match is marked **new to the range**. For a single line, say from a phone call, use **Add a line**. ### The tracker Status shows where the window stands in a sentence, the money (committed, still on the table, and against the budget) by supplier and by the month it lands, then **the tracker**: every line, filterable by **To decide**, **On order** and **Closed**, by supplier, and by what needs a look (needs a quantity, no buy price, offered twice, ETA TBC, past its ETA, no REX SKU, short). The quantity and buy price are edited on the line while it is proposed. **Commit** commits every proposed line with a quantity, which locks it. A quantity of zero passes on the line instead, and a line with no quantity yet stays to decide. A committed line moves on from its menu: **Set for pre-order**, **Mark received** (asks how many landed, so a short delivery is recorded as short), **Did not come to market**, or back one step if it was pressed by mistake. ETA, embargo and REX SKU stay editable throughout. An article offered by two suppliers says so on both lines, with the other supplier's price. **Download** gives the window as a workbook in the pre-order sheet's own column order, with each line's state, committed quantity and received quantity on the end. ### Phases Each phase has must-haves. Yours hold the phase, so the project will not move on until they are ticked; Twelfth's are listed and never block. | Phase | What it is for | | --- | --- | | **Offers** | Every offer read in, each line's supplier and buy price checked, articles offered twice flagged, order deadlines noted. | | **Commit** | A quantity on every line or the line passed, the total read against the budget, the lines committed, the order sent to each supplier. | | **Live** | A REX SKU on every committed line, lines set for pre-order once their embargo passes, TBC ETAs chased, pre-sells reviewed weekly. | | **Done** | Every line closed — received, short, or did not come to market — and what the window came to kept with the project. | Committing does not send anything: the order still goes to the supplier the way it does today, and the REX purchase order is still raised in Retail Express. ## Supplier negotiation A **supplier negotiation** is one category negotiated with several of its suppliers at once, against a cost target. Each supplier has its own position (what you asked for, what came back, whether it settled), and those positions add up to one category outcome you can read in a sentence. It is open to every workspace. If you cannot see it on **New project**, an admin has taken it off the list of workflows people can start under [Settings → Projects](/settings/projects/). ### Starting one **New project → Supplier negotiation** asks for four things: the **category**, the **suppliers** in scope, the **start date**, and the **targets** (a cost target as a percentage of the category's cost of goods, and a range target if you have one). The suppliers offered are the ones trading in that category, biggest first, so you are choosing from the range rather than typing names. You can edit each phase's goal and how many weeks it runs before you start. One live negotiation per category: if the category already has one, open that instead. ### The Status page A negotiation opens on **Status**, which is the whole position on one screen: - **Where it stands**: a written read of the phase, how long is left in it, what is agreed against the target, who is stalled and what is due next. - **The phases** and their dates. - **Progress against the cost target**, drawn once. Every other view reads the same figure. - **The tracker**: one row per supplier, with the ask, the latest offer, what was agreed, and where the supplier stands. - **The milestones** that mark each phase's close. Nothing on the page is stored twice. A supplier's status, the category tally and the progress bar are all worked out from the rounds you recorded, so two screens cannot disagree about the same negotiation. ### The five phases | Phase | What it is for | | --- | --- | | **Strategy** | Where the category stands, which suppliers matter most, and what you are going in to achieve. | | **Ask** | What you ask each supplier for, how big, and what you can give. | | **Negotiate** | The rounds: what was offered, what moved, and where each supplier stands. | | **Sign-off** | The outcomes confirmed in writing and approved by whoever can commit to them. | | **Apply** | The new terms handed to the people who put them into effect, and what was learned. | Each phase carries its **must-haves**: the things that have to be done before the project moves on. Some are yours and some are ours: Twelfth drafts the fact base, the tiering and the asks; you confirm the dates, the levers and the walk-away. **A phase will not move forward while one of your own must-haves is unticked**, and the move says which ones are holding it. Going back a phase is always allowed, since needing to revisit one means you had not finished it. ### Recording a round Every exchange with a supplier is a **round** on that supplier's row: the date, whether it was our ask or their offer, what shape it took (trading terms, scan funding, a lump sum, a growth incentive) and the figure. A round with no figure is fine, such as a meeting held or an ask restated. Recording a round is all you do. The supplier's status, the offer on the table, the category tally and the progress bar all move because they are read off the rounds. - **Accepting** an offer records the agreed figure with it. A supplier that has agreed takes no further rounds. - **Walking away** closes that supplier for this review with the reason kept beside it. The rounds stay as the record of the conversation, and the ask stops counting towards the category. - **Confirmed in writing** is the tick that says the supplier committed. It is dated the first time you set it, and you cannot walk away from a supplier that has confirmed: that is a broken agreement, not a negotiating move. A supplier reads as **stalled** when it has been asked or has countered and its next step has no date, or a date already past. Nothing stores "stalled"; giving the next step a date clears it. Once the project is closed, the rounds, ticks and positions stop moving: it becomes the record of what happened. ### Where the cost of goods basis is set Every ask is sized against what a supplier's trade costs you, and that is worked out from your trading history rather than stored anywhere: sales excluding tax, less the margin on them. [Settings → Projects → By workflow → Supplier negotiation](/settings/projects/#supplier-negotiation-cost-of-goods-basis) holds the two choices behind it: how many **weeks** of trading history to read (13, 26 or 52) and the **sales tax rate** to take off, which is used only where your history reports sales including tax. The Status page names the basis in force and links to it. Change the window and every share of cost, the category total and the target move with it. A supplier with no attributed trading in that window reads as unknown, never as an estimate, and the category total stays blank rather than showing a partial one. ## Where the old links go `/app/work`, `/app/triage` and `/app/pending` now open Projects. An old link to a single work item opens that item inside the project that holds it. --- ## [Promotions](https://twelfth.ai/docs/promotions/) --- title: Promotions description: "Every promotion line across your supplier deals: how a supplier sheet becomes a deal, how its columns are read, and how each line is decided In or Out." lastmod: 2026-10-19 --- # Promotions **Promotions** is a view on [Products](/products/). Open it from the Products sidebar, or go to `/app/promotions`, which takes you to **Products › Promotions** and keeps any filters the link carried. Old bookmarks and links in chat answers still land on the same lines. The view lists every promotion line in every promotion plan you can see: what each supplier is offering, what the product would sell at, the margin it leaves, and where the decision on it stands. The list is read-only. You add and decide deals inside a **Promo plan** project (see below), and each line's decision is made on that deal's task in [Tasks](/tasks/). If your workspace uses Twelfth for pricing only, the Promotions view is not shown. ## What the list shows Each row is one line of one supplier deal. | Column | What it shows | | --- | --- | | **Product** | The product name and its code. **Not matched** means the line has not been linked to a product in your catalogue. | | **Project** | The promo plan the deal belongs to. | | **Supplier** | The supplier the deal is from. | | **Window** | The days the promotion runs, for example *21 Nov – 4 Dec*. *From* or *Until* means the sheet gave only one end. | | **Promo price** | The price the line goes on sale at. Once the line is settled this is the price that was decided. Before that it is the buyer's draft, or the price on the sheet if there is no draft yet. | | **Special buy price** | The supplier's reduced cost for the window, as the sheet states it. This is a cost, not funding. It is marked *inc GST* when the sheet gave its costs including GST. | | **Funding** | The supplier's rebate per unit sold, for example *$57.25/unit*, with **Supplier** under it. A line nobody funds shows *$0*. | | **Sells at** | Today's shelf price. | | **Cost ex GST** | Today's unit cost, excluding GST. | | **Margin** | The margin after funding that Twelfth worked out for the line. It is shown in red when it is under your workspace's margin floor. | | **On hand** | Today's stock on hand. | | **State** | Where the line stands (see the next table). | **Sells at**, **Cost ex GST** and **On hand** come from your latest data. A figure Twelfth does not have shows as a dash, never as a zero. A product outside your remit shows no figures. | State | Meaning | | --- | --- | | **Staged** | The supplier sheet has been read but not yet confirmed. | | **Deciding** | The deal is confirmed and its task is open. | | **In** | The line was decided In, at a price. | | **Out** | The line was decided Out. | | **Confirmed** | The deal was confirmed, but its plan closed before anyone decided the line. Nobody is deciding it and nothing was decided. | The list shows 100 lines at a time. Choose **Show more lines** to load the next batch. ### Filters and saved views The toolbar narrows the list: - **Live** or **Past**. A line stays live until its window has ended, which is judged against today's date in Melbourne. A line with no end date stays live, and so does a line that still needs action: a staged deal, or a task still open. Everything else is past. - **Project**: one promo plan, or **All projects**. - **Supplier**: one supplier, or **All suppliers**. The list offers every supplier with a line you can see, including suppliers whose lines haven't loaded yet. - **State**: **All**, **Staged**, **Confirmed**, **Deciding**, **In** or **Out**. People with whole-business access also see **Create view**. It saves the current filters, or the ones you set in the dialog, under a name of your choice. The saved view then appears in the Products sidebar. If you open a saved view that has since been deleted, the page says so and links back to all promotions. ### When the list is empty With no promotion lines yet, the live view says lines come from supplier deals and offers **Start promotion project**, which opens a new Promo plan project. A [promotion calendar](#promotion-calendars) does not add lines here. With filters set, the page reads *No promotion lines match these filters.* ## Promo plan projects A **Promo plan** is a [project](/projects/) for an event or a supplier programme: every supplier deal and special in it, decided, run and claimed. It has three stages: | Stage | What happens there | | --- | --- | | **Build** | Supplier deals are read and decided, line by line. | | **Run** | Prices go live on the right days, and anything out of step is fixed. | | **Claim** | What each supplier owes is claimed and paid. | The project moves on one stage at a time, using **Move to Run** or **Move to Claim**. Its page shows a summary line such as *3 deals · 1 staged · 1 deciding · 1 decided · 42 lines · 30 in*. Under it are two panels. **Supplier deals** lists each deal with its window, funding, line count and how many lines matched. **Promotion lines** holds the same table as Products › Promotions, for this project only. Closing a promo plan discards any deal still staged and cancels any task still open, because a closed plan has nothing left to decide into. ## Adding a supplier sheet On a live promo plan, choose **Add a supplier sheet**. There are two ways to bring one in: - **Upload a file**: choose or drop an `.xlsx`, `.xls` or `.csv` file. The file is read in your browser and only its rows are sent to Twelfth. The file itself is not uploaded. - **Find a sheet**: search [Artefacts](/artefacts/), Google Drive or OneDrive, or paste a link. If the file has more than one tab, choose the one that holds the deal. A preview of its first rows appears so you can catch the wrong tab before it is read. A tab can have at most 5,000 rows. A longer tab is refused with the reason, never cut short, because a deal read from part of a sheet would look complete when it isn't. **Supplier** defaults to **As the sheet names it**, which uses the supplier the sheet names on its own *SUPPLIER:* label. You can pick one of your workspace's suppliers instead. You can't type a new name here, and hidden or archived suppliers are not offered (bring them back in [Suppliers settings](/settings/suppliers/)). Choose **Read this sheet**. Twelfth finds the heading row, reads every row, and matches each line to a product in your catalogue within your buyer scope. The deal is now **Staged**. It takes its name from the tab, unless the tab has a default name like *Sheet1*. In that case Twelfth uses the sheet's title row, then the file name, then the supplier. When the sheet gives a date without a year, such as *16th Nov*, Twelfth uses the project's go-live year, or this year in Melbourne if the project has none. Twelfth also notices when a sheet repeats an earlier deal in the same plan. A byte-for-byte copy is marked *The same sheet as …, already staged.* A sheet with the same promotion reference from the same supplier, or an overlapping window where at least half the matched products are already in an earlier deal, is marked *Looks like a revision of ….* Twelfth only flags these. It never merges the two deals. ## Checking how a sheet was read Choose **Check** on a staged deal to open **Check how this sheet was read**. Nothing here decides a line. Confirming only means the sheet was read correctly. - **Headings on** picks which of the sheet's first 30 rows holds the headings, in case Twelfth chose the wrong one. - **Columns as read** lists every heading next to the field it reads as. Change any of them, or set one to **Not used**. - **Runs** sets the deal's start and end dates by hand. - **Funding** summarises what the lines say, for example *12 lines with supplier funding · 3 at a special buy price*. *Funding and cost not read — check the columns* means no column was read as a cost, special buy price or funding. A column can be read as: | Field | What it holds | | --- | --- | | **REX code** | Your product code for the line. | | **Barcode** | The product's barcode. | | **Supplier code** | The supplier's own code for the product. | | **Product name** | The line's description. | | **Cost** | The supplier's normal cost. | | **Special buy price** | A reduced cost for the window. | | **RRP** | The recommended retail price. | | **Promo RRP** | The supplier's recommended promotional price. | | **Our promo price** | The price you plan to sell at. | | **Funding per unit** | The supplier's rebate per unit sold. | | **Starts** / **Ends** | A line's own dates, where they differ from the deal's. | | **Promotion reference** | The supplier's reference for the promotion. | | **Cap** | Any cap on the deal. | | **Note** | Anything else worth keeping. | Each change is saved as you make it. A new heading row or column mapping re-reads the stored sheet and replaces the deal's lines. Dates you set by hand under **Runs** are kept through a re-read. Below the mapping are the first 20 lines as they were read. Lines whose codes couldn't be resolved are listed by sheet row under **Left unmatched — check the codes**: - **Codes point to different products**: for example, the REX code names one product and the barcode another. - **More than one product matches**: one code fits several products. Twelfth never links a line to a product on a guess. A note at the foot counts any rows not read (blank rows, totals or repeated headings) and any lines not matched in your buyer scope. If someone else changes the deal while you are working on it, your change is refused and the deal reloads: *This deal was changed by someone else. It has been reloaded — check it and try again.* When the deal reads correctly, choose **Confirm**. If it should not be in the plan, choose **Discard**. ## Deciding a deal's lines Confirming a deal raises a task named after it, such as *Decide the Mattel Christmas offer*. The task has one line for each line on the sheet. It is assigned to whoever added the sheet, and it is due a week before the promotion starts. It sits on the project's **Build** stage, or on **Run** if the project has already moved there (a late deal). The deal then shows **Deciding**, and **Decided** once the task is settled. On the task, each line has a **Promo price** and an **In or Out** choice. Twelfth drafts the promo price from the sheet: your own promo price if the sheet has one, otherwise the supplier's promo RRP. You decide In or Out yourself. Next to those are the sheet's **Special buy price** and **Funding**, and the checks Twelfth worked out: | Column | What Twelfth works out | Flagged with | | --- | --- | --- | | **Margin after funding** | The promo price excluding GST, against the cost less the supplier's funding per unit. The cost is the special buy price where there is one, otherwise the sheet's cost, otherwise your current cost. | **Under N% floor**, using your workspace floor | | **Expected in window** | The units the line can expect over the promotion's days, with a range. It is based on how past promotions at a similar depth sold, pooled across products rather than measured on this one. | Never flagged | | **Cover for the window** | Weeks of stock on hand and on order, against the weeks the promotion runs. Where past promotions give a lift, it uses the promotion rate. | *N wk of M* | | **Recent price** | The highest price in the last 90 days, or today's price where there is no history. | **At or above its recent price** | | **Other promotions** | Other confirmed deals with this product over the same days. | **Also on another promotion** | A line is also flagged **Out before it starts** when the stock on hand runs out, at today's rate, before the promotion begins. Stock on order is not counted for this check, because it may land late. A check Twelfth can't work out has no value and no flag. **Settle decisions (N in · M out)** closes the task. It is available once every line is decided and every In line has a price; until then the button says what is missing, for example *2 lines still to decide · 1 In line has no price*. Settling asks for confirmation (*This records the decisions and can't be undone.*). After that, **Download for Rex** gives you the settled promotion as a file for [Rex](/settings/integrations/rex/). You can also **Snooze** an open task until tomorrow. The margin floor is set in **Settings → Business → Projects**, under **By workflow → Promo plan**, as **Promotion margin floor** (0–95%, 35% by default). See [Projects settings](/settings/projects/). ## Promotion calendars A promotion calendar is the dated plan of which products or ranges are on promotion, week by week. It is kept separately from supplier deals, in **Settings → Calendars**. It can come from a Google Sheets tab, an Excel workbook, a [monday.com](/settings/integrations/monday/) board or a Google or Outlook calendar, or it can be updated through chat. Twelfth only reads it and never edits your source. When a calendar is linked, Twelfth checks its columns and shows what each one **Reads as**. It also shows anything required that is missing, how many rows read cleanly, and any row that would be rejected. **Name** (or **Product**) and **Starts** are required. Every row of a promotion calendar also needs a **SKU** (one product) or an **Affects** value naming the category, brand or supplier it covers (a range). Changing a mapping under **Reads as** re-runs the check. The full rules for dates, monday boards and calendar events are in [Calendars](/settings/calendars/). ## Promotions in Performance **Performance** has two views that read promotions from your trading history, not from deals: - **Promotion** shows, for each category, sales, sales **On promotion**, **Penetration** (the share of sales on promotion), **Realised margin**, **Full-price margin** and the **Gap** between them in points. The gap is what running on a deal cost across the window. - **Promo calendar** marks the weeks each line sold on promotion. Both need each sale marked as promotional or full price. Your own sales lines carry that flag. A warehouse feed has to publish it, and if it doesn't, the view says so. ## Who can change what | Action | Who | | --- | --- | | See a promo plan and its lines | The project's owner, its collaborators, anyone holding a line in it, and people with whole-business access. Figures are shown only for products in your own scope. | | Add, correct, confirm or discard a supplier sheet | The project's owner, a collaborator or a workspace admin, while the project is live. | | Decide and settle a deal's lines | The task's assignee. Anyone else sees who is deciding, for example *Deciding — Robin Buyer*. | | Create a saved promotions view | People with whole-business access. | | Set the promotion margin floor | Workspace owners and admins. | ## Asking Twelfth AI - "Which promotion lines in the Christmas plan are under the margin floor?" - "Is anything on the Mattel deal already on another promotion over the same days?" - "@Promotions what do we have on promotion in the first week of December?" --- ## [Routines](https://twelfth.ai/docs/routines/) --- title: Routines description: "What a routine is, the Routines page, a routine's Overview, Tasks, Runs and Setup tabs, Run now, pausing, shadow and live, and muted lines." lastmod: 2026-10-19 --- # Routines A **routine** is a check you want kept up: what to look at, how often, and what counts as needing attention. Each one has its own schedule, its own products, and a record of every run, including runs that found nothing to do. When a run finds work, the work arrives in [Tasks](/tasks/). **Routines** has its own place in the app rail, beside Tasks and [Projects](/projects/). For the workspace settings around routines (timezone, notifications, where raised orders go, and heads of buying), see [Tasks and routines settings](/settings/tasks-and-routines/). ## What a routine gives Every routine gives one of four things. You choose it in the **Gives** row when you set the routine up. | Gives | What each run produces | | --- | --- | | **Lines to act on** | Only the lines that need action, on a task each run. | | **A review** | A task with every line on it (**A review of every line**), or only the lines that qualify (**A review of the lines that qualify**). | | **A briefing to read** | No task. Twelfth writes a report on your range after each run. | | **A checklist** | The same tasks, raised on your schedule. | A routine that gives lines can also say what it **Raises**: | Raises | What goes on the task | | --- | --- | | **Review** | Lines that qualify, to look at. Nothing is sized. | | **Orders** | Order lines, each sized by how much you set: cover a number of days, up to a number of units, a number of cases, to the next run plus lead time, or your cover rules. | | **Moves stock** | Moves between two outlets, each sized by how much you set. | | **Sets price** | Price changes, each to the price you set: a price figure such as a competitor's, the RRP, the current price plus or less a percentage, or a margin. | ### Routines Twelfth sets up Some routines are set up by Twelfth for your workspace rather than built by hand. You may see some of these: | Routine | What it looks for | | --- | --- | | **Planned buy** | Lines that won't have enough stock to last until the next planned buy plus the supplier's lead time, with the quantity to order. One order task per supplier. | | **Daily sell-out scan** | Products that will run out before stock can arrive, and what to order. Silent when stock on order, or your next planned buy, lands in time. | | **Slow movers** | Lines still in range holding months more stock than they sell, with a suggested price move. One price task per category. | | **Running hot** | Products selling faster than expected that will run out within the cover threshold at that pace. A list to look at, not an order. | | **Store transfer check** | Stores that will run short before their next replenishment, and the whole packs to send from the warehouse. One task per destination store. | | **Store count list** | Store lines with stock on record that should have sold by now, to count and correct if the figure is wrong. | Twelfth also sets up **engine routines** that bring its daily reorder, price review and transfer work into Tasks. Their schedule and name can be changed; what they carry can't. See [Supplier orders and price reviews](/settings/tasks-and-routines/#supplier-orders-and-price-reviews). ## The Routines page The Routines page is a schedule, not a table of settings. Each routine you can see is one row, laid along a shared time axis with **Today** drawn down through every row. - On the left: the routine's name, its schedule, the kind of task it raises and how it groups them (for example "per supplier"), and its owner. A routine with open tasks shows **N open**, which opens them. - On the axis: the last run as a filled dot, the next run with its date, and the runs after it as hollow dots. Hover a dot for the run's result and time. - A paused stretch is drawn as a hatched gap, from the day it was paused to the day it resumed. A routine that is still paused ends in a **Resume** button. - A last run that failed or only partly checked says so beside the name. An ordinary run is just its dot. If you can change a routine, hover its icon to pause or resume it in one click. Select the row to open its page. The toolbar has: - **Search routines…**, which matches names, what a routine is for, owners and products. - **Today**, which brings today back onto the axis (shortcut **T**). - The axis view: **Year**, **Quarter**, **Month** or **Week** (shortcuts **Y**, **Q**, **M**, **W**). Drag the axis, or shift-scroll, to move along it. - **Display**, with **Whose** (**All** or **Me**) and **State** (**All**, **Active** or **Paused**). - **Buyers**, for a head of buying only. See [Head of buying](/settings/tasks-and-routines/#head-of-buying). - **New routine**. Archived routines don't appear here. ## Making a routine **New routine** opens a builder that starts from a sentence. Under **What's this routine for?**, say it in your words, for example "Every Monday, show me what's at 0 in Penshurst but has stock in the warehouse", or pick one of the examples, then press **Continue**. Twelfth reads it and drafts the routine as rows: - **Products**: which products it looks at. - **Qualifies**: what makes a line need attention. - **Raises**: what it puts on the task. - **Each line shows**: the columns on each line. - **Gives**: one of the four outputs above. - **When · who**: the schedule, and whether it is for **Just me** or the **Whole business**. A routine that reads competitor prices can be based on a saved Pricing view. Under **Products**, pick it as the **Pricing view**, or open the view on the Pricing page and choose **Create routine for this view**. The routine then checks only that view's lines (still within its owner's products, or the whole range for the whole business) and compares only against the view's competitors. It reads the view as the Pricing page does, so editing the view, or a sheet replacing its lines, changes what the next run checks. If the view is deleted, the routine pauses and names it rather than checking every line. If Twelfth needs something it can't tell from your sentence, it asks above the rows, and the rows that depend on the answer wait. Select any row to change it. If Twelfth couldn't read your sentence, every row is open to fill in by hand and your words are kept. **If it ran now** shows what the routine would find today, without raising anything: how many lines qualify, example lines with the conditions each met, what it would skip and why, and the closest lines when nothing qualifies. It also shows the next few runs. Name the routine (Twelfth suggests a name and a colour), then press **Create routine**, or **Create and run now** to create it and run it straight away. You can also arrive at the builder from **Make this a routine** in a chat, which brings the purpose with it. ## A routine's page ### The header The header is one line: - the routine's name and colour, with a lock (personal) or globe (global) icon. Select it to copy the link or, if you can change the routine, **Change who it's for**; - **Shadow** if it is in shadow, and **Paused** (with the reason, if Twelfth paused it) or **Archived**; - the owner; - when it runs next, such as "Next in 3d". Select it to see **Runs ahead**: the next five runs, the schedule and timezone, and the stop date if it has one, with **Run now** and **Pause** to hand; - **Run now**, and a **More actions** menu with **Pause** or **Resume**, **Go live…** or **Run in shadow…**, **Archive**, and **Copy link**. If you can't change the routine, the header says who set it up: you can work its tasks, but only its owner or a workspace admin can change it. The page has four tabs: **Overview**, **Tasks**, **Runs** and **Setup**. ### Overview **Overview** is the routine's timeline, newest first, grouped by day. The top of it is the next run. Below that, each entry is one of: | Entry | What it records | | --- | --- | | **Run** | A run and its result. It names the tasks the run raised or refreshed. | | **Task** | A task the routine raised, as it stands now. | | **Note** | A note someone left. | | **Muted** / **Unmuted** | A line muted or unmuted on this routine. | | **Set up** | When the routine was made. | | **Rules changed** / **State** | A change to its setup, or a pause, resume or archive. These are hidden until you press **Show setup changes**. | Open a run's entry for its counts, one to a row: **Result**, **Tasks raised**, **Tasks refreshed**, **Lines checked**, **Lines flagged**, **Muted**, **Held by a no-action**, **Data as of** and others where they apply. **Worth a look** lists what the run noticed, and **Could not tell** lists what it couldn't judge, such as lines with missing data. From there, **Work them in Tasks** opens the run's tasks on this page, **See on the Tasks page** opens them in Tasks, and **Open in Runs** finds the run in the history. Press **Note**, or hover the gap at the top of the timeline and choose **Add a note**, to leave context for the next run or for whoever works its tasks. Others can react to a note. Beside the timeline are the **Muted** panel (see [Muted lines](#muted-lines)), **Reports** (the reports this routine has written, if it asks for one), and **How it's set up**, a summary of its setup with an **Edit** link on each row. ### Tasks **Tasks** lists the tasks this routine has raised that you can see, and opens one in place so you can work it without leaving the routine. It opens on the first open task. The picker at the top narrows the list to one run (**Run of** a date) or shows **Every run**, with each run's tasks under it and done tasks dimmed. **All tasks** opens the same tasks on the Tasks page. ### Runs **Runs** is every run, quiet ones included: | Column | What it shows | | --- | --- | | **Run** | When it ran, to the minute in Melbourne time (AEST or AEDT), and whether it was **Manual** (Run now) or **Scheduled**. | | **Result** | **N tasks raised**, **Work refreshed**, **No action needed**, **Checked · data gaps**, **Partly checked**, **Tasks still open**, **Failed**, or in shadow **Shadow · would raise N tasks**. | | **What it found** | The run's own summary, and anything it noticed or couldn't judge. A failed run says what failed. | | **Tasks** | The tasks it raised or refreshed that you can see. Select to open them on the Tasks tab. | | **Data as of** | The date of the data it read. | A routine waits for the day's data before it runs. How long it waits, and what a run on stale data says, is in [A routine waits for today's data](/settings/tasks-and-routines/#a-routine-waits-for-todays-data). ### Setup **Setup** is where the routine is changed. At the top, a strip shows its runs four weeks behind and four weeks ahead; select a past run to open it in Runs. Under **How it's set up**, each row opens in place and saves on its own: **Name and colour**, **What it's for**, the builder's rows (**Products**, **Qualifies**, **Raises**, **Each line shows**, **Gives**, **When · who**), **Runs until** and **Standing instructions**. Only one row is open at a time. - When you change a row that affects what the routine finds, Setup says what the change does before you save, for example "If it ran now: 214 → 162 lines", with the lines it adds, drops and changes. A change applies from the next run. - **Runs until** stops the routine after a date. Clear it to run with no end date. - **Standing instructions** apply to every run and to whoever works its tasks. - If someone else changed the routine while you had it open, Setup says so and keeps your edit for you to save again. - When a routine orders or moves stock and some suppliers in scope have no lead time, their products are sized on a 28-day default. **Lead times** under **Products** lists those suppliers so you can enter one. Lead times are kept for the whole workspace. **Changes**, beside the rows, lists every change to the routine: who made it and when. An engine routine shows its own form here instead of rows. A routine made before the builder existed shows its settings to read: only its name and colour, stop date and instructions can be changed. To change the rest, set up a new routine. ## Run now **Run now** runs the routine at once, outside its schedule, and records the run in **Runs** as **Manual**. It is there for anyone who can change the routine. - A paused routine must be resumed first. - A routine runs one run at a time. While a run is going, the button says **Running…**. - When the run finishes, the header says what it did, for example "Ran it now. 3 tasks raised." - If the run doesn't report back in time, the page says it may still be going and watches for it. **Run now** comes back when the run finishes, or after 3 minutes. - **Run now** never waits for the day's data. It says when its data is stale. ## Pausing, archiving and handing over **Pause** stops the routine running on its schedule. Its history and its open tasks stay. **Resume** puts it back on its schedule. You can pause or resume from the header, the next-run chip, or the routine's icon on the Routines page. Twelfth pauses a routine itself when it can no longer run, for example when its owner no longer has any products in scope. The reason is shown beside **Paused** and on the timeline. **Archive** stops the routine for good. It asks first: "It will not run again. Its history stays available." To hand a routine to someone else, select its owner and pick a member. A routine runs over its owner's products, so a new owner changes what it checks from the next run. A personal routine handed over moves to the new owner's list and leaves yours. ## Personal and global routines | | Personal (**Just me**) | Global (**Whole business**) | | --- | --- | --- | | What it checks | Its owner's products. | The whole range. | | Who can open it | The owner and people with buying oversight. | Everyone in the workspace. Each buyer sees the tasks in their own scope. | | Who can change it | The owner. | The owner, or a workspace owner or admin. | Change it in the **When · who** row on Setup. **Whole business** is offered to people who can read the whole business. ## Shadow and live A routine in **shadow** runs on its schedule and records what it would raise, but publishes nothing: no task reaches anyone. Every tab shows a banner, "Shadow — nothing is published.", with a link to **See what it would raise**. On the **Tasks** tab, a shadow routine shows **What it would raise** from its latest run, by action and then by group. Open a group to see its lines, flagged first, with **Why** each line is there (the cover, demand and stock behind an order, say) and the suggested quantity, price or transfer. To switch, use **Go live…** or **Run in shadow…** in the **More actions** menu. - **Make this routine live?** From its next run it raises and refreshes tasks for real. If an engine routine already raises the same kind of work over the same products, the dialog names it and warns that you may get two tasks for one thing. - **Run this routine in shadow?** From its next run it records what it would raise and publishes nothing. Tasks it already raised stay open for you to finish. Some checks can't go live yet. When that is the case, switching says why. ## How a run raises tasks A run looks at the routine's products and judges each line against what qualifies. What happens next depends on what is already open: - **New work** goes on a new task. A routine that groups its work raises one task per group, such as one per supplier, category or buyer scope. A transfer routine raises one per destination store. - **Work already open** is refreshed rather than raised twice. The open task keeps your review: new lines are added, a line whose suggestion changed moves to the new suggestion (unless you edited it, in which case your value stays), a line that no longer qualifies is withdrawn, and a line you edited that no longer qualifies is marked to recheck. The run's **Open tasks' lines** row counts each of these. - **Nothing to do** is still a run. It is recorded with its result, so a quiet routine reads as checked, not broken. - A **checklist** raises its tasks again only once the previous ones are closed. Until then the run says the previous tasks are still open. - A line you closed as **Reviewed, no action** is held off the routine's tasks for a while. The run counts these under **Held by a no-action**. A run looks at up to 60,000 lines. If there were more, the run says it was capped. ## Muted lines Muting a line tells one routine to leave that product alone for a while. It applies to that product under the check that flagged it, on that routine only. The product still appears everywhere else. To mute, press **Mute** on a line of the routine's task, or **Mute a line** at the top of the task. Choose how long: - **1 week** - **1 month** - **Until a date** (the last day it stays muted) - **Until I unmute it** Choose a **Reason**: **Other reason**, or **End of life (EOL)**. An end-of-life mute can also update the product in a connected system, if an admin has set that up in [Integrations](/settings/integrations/); the dialog says exactly what it will change before you confirm. Add a note so whoever sees it next knows why. A dated mute ends on its own: the first run after its last day judges the product again, and the timeline says so. The **Muted** panel on the routine's Overview lists every muted product with the check it is muted under, until when, the reason, and who muted it. If you can change the routine, **Change** edits the length and reason and **Unmute** ends it now (**Resume checks** for an end-of-life mute). Unmuting does not reverse an update already made in a connected system. Each run counts the lines it skipped as **Muted**. You can mute a line on a routine you can change. A head of buying can also mute lines on a buyer's routine tasks. ## Who can change what | You are | You can | | --- | --- | | The routine's owner | Change, run, pause, resume, archive, hand over, switch between shadow and live, mute and unmute lines, and leave notes. | | A workspace owner or admin, on a global routine | The same as the owner. | | A head of buying, on a buyer's routine | Read it and act on its tasks, including muting lines. You can't change, pause or run it. | | Anyone else who can open it | Read it, copy its link, and work the tasks assigned to you. | ## Asking Twelfth AI Twelfth AI can read your routines and their runs. Useful questions: - "Which of my routines ran this morning, and what did they raise?" - "Why did my Daily sell-out scan raise nothing this week?" - "Which routines are paused, and why?" If an answer doesn't match the page, check the **Data as of** date on the run: a run on stale data says so. --- ## [API keys](https://twelfth.ai/docs/settings/ai-and-agents/api-keys/) --- title: API keys description: Create, name, tag and revoke workspace-scoped bearer keys for the Twelfth REST API, servers, scripts and automations. lastmod: 2026-10-19 --- # API keys Servers, scripts and automations authenticate to the [Twelfth REST API](/developers/) with a **bearer key**. Owners and admins create and revoke workspace keys from **Settings → AI & agents**. Keep keys secret and use them only from server-side code. ## Create a key Select **Create an API key**, name it, and tag the environment it serves: **Development**, **Staging** or **Production**. Twelfth shows a newly created key **only once**: copy it immediately. Use **Create an API key** for a cron job, a script or your own backend. The public REST API uses the key to identify its workspace; every valid workspace key can read `GET /workspace` and the workspace-wide current list from `GET /tasks`. ## One key per thing Give every device, server and automation its own key. It costs nothing, and it is the difference between revoking one stale laptop and taking production down with it. Each row shows the key's prefix, when it was last used, its activity over the last twelve weeks, and, once it has connected, the client and version on the other end. A row that reports more than one client is a key being shared; split it. Rename a connection or change its environment from the row's menu at any time. Neither reissues the secret, so nothing that is already connected breaks. ::: callout warning "Revoke a key if it's exposed" Revoke a key immediately if a device is lost, a team member no longer needs the connection, or you suspect the key was exposed. Revocation stops every API or automation request using that key at once. ::: ## Related - [Developer API](/developers/): authenticate and make the first REST request - [API reference](/developers/reference/): supported operations and schemas - [API compatibility](/developers/compatibility/): stable, unversioned paths --- ## [ChatGPT](https://twelfth.ai/docs/settings/ai-and-agents/chatgpt/) --- title: ChatGPT description: Connect Twelfth to ChatGPT from the marketplace. Sign in with your Twelfth account to read workspace data, with changes available by opt-in. lastmod: 2026-10-19 --- # ChatGPT Install **Twelfth** from [ChatGPT's marketplace](https://chatgpt.com/plugins/plugin_asdk_app_6abf0bd66e648191819596e2c82ac940) to connect ChatGPT to your workspace over [MCP](/settings/ai-and-agents/mcp/). The connection **reads by default** and changes nothing unless you turn on [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes) when connecting. You need an active Twelfth account and workspace. [Install in ChatGPT](https://chatgpt.com/plugins/plugin_asdk_app_6abf0bd66e648191819596e2c82ac940){.docmd-button .assistant-install .assistant-install-chatgpt} Sign in with your Twelfth account. No API key needed. {.assistant-install-note} ## Connect 1. Open [Twelfth in ChatGPT's marketplace](https://chatgpt.com/plugins/plugin_asdk_app_6abf0bd66e648191819596e2c82ac940), or select **Add to ChatGPT** under **Settings → AI & agents → Connect AI** in Twelfth. 2. On the listing, select **Install plugin**. Sign in to ChatGPT if asked. 3. ChatGPT sends you to Twelfth. Sign in, choose the workspace and the read tools it may use, and approve. 4. Ask ChatGPT to list its tools to confirm. The connection appears on the **Usage** tab in Twelfth. There is no key to copy. The connection reads as you, within your remits, and you can end it from **Settings → AI & agents** at any time. ## Watch for changes In a **Work** chat, ChatGPT can watch the workspace and act when something happens. For example: "When new recommendations land in my remit, brief me on the top three", or "Tell me when a competitor cuts a price on anything I track". See [Events](/settings/ai-and-agents/mcp-events/) for what it can watch and how to stop. ## Connect with a key For an assistant that cannot sign in, owners and admins can connect with a key under **Settings → API keys**; see [API keys](/settings/ai-and-agents/api-keys/). ## Related - [AI & agents overview](/settings/ai-and-agents/) — the shared connect flow and available tools - [Events](/settings/ai-and-agents/mcp-events/) — what ChatGPT can watch for you - [API keys](/settings/ai-and-agents/api-keys/) — create, name, tag, and revoke keys --- ## [Claude Desktop](https://twelfth.ai/docs/settings/ai-and-agents/claude-desktop/) --- title: Claude Desktop description: Use Twelfth in the Claude Desktop app. Add it once from Claude's connector directory and sign in, or connect with a key and an MCP config. lastmod: 2026-10-06 --- # Claude Desktop The easiest way to use Twelfth in the **Claude Desktop** app is the same one-click add as on claude.ai. Connectors you add in Claude are available in the desktop app too. The connection is **read-only**. ## Add Twelfth to Claude Desktop 1. Open **[Twelfth in Claude's directory](https://claude.ai/directory/twelfth)** and add it. In Twelfth, **Settings → AI & agents → Add to Claude** opens the same page. 2. Sign in to Twelfth when Claude asks, choose the workspace and the read tools, and approve. 3. Open Claude Desktop. Twelfth is in its connectors; ask Claude what Twelfth can do to confirm. See [Claude](/settings/ai-and-agents/claude/) for the full walkthrough. ## Advanced ::: collapsible "Connect with a key and a local MCP config" For a setup that cannot sign in, owners and admins can connect Claude Desktop with a key instead. 1. In Twelfth, open **Settings → AI & agents**, go to the **Settings** tab and, under **API keys**, choose **Connect an agent → Claude Desktop**. Twelfth creates a key for this connection, copies it to your clipboard, and starts waiting for Claude Desktop's first request. Copy the key now if you need it again: Twelfth shows it only once. 2. In Claude Desktop's MCP settings, add a server pointing at the Twelfth **endpoint** shown on the connection's row, with the key Twelfth just copied for you. 3. Restart Claude Desktop, then ask it to list Twelfth's tools to confirm the connection. The connection's row in Twelfth carries the current endpoint and the ready-to-paste MCP server entry for your workspace. ::: ## Related - [AI & agents overview](/settings/ai-and-agents/): the shared connect flow and available tools - [Claude](/settings/ai-and-agents/claude/): the claude.ai connection - [API keys](/settings/ai-and-agents/api-keys/): create, name, tag, and revoke keys --- ## [Claude](https://twelfth.ai/docs/settings/ai-and-agents/claude/) --- title: Claude description: Add Twelfth from Claude's connector directory and sign in. Read workspace data by default, or opt in to selected changes. No API key needed. lastmod: 2026-10-19 --- # Claude Add **Twelfth** to **Claude** ([claude.ai](https://claude.ai)) in one click from Claude's connector directory. The connection **reads by default** and changes nothing unless you turn on [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes) when connecting. There is no key to copy. [Add to Claude](https://claude.ai/directory/twelfth){.docmd-button .assistant-install .assistant-install-claude} Sign in with your Twelfth account. Works on web, desktop and mobile. {.assistant-install-note} ## Add Twelfth to Claude 1. Open **[Twelfth in Claude's directory](https://claude.ai/directory/twelfth)** and add it. In Twelfth, **Settings → AI & agents → Add to Claude** opens the same page. 2. Claude sends you to Twelfth. Sign in, choose the workspace and the read tools Claude may use, and approve. 3. Ask Claude what Twelfth can do. The connection shows on the **Usage** tab of **Settings → AI & agents**. That is all. The connection reads as you, within your remits. Connectors you add on claude.ai are also available in the Claude desktop and mobile apps. End the connection from **Settings → AI & agents** at any time. ## Advanced ::: collapsible "If your organisation blocks directory connectors" Ask a Claude organisation owner to allow Twelfth, or add it as a **custom connector**: in Claude's **Connectors** settings choose **Add → Custom connector** and paste: ``` https://api.twelfth.ai/mcp ``` Sign in to Twelfth when Claude asks. ::: ::: collapsible "Claude Code, or a client that cannot sign in" **Claude Code** connects from a terminal. Copy the command from the **Settings** tab of **Settings → AI & agents**, under **Developer tools**, or see the [generic MCP guide](/settings/ai-and-agents/mcp/). For a client that cannot sign in, owners and admins can connect with a key; see [API keys](/settings/ai-and-agents/api-keys/). ::: ## Related - [AI & agents overview](/settings/ai-and-agents/): the shared connect flow and available tools - [API keys](/settings/ai-and-agents/api-keys/): create, name, tag, and revoke keys - [Claude Desktop](/settings/ai-and-agents/claude-desktop/): the desktop app connection --- ## [Cursor](https://twelfth.ai/docs/settings/ai-and-agents/cursor/) --- title: Cursor description: Connect Cursor to your Twelfth workspace over MCP. Create an API key, paste the config, and confirm your first request. API keys are read-only. lastmod: 2026-10-19 --- # Cursor Connect **Cursor** to the active workspace by adding Twelfth as an [MCP](/settings/ai-and-agents/mcp/) server. The connection **reads by default**; signed in, it changes nothing unless you turn on [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes), and a key never changes anything. Reach it from **Settings → AI & agents → Cursor**. ## Connect The simplest way needs no key. In Twelfth, open **Settings → AI & agents → Settings** and select **Install in Cursor** under **Developer tools**. Cursor opens with Twelfth filled in; sign in when it asks, choose the workspace and tools, and you are done. The steps below use a workspace key instead, for owners and admins who need one. 1. In Twelfth, open **Settings → AI & agents**, go to the **Settings** tab and, under **API keys**, choose **Connect an agent → Cursor**. Twelfth creates a key for this connection, copies it to your clipboard, and starts waiting for Cursor's first request. Copy the key now if you need it again, because Twelfth shows it only once. 2. In Cursor's MCP configuration, add a server pointing at the Twelfth **endpoint** shown on the connection's row, with the key Twelfth just copied for you. 3. Reload Cursor's MCP servers, then ask it to list Twelfth's tools to confirm the connection. Follow the exact steps on the connection's row in Twelfth. It carries the current endpoint and the ready-to-paste MCP server entry for your workspace. ## Connect with the Twelfth plugin Twelfth publishes its Cursor plugin in the open-source [twelfth-ai/twelfth-mcp](https://github.com/twelfth-ai/twelfth-mcp) repository. It adds the Twelfth server **by URL, with no key**, and a skill that helps Cursor's agent use the tools well. You can also add the server yourself in `.cursor/mcp.json`: ```json { "mcpServers": { "twelfth": { "url": "https://api.twelfth.ai/mcp" } } } ``` Cursor then sends you to Twelfth to sign in, choose the workspace and approve the read tools. The connection reads **as you**, within your remits, the same as any [OAuth connection](/settings/ai-and-agents/#from-the-cards-with-no-key-to-copy). ## Related - [AI & agents overview](/settings/ai-and-agents/) — the shared connect flow and available tools - [Generic MCP](/settings/ai-and-agents/mcp/) — the underlying connection any MCP client uses - [API keys](/settings/ai-and-agents/api-keys/) — create, name, tag, and revoke keys --- ## [Gemini](https://twelfth.ai/docs/settings/ai-and-agents/gemini/) --- title: Gemini description: "Connect Gemini CLI or Gemini to a Twelfth workspace over MCP, read by default: install the Twelfth extension and sign in, or create a key in Settings." lastmod: 2026-10-19 --- # Gemini Connect **Gemini** to the active workspace over [MCP](/settings/ai-and-agents/mcp/). The connection **reads by default**; signed in, it changes nothing unless you turn on [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes), and a key never changes anything. Reach it from **Settings → AI & agents → Gemini**. ## Gemini CLI: install the extension This is the simplest route and needs no key. Twelfth publishes a Gemini CLI extension in the open-source [twelfth-ai/twelfth-mcp](https://github.com/twelfth-ai/twelfth-mcp) repository. It adds the Twelfth server by URL and a skill that helps Gemini use the tools well. ```sh gemini extensions install https://github.com/twelfth-ai/twelfth-mcp ``` Then, inside Gemini CLI, run `/mcp auth twelfth`. Your browser opens Twelfth: sign in, choose the workspace and the tools to allow, and select **Allow access**. The consent screen says the connection returns to an app on this computer. Ask Gemini a question about your workspace to confirm it works. To end the connection, revoke it from **Settings → AI & agents**. Running `gemini extensions uninstall twelfth` removes the extension from Gemini CLI but does not end the connection in Twelfth. ## Connect with a key For owners and admins who need a workspace key instead: 1. In Twelfth, open **Settings → AI & agents**, go to the **Settings** tab and, under **API keys**, choose **Connect an agent → Gemini**. Twelfth creates a key for this connection, copies it to your clipboard, and starts waiting for Gemini's first request. Copy the key now if you need it again, because Twelfth shows it only once. 2. In Gemini, add the Twelfth **MCP endpoint** shown on the connection's row, with the key Twelfth just copied for you. 3. Save, then ask Gemini to list its tools to confirm the connection. Follow the exact steps on the connection's row in Twelfth. It carries the current endpoint and connector settings for your workspace. ## Related - [AI & agents overview](/settings/ai-and-agents/) — the shared connect flow and available tools - [API keys](/settings/ai-and-agents/api-keys/) — create, name, tag, and revoke keys --- ## [Glean](https://twelfth.ai/docs/settings/ai-and-agents/glean/) --- title: Glean description: "Connect Glean to a Twelfth workspace over a read-only MCP connection: create the key in Settings, register the endpoint, confirm the first request." lastmod: 2026-10-06 --- # Glean Connect **Glean** to the active workspace over [MCP](/settings/ai-and-agents/mcp/). The connection is **read-only**. Reach it from **Settings → AI & agents → Glean**. ## Connect 1. In Twelfth, open **Settings → AI & agents**, go to the **Settings** tab and, under **API keys**, choose **Connect an agent → Glean**. Twelfth creates a key for this connection, copies it to your clipboard, and starts waiting for Glean's first request. Copy the key now if you need it again. Twelfth shows it only once. 2. In Glean, add the Twelfth **MCP endpoint** shown on the connection's row, with the key Twelfth just copied for you. 3. Save, then ask Glean to list its tools to confirm the connection. Follow the exact steps on the connection's row in Twelfth. It carries the current endpoint and connector settings for your workspace. ## Related - [AI & agents overview](/settings/ai-and-agents/) — the shared connect flow and available tools - [API keys](/settings/ai-and-agents/api-keys/) — create, name, tag, and revoke keys --- ## [Grok](https://twelfth.ai/docs/settings/ai-and-agents/grok/) --- title: Grok description: "Connect Grok to a Twelfth workspace over MCP: add a custom connector at grok.com/connectors and sign in, or use a workspace key and the xAI API." lastmod: 2026-10-19 --- # Grok Connect **Grok** to the active workspace as a connector over [MCP](/settings/ai-and-agents/mcp/). The connection reads by default, and can change things only if you allow it. Reach it from **Settings → AI & agents → Grok**. ## Add a custom connector 1. Open [grok.com/connectors](https://grok.com/connectors) and select **New Connector**, then **Custom**. 2. Enter `https://api.twelfth.ai/mcp` as the server URL and save. 3. Complete the sign-in Grok asks for: Twelfth opens, you choose the workspace and the tools to allow, and select **Allow access**. 4. Ask Grok to list its Twelfth tools to confirm the connection. On Grok Business and Enterprise, a team admin adds the connector first: in the [xAI console](https://console.x.ai), open **Grok Business → Connectors → Add Connector → Other** and enter the same URL. This needs the team's Read-Write permission. [xAI's guide](https://docs.x.ai/grok/connectors). ## Connect with a workspace key Use this if Grok does not offer a sign-in, or for an unattended setup. Only owners and admins can create a key, and a key reads the whole workspace. 1. In Twelfth, open **Settings → AI & agents**, go to the **Settings** tab and, under **API keys**, choose **Connect an agent → Grok**. Twelfth creates a key for this connection, copies it to your clipboard, and starts waiting for Grok's first request. Copy the key now if you need it again. Twelfth shows it only once. 2. In Grok, add a **connector** and paste the Twelfth **endpoint** shown on the connection's row, with the key Twelfth just copied for you. 3. Save, then ask Grok to list its tools to confirm the connection. A workspace key never makes changes. ## xAI API Developers calling the xAI API can give Grok Twelfth as a remote MCP tool. The API can't sign in, so use a workspace key: ```json { "type": "mcp", "server_url": "https://api.twelfth.ai/mcp", "server_label": "twelfth", "headers": { "Authorization": "Bearer " } } ``` Twelfth expects the `Bearer ` prefix, so set the header in full as above rather than passing the bare key in `authorization`. In the xAI SDK the field is `extra_headers`. Keep the key on your server, never in a browser. [xAI's remote MCP guide](https://docs.x.ai/docs/guides/tools/remote-mcp-tools). ## Related - [AI & agents overview](/settings/ai-and-agents/): the shared connect flow and available tools - [More assistants](/settings/ai-and-agents/more-assistants/): Perplexity, Le Chat, Gemini Enterprise, Kiro and others - [API keys](/settings/ai-and-agents/api-keys/): create, name, tag, and revoke keys --- ## [AI and agents](https://twelfth.ai/docs/settings/ai-and-agents/) --- title: AI and agents description: Connect AI assistants and your own servers to Twelfth with MCP. Read by default, allow selected changes, and manage each connection separately. lastmod: 2026-10-19 --- # AI and agents Open **Settings → AI & agents** to connect an AI assistant, or a server of your own, to the active workspace over MCP. Connections are read-only unless you turn on [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes) when connecting. The page has three tabs: - **Connect AI** lists assistants in compact rows with setup actions and marketplace status. Use **Copy MCP URL** or **Copy install prompt** at the bottom for another assistant. The prompt uses OAuth sign-in; no API key is involved. - **Usage** lists what is connected and how much each connection has been used. - **Settings** shows managed chat defaults and your Ask menus preference. Select **Show advanced** to reveal developer tools (Claude Code, Cursor, VS Code), API keys, and the endpoint and tools. Twelfth staff workspace admins also have a collapsed **Chat runtime** section. Everything connected lives in one list. A row is a **connection**, and a connection is one key: it can be renamed, re-tagged and revoked on its own without touching any other. One person can run several connections of the same kind, so two Claude Codes on two laptops are two rows. ## Workspace chat runtime Twelfth manages models, routing, turn budgets and research defaults for your workspace. You do not need to tune these to use chat. Your personal **Ask menus** choice controls which external assistant the Ask button opens; it does not change Twelfth chat. Twelfth staff who are active workspace owners/admins can expand **Chat runtime** to adjust working style, models and soft turn limits. Changes apply to new turns and are audited. **Runtime details → Reset to defaults** clears workspace overrides. Budgets are checked between calls; a call in flight and the final answer can exceed them. The same staff boundary applies over MCP. A staff owner/admin OAuth connection can read the effective policy with `twelfth_get_preferences` at organization scope, and update it with `twelfth_update_agent_policy` after approving **Allow changes** and meeting workspace MFA requirements. Customer accounts and workspace keys cannot inspect or change runtime controls, including through older grants. Other preference reads and task/routine permissions are unchanged. ## How each assistant connects Most assistants connect in under a minute, by signing in to Twelfth with no key. The table sorts them from least to most setup. | Assistant | What you do | Sign-in | | --- | --- | --- | | [Claude](/settings/ai-and-agents/claude/) | One click: **Add to Claude** opens Claude's directory listing | Your Twelfth account | | [ChatGPT](/settings/ai-and-agents/chatgpt/) | **Add to ChatGPT** opens the [marketplace listing](https://chatgpt.com/plugins/plugin_asdk_app_6abf0bd66e648191819596e2c82ac940); select **Install plugin** | Your Twelfth account | | [Cursor](/settings/ai-and-agents/cursor/) | One click: **Install in Cursor** under **Developer tools**, or the Twelfth plugin | Your Twelfth account | | [VS Code / GitHub Copilot](/settings/ai-and-agents/vscode-copilot/) | One click: **Install in VS Code** under **Developer tools** | Your Twelfth account | | Claude Code | One command: `claude mcp add --transport http twelfth https://api.twelfth.ai/mcp`, or the [Twelfth plugin](/settings/ai-and-agents/mcp/#plugins-and-listings) | Your Twelfth account | | [GitHub Copilot CLI](/settings/ai-and-agents/vscode-copilot/#github-copilot-cli) | Two commands: add the Twelfth plugin marketplace, then install the plugin | Your Twelfth account | | [Gemini CLI](/settings/ai-and-agents/gemini/) | One command to install the extension, then `/mcp auth twelfth` | Your Twelfth account | | [Grok](/settings/ai-and-agents/grok/) | Add a custom connector at grok.com/connectors with `https://api.twelfth.ai/mcp` | Your Twelfth account, or a workspace key | | [Perplexity, Le Chat, Kiro, Junie, Amazon Quick, Zed, Warp, Goose](/settings/ai-and-agents/more-assistants/) | Add a custom MCP connector with `https://api.twelfth.ai/mcp`; [steps for each](/settings/ai-and-agents/more-assistants/) | Your Twelfth account | | [Gemini Enterprise](/settings/ai-and-agents/more-assistants/) | An admin adds a custom MCP server with a client ID from Twelfth | Your Twelfth account | | [Any other MCP client](/settings/ai-and-agents/mcp/) | Add a custom connector with `https://api.twelfth.ai/mcp` | Your Twelfth account, or a workspace key | | [Claude Desktop](/settings/ai-and-agents/claude-desktop/), [Glean](/settings/ai-and-agents/glean/) | An owner or admin creates a key, then pastes the endpoint and key into the assistant | Workspace key | | [Servers, scripts, Vercel apps](/settings/ai-and-agents/vercel-connect/) | An owner or admin creates a labelled key with selected tools | Workspace key, or OAuth through Vercel Connect | | Copilot & Microsoft 365 | **Copy install prompt** on Connect AI for custom setup; marketplace listing coming soon | Your Twelfth account | A connection that signs in reads **as you**, within your remits, and needs no owner or admin. A workspace key reads the whole workspace, so only owners and admins can create one. ## Before you start Anyone in the workspace can connect an assistant from the cards; it reads as them. Only workspace owners and admins can create or revoke keys. Keep keys secret. ## Connect an assistant ### From the cards, with no key to copy Choose your assistant on the **Connect AI** tab: - **Claude:** select **Add to Claude**. Twelfth's page in [Claude's directory](https://claude.ai/directory/twelfth) opens; add it in one click. - **ChatGPT:** select **Add to ChatGPT** to open [Twelfth's marketplace listing](https://chatgpt.com/plugins/plugin_asdk_app_6abf0bd66e648191819596e2c82ac940), then select **Install plugin**. - **Copilot & Microsoft 365:** marketplace listing coming soon; use **Copy install prompt** for custom setup. Each card sends you to Twelfth to sign in, then asks which workspace the connection is for and which read tools to allow. Approve it and you are done: **no key is ever created, copied or pasted**. A connection made this way reads **as you**: your remits, your categories, and nothing outside them. That is why any member can make one, not only owners and admins. It also stops working as soon as you stop being a member of that workspace, and there is no key left behind to find and revoke. One connection reads one workspace. To connect the same assistant to a second workspace, connect it again from that workspace. ### Advanced For developers, and for setups that cannot use a card. ::: collapsible "Developer tools: Claude Code, Codex, Gemini CLI, Cursor, VS Code" These live on the **Settings** tab, under **Developer tools**: a one-line command for the terminal tools, and a one-click install for the editors. They sign in the same way as the cards. ::: ::: collapsible "Any other assistant that speaks MCP" Any other assistant that speaks MCP and OAuth connects the same way. Add a custom MCP connector pointing at: ``` https://api.twelfth.ai/mcp ``` It sends you to Twelfth to sign in, the same as a card. ::: ::: collapsible "By key, for an assistant that cannot sign in" Owners and admins only. 1. On the **Settings** tab, under **API keys**, select **Connect an agent** and pick the assistant. 2. Select the read tools this connection may use, then create its key. Twelfth copies the key to your clipboard and starts waiting. 3. Follow the prompt on the row: a one-click button for Cursor and VS Code, a paste-ready prompt or MCP configuration for everything else. 4. The row switches to **connected** by itself when the assistant's first request arrives. There is nothing to confirm. Copy the key while it is on screen. Twelfth shows a newly created key only once. ::: ## Ending a connection Open **Settings → AI & agents** and use the row's menu. Ending an OAuth connection takes effect on the assistant's next request, including one that already holds a valid token, because every request re-checks the connection before it reads anything. You can always end your own connections. Owners and admins see, and can end, every connection in the workspace. ## Connect a server Select **Create an API key** for anything that is not an assistant, such as a cron job, a script or your own backend. Name it, tag it **Development**, **Staging** or **Production**, choose its read tools, and the key is revealed once. The environment tag shows on the row, so an admin deciding what is safe to revoke can tell the production server from someone's experiment. The tool picker comes from the current server catalogue, so it only offers tools available to that workspace and credential type. A disabled tool is absent from MCP discovery and refused if a client calls it directly. Owners and admins can change a key's selected tools from its row in **AI & agents**; the change takes effect on the next MCP request. An OAuth connection chooses tools during consent and must reconnect to change its selection. Older connections made before tool selection existed retain access to all currently eligible read tools until changed or reconnected. A new tool is not automatically added to a connection with an explicit selection. ## What a connection reports Each row shows the client that actually connected and its version (for example *Claude Code 2.0.14*), not the choice made when the key was minted. It also shows whether the connection has an explicit tool selection. OAuth rows name the member whose access is being used. If a key has been used by more than one client, the row says so: that is usually a key that has been shared around and is worth splitting. ## Ask menus The **Ask** button on pages and tables is separate from connections. It hands your prompt to an external AI chat. Choose which one under **Ask menus**. It grants no access to the workspace and involves no key. ## Setup guides by assistant For the assistants most people use, adding Twelfth is a button and a sign-in: - **[Claude](/settings/ai-and-agents/claude/)**: one click from [Claude's directory](https://claude.ai/directory/twelfth). Also covers the Claude desktop and mobile apps. - **[ChatGPT](/settings/ai-and-agents/chatgpt/)**: install from [ChatGPT's marketplace](https://chatgpt.com/plugins/plugin_asdk_app_6abf0bd66e648191819596e2c82ac940), then sign in. - **Copilot & Microsoft 365**: marketplace listing coming soon; use **Copy install prompt** for custom setup. - **[Gemini](/settings/ai-and-agents/gemini/)**: Gemini and Gemini CLI. - **[Grok](/settings/ai-and-agents/grok/)**: Grok connectors. - **[Glean](/settings/ai-and-agents/glean/)**: Glean MCP connection. ::: collapsible "Advanced: developer tools, keys and servers" - **[Claude Desktop](/settings/ai-and-agents/claude-desktop/)**: a key-based local MCP config, if you can't use the directory. - **[Cursor](/settings/ai-and-agents/cursor/)**: Cursor MCP config, or the [Twelfth plugin](/settings/ai-and-agents/cursor/#connect-with-the-twelfth-plugin). - **[VS Code / Copilot](/settings/ai-and-agents/vscode-copilot/)**: VS Code MCP config. - **[Generic MCP](/settings/ai-and-agents/mcp/)**: Claude Code, Codex and any other MCP-capable client, plus the [Official MCP Registry entry and open-source plugin](/settings/ai-and-agents/mcp/#plugins-and-listings). - **[Events](/settings/ai-and-agents/mcp-events/)**: let an assistant watch the workspace and act when something changes. - **[Vercel Connect](/settings/ai-and-agents/vercel-connect/)**: connect a Vercel app or agent with OAuth or a workspace key. - **[API keys](/settings/ai-and-agents/api-keys/)**: create, name, tag, and revoke keys. ::: ## Available MCP tools Depending on its saved tool selection, entitlement, and the caller's role and remits, a connection can: - Get workspace identity and operating defaults. - List workspace members and their roles. - List open actions, including due dates, assignees, and available source context. - Read stored workspace preferences. An OAuth connection can also read its own user and membership preferences; a workspace key cannot read anyone's personal settings. This covers only settings stored in the preference registry, not every Settings page. Results list only readable keys and show whether the caller's role permits editing them in the app; MCP writes remain unavailable. Operational alert contacts are shown only to owners and admins. - List projects visible to the connection and the workflows available in the workspace. - Page through Products with search, sort, category, remit and supplier filters. Product position figures come from the latest available snapshot; an unmeasured figure is null. - List saved pricing tracked sets and read a bounded page of a set's product and competitor-price rows. The set in a Products link such as `?set=` is the `setId` for `twelfth_get_tracked_set`. Choose `live` for the last observed prices or 4, 8 or 12 weeks for rolling averages. Each call uses the connection's readable remits and the saved set's retailer selection. A set outside a member's remits retains its name and link but returns no product lines. Pricing tools require the workspace's Pricing intelligence capability. - Discover approved pricing sources with `twelfth_list_pricing_retailers`, optionally for one saved set. It includes sources that have no matching products yet. Pass its `sourceKey` values and up to eight product SKUs to `twelfth_compare_pricing_skus` to get matching and stock state, observed and basis-matched prices, competitor-minus-own gaps, product-page evidence and a short note. A SKU outside the connection's remit or the selected set is reported as unreadable or untracked without exposing its details. These calls use stored observations, not a fresh scrape. - Read managed categories, aliases and remit ownership. An OAuth member sees only readable remit details; owners and admins can see the whole workspace. The result says whether the role permits category management in the app. Demand overrides are a separate Twelfth-staff control. - See integration connection state, what each connector provides, whether the person's role permits configuration in the app, and a link to its setup or manage page. The assistant cannot start a provider connection or handle its credentials. - Search the records an answer would cite, with `search` and `fetch`: catalogue products, shared documents, reports Twelfth wrote, projects, saved pricing sets and these docs. Each result has a link to the record in Twelfth, and `fetch` reads one in full. These are the two tools ChatGPT's company knowledge and deep research look for. They search only what the connection's other tools could read: a source is left out when the tool that finds it or the tool that reads it is not in the connection's selection. - Read-only analysis tools for the visible work-unit snapshot and the caller's readable catalogue: sales metrics, product ranking, inventory position, product master, similar products, supplier constraints, supplier lookup, entity profiles and context, and methodology. Connected workspaces can also offer competitor price intelligence. Arbitrary warehouse SQL is reserved for Twelfth's staff-only diagnostic workspace. Tools that only make sense inside the in-app chat (asking the buyer a clarifying question, rendering a table or chart) are not offered over MCP. Tool results include `source_evidence_ids`; a later call can pass them back to refer to the same rows. An MCP key is a workspace credential. It reads the whole business, the way the owner or admin who created it does, and is not narrowed to any one buyer's remit. Apart from the three [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes) tools, which mark your actions done, snooze them or create tasks, these tools cannot write data or make changes in Twelfth. Changing settings and creating projects still happen in the app. API keys, account sessions, sign-in methods, and leaving or deleting a workspace are app-only controls. ## What Twelfth records about a connection Every call is logged against the key that made it: the tool name, whether it succeeded, when, and how long it took. The **Usage** tab shows it for each connection: calls by tool, and a chart of calls over the last 12 weeks. Tool **results are never stored or sent to analytics**; only their size is. Keys are stored hashed and shown once, at creation. Repeated failed authentication from one address is refused for a cooling-off period. --- ## [Events](https://twelfth.ai/docs/settings/ai-and-agents/mcp-events/) --- title: Events description: Let an assistant watch a Twelfth workspace and act when something changes, such as new recommendations, competitor price moves or fresh data. lastmod: 2026-10-06 --- # Events An assistant connected over [MCP](/settings/ai-and-agents/mcp/) can do more than answer when asked. It can **watch** the workspace and act as soon as something happens: brief you when new recommendations land, check a competitor's move the morning it is spotted, or summarise a project the moment it closes. This uses **MCP events**. ChatGPT supports them today, and any client that implements the MCP Events extension can use them too. ## What an assistant can watch | Event | Fires when | Narrow it by | |---|---|---| | **New recommendations** (`recommendation.created`) | The morning's data lands new recommendations: reorders, price moves, range calls | Remit, kind | | **Competitor price moves** (`competitor_price.changed`) | Price tracking first spots a competitor cut, a stockout, one retailer following another, or the market index crossing yours | Retailer, kind of move, SKU | | **Project changes** (`project.updated`) | A project is created, closed or reopened, or its supplier order is finalised | Project, kind of change | | **Data refreshed** (`data.refreshed`) | A new day of sales, stock and supplier data is in, so earlier figures are out of date | — | **Competitor price moves** appears only in workspaces with price tracking. ## Ask ChatGPT to watch Connect ChatGPT first ([ChatGPT](/settings/ai-and-agents/chatgpt/)). Then, in a **Work** chat, say what to watch and what to do: - "When new recommendations land in my Toys remit, give me the three that matter most." - "Tell me when Big W cuts a price on anything I track, and say whether we should follow." - "When the Lego supplier negotiation closes, draft a summary for the team." - "Each morning, once the data has refreshed, send me a trading brief." ChatGPT shows the subscription in the chat and acts each time the event fires. To stop, ask it to stop watching, or end the connection under **Settings → AI & agents**. Ending the connection stops every subscription it made. ## If nothing arrives - **Use a Work chat.** ChatGPT offers events only in Work chats (on the web, or in the desktop app with Cloud selected), not in ordinary chats. - **Allow about a minute.** Twelfth checks for new events every 30 seconds. Recommendations and refreshed data arrive when the morning's data lands, not the moment you subscribe. - **Check your scope.** Nothing is sent for a remit you don't hold or a SKU you don't cover, so a quiet subscription may mean nothing in your scope changed. - **Check the connection's tools.** If you didn't allow a tool when you connected, the events that depend on it aren't offered. Reconnect from **Settings → AI & agents** and allow it. - **Ask ChatGPT what it's watching.** A subscription lasts up to a day and ChatGPT renews it while the chat still wants it. If the chat has moved on, ask it to start watching again. ## What an assistant receives An event says **what happened and where to look**: ids, a title, a link into Twelfth, and the tool that reads the detail. It does **not** carry sales, margin or cost figures. The assistant fetches those with a normal tool call, which applies your workspace permissions and is recorded like any other call. Events follow the same scope as the tools: - A connection made by signing in sees only events in **your remits**. A recommendation in another buyer's remit, or a price move on SKUs you don't cover, is never sent. - A connection is offered only the events whose reading tool it may use. If a connection can't list projects, it can't watch them either. - Access is checked again **every time** an event is delivered. If your access changes, deliveries change with it. If you leave the workspace or the connection ends, they stop. ## For developers Twelfth implements the MCP Events extension on its `2026-07-28` endpoint at `https://api.twelfth.ai/mcp`. `server/discover` advertises `capabilities.events`. Every events method needs the same OAuth token or workspace key as the tools. - **`events/list`** returns the events this connection may watch. Each has its `delivery` modes, an `inputSchema` (the filter arguments) and a `payloadSchema` (the event's `data`). - **`events/poll`** is stateless. Call it first with `cursor: null` and keep the `cursor` each poll returns. It also returns `hasMore` and `nextPollMs`, and `truncated: true` when the cursor is older than seven days (or older than your `maxAgeMs`). - **`events/subscribe`** registers a webhook: `delivery: { mode: "webhook", url, secret }`. - The `url` must be public HTTPS. - The `secret` is yours: `whsec_` plus base64 of 24–64 random bytes. - Before activating, Twelfth POSTs a signed `{"type":"verification","challenge":…}`. Echo the challenge in a 2xx response, either as the body or as `{"challenge": …}`. - Subscribing again with the same event, arguments and URL refreshes the subscription and returns the same `id`. - A subscription lasts up to 24 hours (`refreshBefore`); you can ask for less with `ttlMs`. - **`events/unsubscribe`** takes the same event, arguments and `delivery.url`. Calling it twice is safe. Each delivery is one POST of one event, `{ eventId, name, timestamp, data, cursor }`, signed with [Standard Webhooks](https://www.standardwebhooks.com/): - `webhook-id`, the event's `eventId`, unchanged across retries. Deduplicate on it. - `webhook-timestamp`, `webhook-signature` and `X-MCP-Subscription-Id`. Verify the signature with any Standard Webhooks library before trusting the body: ```js import { Webhook } from "standardwebhooks"; const event = new Webhook(process.env.TWELFTH_WEBHOOK_SECRET).verify(rawBody, headers); ``` To see it work end to end, create, close or reopen a project. That raises `project.updated` straight away, with no need to wait for a data refresh. Delivery rules: - A 2xx acknowledges the delivery. - Twelfth retries other failures after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours, then gives up. - `410` and `413` are never retried. - Redirects are never followed. - Events may arrive out of order. ## Related - [Generic MCP](/settings/ai-and-agents/mcp/) — the endpoint, tools, prompts and resources - [ChatGPT](/settings/ai-and-agents/chatgpt/) — connect ChatGPT - [API keys](/settings/ai-and-agents/api-keys/) — connect with a workspace key --- ## [Generic MCP](https://twelfth.ai/docs/settings/ai-and-agents/mcp/) --- title: Generic MCP description: Connect any MCP-capable assistant to a Twelfth workspace at api.twelfth.ai/mcp with OAuth or a bearer key. Read-only unless you allow changes. lastmod: 2026-10-19 --- # Generic MCP Any assistant that speaks the **Model Context Protocol (MCP)** can connect to a Twelfth workspace, even if it isn't in the named list. Twelfth exposes an MCP endpoint at `https://api.twelfth.ai/mcp`, **read-only** unless you [allow changes](#generic-mcp-allow-changes). It accepts an OAuth user token or a workspace bearer key. Reach the setup guide from **Settings → AI & agents → Generic MCP**. Use this when your client isn't [Claude](/settings/ai-and-agents/claude/), [ChatGPT](/settings/ai-and-agents/chatgpt/), [Gemini](/settings/ai-and-agents/gemini/), [Grok](/settings/ai-and-agents/grok/), [Glean](/settings/ai-and-agents/glean/), [Cursor](/settings/ai-and-agents/cursor/), [Claude Desktop](/settings/ai-and-agents/claude-desktop/), or [VS Code / Copilot](/settings/ai-and-agents/vscode-copilot/). The pattern is the same for every MCP client. [More assistants](/settings/ai-and-agents/more-assistants/) has the exact steps for Perplexity, Mistral Le Chat, Gemini Enterprise, Amazon Quick, Kiro, JetBrains Junie, Zed, Warp and Goose. ## Connect with OAuth If your client supports OAuth for a remote MCP server, add `https://api.twelfth.ai/mcp` as the server URL. Twelfth's discovery metadata starts the sign-in flow. Choose a workspace and allowed read tools on the consent screen. This connection reads as you, within your workspace role and remits; no key needs to be copied. End it from **Settings → AI & agents**. If you are signed out, Twelfth asks you to sign in before showing consent. The connection requires an existing account and a workspace you belong to. If you do not have an account, choose **Book a demo** from the sign-in page to request access. If you have an account but no workspace, accept an invitation, create a workspace, or book a demo for help getting started. ## Connect with a workspace key 1. In Twelfth, open **Settings → AI & agents**, go to the **Settings** tab and, under **API keys**, choose **Connect an agent → Generic MCP**. Twelfth creates a key for this connection, copies it to your clipboard, and starts waiting for Generic MCP's first request. Copy the key now if you need it again. Twelfth shows it only once. 2. In your client's MCP configuration, add a server with: - **URL / endpoint**: the Twelfth endpoint shown on the connection's row. - **Authorization**: a bearer token set to the key you generated. 3. Reload the client's MCP servers, then ask it to list Twelfth's tools to confirm the connection. ## Allow changes The consent screen also offers **Allow changes**, off unless you turn it on. With it on, an OAuth connection is offered the write tools you approve at consent, acting as you: - `twelfth_complete_action`: mark one of your open actions done. A price review or price change closes as reviewed, no action: prices are only changed in Twelfth. - `twelfth_snooze_action`: hide one until tomorrow or next week. - `twelfth_create_action`: create a task for you, with a title and details. - `twelfth_run_routine`: run one of your own routines. - `twelfth_update_agent_policy`: Twelfth staff with workspace owner/admin access can update managed chat defaults. Requires workspace MFA when enforced. They follow the same rules as the app's Tasks page, and every call is recorded against the connection. Figures, prices, orders and other workspace settings cannot be changed over MCP. Existing connections retain their task/routine permissions. Runtime access is always restricted to current Twelfth staff workspace admins; an older grant cannot bypass that restriction. Eligible staff must reconnect and approve the updated grant to enable chat-policy changes. A connection made without **Allow changes**, or before it existed, never sees these tools. Workspace keys never make changes. To turn it on or off, connect again; [Extensions](/extensions/#extensions-reading-and-allow-changes) has the details. ## Available tools The connection reads, unless you allowed changes. Its available tools depend on its saved selection, the workspace's capabilities and, for OAuth, the member's permissions. They include: - Get workspace identity and operating defaults. - List workspace members and their roles. - List open actions, including due dates, assignees, and available source context. - Read-only analysis tools for the visible work-unit snapshot and the caller's readable catalogue: sales metrics, product ranking, inventory position, product master, similar products, supplier constraints, supplier lookup, entity profiles and context, and methodology. Connected workspaces can also offer competitor price intelligence. Arbitrary warehouse SQL is reserved for Twelfth's staff-only diagnostic workspace. Tools that only make sense inside the in-app chat (asking the buyer a clarifying question, rendering a table or chart) are not offered over MCP. Tool results include `source_evidence_ids`; a later call can pass them back to refer to the same rows. An MCP key is a workspace credential and belongs to no one person. It reads the whole business, the way the owner or admin who created it does, and is not narrowed to any one buyer's remit. Apart from the approved [Allow changes](#generic-mcp-allow-changes) tools, these tools cannot write data or make changes in Twelfth. ## Prompts and resources Clients that support MCP prompts can offer Twelfth's ready-made briefs, often as slash-commands: **Weekly trading brief**, **Explain a recommendation**, **Competitor price check**, **Supplier review** and **Project status**. Each one walks the assistant through the read-only tools above. Clients that support MCP resources can pin standing context: the workspace, open actions, members and, where the workspace has them, project workflows, category settings, tracked pricing sets and integrations. A resource shows only what its matching tool would, so a connection limited to certain tools sees only those resources. ## Events An assistant can also **watch** the workspace and act when something changes: new recommendations, competitor price moves, project changes, or a fresh day of data. See [Events](/settings/ai-and-agents/mcp-events/). ## What Twelfth records about a connection Every call is logged against its connection: the tool name, whether it succeeded, when, and how long it took. Tool **results are never stored or sent to analytics**; only their size is. Workspace keys are stored hashed and shown once, at creation. Repeated failed authentication from one address is refused for a cooling-off period. ## Plugins and listings Where Twelfth is, or will be, listed: - **Claude** (Claude Connectors Directory): listing in review. Until then, add Twelfth as a custom connector. - **ChatGPT:** [install Twelfth from the marketplace](https://chatgpt.com/plugins/plugin_asdk_app_6abf0bd66e648191819596e2c82ac940), then sign in and choose your workspace. See the [ChatGPT setup guide](/settings/ai-and-agents/chatgpt/). - **Codex:** connect by command (below). - **Microsoft Copilot**, for Copilot Studio and Microsoft 365 Copilot: marketplace listing coming soon. Use **Copy install prompt** in Settings → AI & agents → Connect AI for custom setup. In Codex: ``` codex mcp add twelfth --url https://api.twelfth.ai/mcp && codex mcp login twelfth ``` Twelfth's server is published in the [Official MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=ai.twelfth/workspace&version=latest) as `ai.twelfth/workspace`, from the twelfth.ai domain. Clients and directories that read the registry can find it there. The open-source [twelfth-ai/twelfth-mcp](https://github.com/twelfth-ai/twelfth-mcp) repository holds the client side: the MCP configuration, a plugin for [Cursor](/settings/ai-and-agents/cursor/#connect-with-the-twelfth-plugin) and Claude Code, and a skill that helps an assistant use the tools well. In Claude Code: ``` /plugin marketplace add twelfth-ai/twelfth-mcp /plugin install twelfth@twelfth ``` The repository contains configuration only. The server itself is hosted by Twelfth, and every connection still signs in and follows your workspace permissions. ## Support Email **[hello@twelfth.ai](mailto:hello@twelfth.ai)** with any question about connecting an assistant, a tool that returns something unexpected, or access to your workspace. You can also use the form at [twelfth.ai/contact](https://twelfth.ai/contact). Include the assistant you are using (for example Microsoft Copilot, Claude or ChatGPT), the workspace name and roughly when it happened, so we can find the request. To use the connector you need an active Twelfth account in a Twelfth workspace. To get one, [book a demo](https://twelfth.ai/book-a-demo). ## Related - [AI & agents overview](/settings/ai-and-agents/): the shared connect flow and available tools - [Events](/settings/ai-and-agents/mcp-events/): let an assistant watch for changes - [API keys](/settings/ai-and-agents/api-keys/): create, name, tag, and revoke keys - [Vercel Connect](/settings/ai-and-agents/vercel-connect/): use Twelfth MCP from a Vercel app or agent --- ## [More assistants](https://twelfth.ai/docs/settings/ai-and-agents/more-assistants/) --- title: More assistants description: "Add Twelfth as a custom MCP connector in Perplexity, Le Chat, Gemini Enterprise, Kiro, Junie, Amazon Quick, VS Code, Zed, Warp and Goose." lastmod: 2026-10-19 --- # More assistants These assistants have no Twelfth listing to install from, but each one can add Twelfth as a **custom remote MCP connector** and sign in to it. You give the assistant one address: ``` https://api.twelfth.ai/mcp ``` The assistant then opens Twelfth in your browser. Sign in, choose the workspace and the tools to allow, and select **Allow access**. The connection reads as you, within your workspace role and remits, and no key is copied anywhere. It reads by default; it can change things only if you tick [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes) on the consent screen. End it from **Settings → AI & agents** in Twelfth. The steps below were checked against each vendor's own documentation on 2026-10-19. Menus move; if a label differs, look for "connectors", "MCP servers" or "custom connector" in the assistant's settings. If you are signed out of Twelfth, it asks you to sign in first. You need an existing account in a workspace; to get one, [book a demo](https://twelfth.ai/book-a-demo). ## Perplexity Custom connectors are on Pro, Max and Enterprise. On Enterprise an admin has to turn on **Allow members to add custom connectors** first. 1. In Perplexity, open **Customize → Connectors** (or **Plugins** in the sidebar), then **Add custom → Connector → Add MCP connector**. 2. Choose **Remote**. Set **Name** to `Twelfth`, **MCP Server URL** to `https://api.twelfth.ai/mcp`, **Authentication** to **OAuth** and **Transport** to **Streamable HTTP**. Leave the client ID and secret empty. 3. Tick the acknowledgement and select **Add**. 4. Select the new Twelfth card to sign in to Twelfth. An Enterprise admin can add it for the whole organisation from **Enterprise settings → Permissions → Connectors permissions → Custom connector**. [Perplexity's guide](https://www.perplexity.ai/help-center/en/articles/13915507-adding-custom-remote-connectors). ## Mistral Le Chat Only an admin can add a custom connector. On a personal plan, that is you. 1. In Le Chat, open **Connectors** and select **Add Connector**. 2. On the **Custom MCP Connector** tab, set the name to `twelfth` (no spaces) and the server URL to `https://api.twelfth.ai/mcp`. 3. Select **Connect**. Le Chat detects that Twelfth uses OAuth and opens the sign-in. Le Chat uses Twelfth's tools. It doesn't yet use MCP prompts or resources. [Mistral's guide](https://docs.mistral.ai/le-chat/knowledge-integrations/connectors/mcp-connectors/). ## Grok 1. Open [grok.com/connectors](https://grok.com/connectors) and select **New Connector**, then **Custom**. 2. Enter `https://api.twelfth.ai/mcp` and save. 3. Complete the sign-in Grok asks for. On Grok Business and Enterprise, a team admin adds the connector first, in the xAI console under **Grok Business → Connectors → Add Connector → Other**. If Grok does not offer a sign-in, connect with a workspace key instead: see [Grok](/settings/ai-and-agents/grok/). [xAI's guide](https://docs.x.ai/grok/connectors). ## Gemini Enterprise Gemini Enterprise needs an admin, and it does not register itself with Twelfth the way most assistants do. It asks for a client ID and secret made for its redirect address, `https://vertexaisearch.cloud.google.com/oauth-redirect`. 1. Email [hello@twelfth.ai](mailto:hello@twelfth.ai) to ask for a client ID and secret for Gemini Enterprise. Keep them in Google's form only. 2. In the Google Cloud console, open **Gemini Enterprise**, then your app's **Data stores → Create data store**, and search for **Custom MCP Server**. 3. Select **Add MCP server**. Set the server URL to `https://api.twelfth.ai/mcp`, the authorization URL to `https://api.twelfth.ai/api/auth/oauth2/authorize` and the token URL to `https://api.twelfth.ai/api/auth/oauth2/token`. Paste the client ID and secret, set the scopes to `openid profile email offline_access`, and tick **Enable PKCE Support**. 4. Select **Verify Auth**, sign in to Twelfth, then **Continue** and **Create**. 5. Under **Actions**, select **Reload custom actions**, then enable the Twelfth actions. Organisations that govern MCP servers through Agent Registry can register the same server there and add it from **Connected data stores → New data store → MCP servers**. [Google's guide](https://docs.cloud.google.com/gemini/enterprise/docs/connectors/custom-mcp-server/set-up-custom-mcp-server). ## Amazon Quick Needs an Amazon Quick Enterprise subscription. 1. In Amazon Quick, open **Connectors**, go to **Create for your team** and choose **Model Context Protocol (MCP)**. 2. Set the name to `Twelfth`, the **MCP server endpoint** to `https://api.twelfth.ai/mcp`, and the connection type to **Public network**. Select **Next**. 3. Choose user authentication, then **Create and continue**. Each person signs in to Twelfth the first time they use it. 4. Share the connector with the people who should use it. Quick does not pick up new tools by itself. Select **Sync** on the connector after Twelfth adds tools. [Amazon's guide](https://docs.aws.amazon.com/quick/latest/userguide/mcp-integration.html). ## Kiro Kiro (formerly Amazon Q Developer) reads MCP servers from `.kiro/settings/mcp.json` in a project, or `~/.kiro/settings/mcp.json` for every project: ```json { "mcpServers": { "twelfth": { "url": "https://api.twelfth.ai/mcp" } } } ``` Save the file. Kiro opens the Twelfth sign-in the first time it uses the server. [Kiro's guide](https://kiro.dev/docs/mcp/configuration/). ## JetBrains Junie Junie reads `.junie/mcp/mcp.json` in a project, or `~/.junie/mcp/mcp.json` for every project, in both the CLI and the IDE plugin: ```json { "mcpServers": { "twelfth": { "url": "https://api.twelfth.ai/mcp" } } } ``` The server shows **Authorization required**. Open its menu, select **Authorize**, and sign in to Twelfth in the browser. The status changes to **Active**. [JetBrains' guide](https://junie.jetbrains.com/docs/junie-cli-mcp-configuration.html). ## VS Code See [VS Code / Copilot](/settings/ai-and-agents/vscode-copilot/) for the one-click install. To add it by hand, run **MCP: Add Server** from the command palette, choose **HTTP**, enter `https://api.twelfth.ai/mcp`, and name it `twelfth`. ## Zed 1. Open **Settings → AI → MCP Servers** and select **Add Server → Add Remote Server**. 2. Or add it to `settings.json` yourself: ```json { "context_servers": { "twelfth": { "url": "https://api.twelfth.ai/mcp" } } } ``` 3. Zed opens the Twelfth sign-in, because the server has no authorization header set. [Zed's guide](https://zed.dev/docs/ai/mcp). ## Warp 1. Open **Settings → Agents → MCP servers** and select **Add**. 2. Choose **Streamable HTTP or SSE Server (URL)** and paste: ```json { "mcpServers": { "twelfth": { "url": "https://api.twelfth.ai/mcp" } } } ``` 3. Start the server. Warp opens the Twelfth sign-in and keeps the credentials on your device. Warp's cloud agents can't run a sign-in themselves. Use Twelfth from Warp on your own machine. [Warp's guide](https://docs.warp.dev/agent-platform/capabilities/mcp/). ## Goose In Goose Desktop, open **Extensions → Add custom extension**, set the type to **Streamable HTTP**, the name to `Twelfth` and the URL to `https://api.twelfth.ai/mcp`, then select **Add**. In the Goose CLI, run `goose configure`, choose **Add Extension → Remote Extension (Streamable HTTP)** and enter the same URL. Goose opens the Twelfth sign-in the first time it uses the extension. [Goose's guide](https://goose-docs.ai/docs/getting-started/using-extensions). ## Not covered - **Manus** documents only API keys and bearer tokens for custom MCP servers. An owner or admin can still connect it with a [workspace key](/settings/ai-and-agents/mcp/). - **JetBrains AI Assistant** documents no sign-in for remote MCP servers. Use Junie, above. - The **xAI API**'s remote MCP tool takes a bearer token, so it needs a workspace key: see [Grok](/settings/ai-and-agents/grok/). ## Related - [AI & agents overview](/settings/ai-and-agents/): the shared connect flow and available tools - [Generic MCP](/settings/ai-and-agents/mcp/): the endpoint, tools, prompts and what Twelfth records - [API keys](/settings/ai-and-agents/api-keys/): create, name, tag, and revoke keys --- ## [Vercel Connect](https://twelfth.ai/docs/settings/ai-and-agents/vercel-connect/) --- title: Vercel Connect description: Connect a Vercel app or agent to Twelfth's MCP tools for products, sales, inventory, suppliers and pricing, using OAuth or a workspace key. lastmod: 2026-10-19 --- # Vercel Connect [Vercel Connect](https://vercel.com/docs/connect) can hold a Twelfth connection for a Vercel app or agent. Twelfth's developer-facing resource is an **MCP server that reads by default** at: ```text https://api.twelfth.ai/mcp ``` It offers workspace context and analysis tools for products, sales, inventory, suppliers, pricing and projects. The tools available depend on the workspace's capabilities and the connection's permissions. Twelfth's separate public REST API currently exposes workspace identity and current tasks; the app's `/api/...` routes are not a substitute for either supported surface. ## Connect as a person with OAuth Use `https://api.twelfth.ai` as the OAuth server URL in Vercel Connect. Twelfth publishes [OAuth server metadata](https://api.twelfth.ai/.well-known/oauth-authorization-server) and [MCP protected-resource metadata](https://api.twelfth.ai/.well-known/oauth-protected-resource). Vercel can discover the authorization and token endpoints and register its client dynamically. Authorize with a **user token**. Twelfth asks you to sign in, choose one workspace, and select the read tools this connection may use. Calls then follow your membership and readable remits. A connection for another workspace requires another authorization. You can end the connection under **Settings → AI & agents** in Twelfth. ## Connect a server with a workspace key For unattended access, a workspace owner or admin can create a key under **Settings → AI & agents → Create an API key**. Give it a name, environment tag and allowed read tools. Twelfth displays the key once. Store it in Vercel Connect as an API-key credential and send it to the MCP endpoint as `Authorization: Bearer `. A workspace key reads the workspace data permitted by its selected tools, independently of an individual member's remits. Give each automation its own key so it can be revoked without affecting others. ## API support and limits - The MCP connection reads by default. A user-token connection can also create, complete or snooze the person's own actions and run their own routines, only if they turn on [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes); a workspace key never changes anything. No connection can change settings, create projects, issue keys or connect other services. - OAuth access requires a signed-in member. Twelfth's MCP tools cannot use an app-only OAuth token because it has no chosen workspace. - MCP tools are available at `/mcp` and the historical compatibility alias `/v1/mcp`; they are protocol endpoints, not a REST resource catalog. New integrations should use `/mcp`. See [AI & agents](/settings/ai-and-agents/) for the tool catalog and permissions, [Generic MCP](/settings/ai-and-agents/mcp/) for client configuration, and [API keys](/settings/ai-and-agents/api-keys/) for key management. --- ## [VS Code / Copilot](https://twelfth.ai/docs/settings/ai-and-agents/vscode-copilot/) --- title: VS Code / Copilot description: Add Twelfth to VS Code, GitHub Copilot and Copilot CLI for a connection to your workspace that reads by default, in one click or two commands. lastmod: 2026-10-19 --- # VS Code / Copilot Connect **VS Code** and **GitHub Copilot** to the active workspace by adding Twelfth as an [MCP](/settings/ai-and-agents/mcp/) server. The connection **reads by default** and changes nothing unless you turn on [Allow changes](/settings/ai-and-agents/mcp/#generic-mcp-allow-changes). Reach it from **Settings → AI & agents → VS Code / Copilot**. ## Connect The simplest route needs no key: in Twelfth, open **Settings → AI & agents → Settings** and select **Install in VS Code** under **Developer tools**. VS Code opens with Twelfth filled in. Sign in when it asks, then choose the workspace and tools. The steps below use a workspace key instead, for owners and admins who need one. 1. In Twelfth, open **Settings → AI & agents**, go to the **Settings** tab and, under **API keys**, choose **Connect an agent → VS Code / Copilot**. Twelfth creates a key for this connection, copies it to your clipboard, and starts waiting for VS Code / Copilot's first request. Copy the key now if you need it again, because Twelfth shows it only once. 2. In VS Code's MCP configuration, add a server pointing at the Twelfth **endpoint** shown on the connection's row, with the key Twelfth just copied for you. 3. Reload VS Code's MCP servers, then ask Copilot to list Twelfth's tools to confirm the connection. Follow the exact steps on the connection's row in Twelfth. It carries the current endpoint and the ready-to-paste MCP server entry for your workspace. ## GitHub Copilot CLI Copilot CLI installs Twelfth as a plugin from the open-source [twelfth-ai/twelfth-mcp](https://github.com/twelfth-ai/twelfth-mcp) repository. The plugin adds the Twelfth server and a skill that helps Copilot use its tools. ```sh copilot plugin marketplace add twelfth-ai/twelfth-mcp copilot plugin install twelfth@twelfth ``` Run `copilot mcp list` to confirm: **twelfth** appears under plugin servers. The first time Copilot calls a Twelfth tool, it sends you to Twelfth to sign in, choose the workspace and approve the read tools. No key is involved. ## Related - [AI & agents overview](/settings/ai-and-agents/) — the shared connect flow and available tools - [Generic MCP](/settings/ai-and-agents/mcp/) — the underlying connection any MCP client uses - [API keys](/settings/ai-and-agents/api-keys/) — create, name, tag, and revoke keys --- ## [Briefings & alerts](https://twelfth.ai/docs/settings/briefings-and-alerts/) --- title: Briefings & alerts description: "The workspace's starting point for every person's brief and alerts: delivery time, channel, the Monday deep brief, and which alerts are on by default." lastmod: 2026-10-06 --- # Briefings & alerts Open **Settings → Business → Briefings & alerts**. These controls set the starting point for every person's regular brief and alerts. A person keeps the workspace default until they choose their own under [Notifications](/settings/notifications/); changing a default here changes it for everyone who has not. Owners and admins can change them. ## Briefing defaults | Control | What to choose | | --- | --- | | Briefing delivery time | When the team's morning brief should arrive. For example, 6:00 AM gives people time to read it before the workday. | | Briefing channel | Email and in-app for both places, email for inbox-only delivery, or in-app to keep briefs inside Twelfth. | | Monday deep brief | Turn this on when the team should receive a longer weekly portfolio and category read at the start of the week. | ## Default alerts These are the alerts new members receive unless they make a personal choice. Every alert starts **off**. Nobody receives notification email until an alert is turned on here or in a member's personal settings. Turn on only the signals the whole team should see by default. | Alert | When to use it | | --- | --- | | Decide-today alerts | People need to know that a decision is ready for their sign-off. | | Above-threshold escalations | A commercial signal has passed a workspace [guardrail](/settings/guardrails/) and needs attention. | | Promo lock-date reminders | The team needs notice before a promotion reaches its commitment date. | | Weekly digest | A regular portfolio and category summary. | ## Related - [Notifications](/settings/notifications/): each person's own choices - [Daily briefing](/briefing/): what the brief contains - [Comms & chat](/settings/comms/): the surfaces a brief can be delivered to --- ## [Calendars](https://twelfth.ai/docs/settings/calendars/) --- title: Calendars description: Trading, promotion and custom calendars, read from a shared Google Sheet, a monday.com board or a Google Calendar, or updated through chat. lastmod: 2026-10-14 --- # Calendars Open **Settings → Calendars** to keep the calendars your team trades against: a **trading** calendar (periods, key dates, public holidays, store trading), one or more **promotion** calendars (which products are on promotion, week by week), and any **custom** calendar you keep dates in (range reviews, supplier windows, events). Every calendar has one source of truth. Twelfth reads it; it never edits your spreadsheet or calendar on its own. The one exception is on request: an admin can have Twelfth add a calendar tab to a spreadsheet (see below), and even then Twelfth only ever writes into a new or empty tab, once, before linking it. New to planning calendars in Twelfth? [What Twelfth does with your trading and promotion calendars](https://twelfth.ai/integrations/calendars) gives the overview. ## What is available now | Capability | Status | What it means | | --- | --- | --- | | Trading, promotion and custom calendars | Available | Keep separate calendars for trading periods and key dates, product promotions, or other dated business context. | | Workspace and remit scopes | Available | Share a calendar across the workspace, or keep it to one buying remit, or to several when the same plan covers more than one. | | Google Sheets sync | Available | Read one tab from a spreadsheet shared with Twelfth. Twelfth checks and saves how its columns map to calendar fields. Share as Editor and Twelfth can also create and fill the tab for you in one click. | | Google Calendar sync | Available | Connect a Google account, choose a calendar and read its events in the selected timezone. | | monday.com sync | Available | Connect your monday account, choose the board your team already plans on, and Twelfth reads its items. Optionally narrow it to one group. Read-only: Twelfth never edits a board. | | Outlook Calendar sync | Available | Connect a Microsoft 365 account under [Integrations → Microsoft 365](/settings/integrations/microsoft-365/), choose a calendar and read its events in the selected timezone. Read-only. | | Excel workbook sync | Available | With the same Microsoft 365 account, choose a workbook from OneDrive or SharePoint (or paste its link) and a worksheet. Twelfth checks and saves how its columns map to calendar fields, exactly as for a Google Sheets tab. Reading is the normal sync; an admin can separately grant write access for a requested template worksheet. | | Updates through chat | Available for unlinked calendars | Paste or attach calendar material, then review a complete proposed update before applying it. | | Calendar context in Twelfth AI | Available | Mention an accessible calendar with **@**, or let Twelfth consult relevant calendars when dates affect a buying, forecasting or performance question. | | Two-way or outbound sync | Not currently available | Twelfth does not create, edit or delete events or spreadsheet rows in an external source. | The current model is deliberately source-owned: your spreadsheet or external calendar remains authoritative, and Twelfth only reads from it. This prevents an automated update from silently changing the plan your team works from. ## Calendar type and scope Choose a **calendar type** at the top of the page, then what it **applies to**: the whole workspace, or one or more buying remits. The picker lists the whole workspace first, then your own remits, then the rest; tick as many remits as the calendar covers. A workspace can hold as many calendars as it needs of each type: for example, a shared trading calendar plus a promotion calendar per remit. Pages that use calendars read every calendar of a type that applies to their scope, so a remit's promotion view combines the workspace-wide promotion calendar with every calendar that names that remit. A calendar scoped to several remits is readable by anyone who holds any one of them, and editable only by a workspace admin or by someone who holds all of them, because the other remits' dates are in there too. **Add calendar** creates a new one of the selected type (name it whatever your team calls it). Workspace admins can add and delete calendars anywhere; deleting one requires entering its title in a confirmation dialog. A remit owner can add and update calendars in their own remits. People only see calendars within their access. ## Calendar and sync setup The calendar choices, selected calendar details and its two views share one continuous panel. **Calendar** shows the dated entries and its date-range controls. **Sync setup** holds the source, direction, spreadsheet mapping and connection management. Calendar sync is currently **inbound and read-only**: the source flows into Twelfth, and Twelfth does not publish changes back to it. "Sync" here means that Twelfth reads the current source when the calendar is needed. There is no separate copy to edit in Twelfth, and the connection is not two-way. For shared Google files, see [Sharing and access](/settings/integrations/google-files/sharing/). For Outlook and Excel permissions and template creation, see [Microsoft calendars and Excel plans](/settings/integrations/microsoft-365/calendars-and-excel/). ## Link a source When you add a calendar, **How will it be kept up to date?** lists every source this deployment can offer, including Outlook and Excel if your workspace has not connected Microsoft 365 yet. Connecting is part of the setup that follows. A workspace admin can link each calendar to: - **Google Sheets · shared with Twelfth**: share the spreadsheet with the address shown on the page (as *Viewer* to read it; as *Editor* if you want Twelfth to add the tab for you) and paste its link. Twelfth finds the spreadsheet, chooses an obvious tab (for example *Promotions* for a promotion calendar), and checks it automatically. Nobody has to sign in to Google, and Twelfth never asks for access to your Drive. The sheet must be owned or shared by someone in your workspace; a sheet shared by someone outside it is refused. - **Google Calendar**: connect the account and choose the calendar and the timezone dates should appear in. After connecting, you return to this calendar's Sync setup with Google Calendar selected; the **Sync setup** tab marks the calendar as *incomplete* until one is chosen. - **monday.com**: connect your monday account once for the workspace, then choose a board. Every board that account can see is listed, named by its workspace. Leave **Group** on *Whole board*, or pick a group when the board holds several plans. Twelfth then checks the board's columns exactly as it checks a spreadsheet. - **Outlook Calendar**: connect the workspace's Microsoft 365 account (the *Outlook calendars* permission) and choose the calendar and the timezone. The grant itself is managed under [Integrations → Microsoft 365](/settings/integrations/microsoft-365/); disconnecting there stops every calendar on that account. - **Excel workbook**: with the *OneDrive & SharePoint files* permission on the same Microsoft 365 account, choose a workbook the account opened recently or was shared, or paste its OneDrive/SharePoint link, then choose the worksheet. Twelfth reads the worksheet as a grid and checks its columns exactly as it checks a Google Sheets tab. Twelfth never writes to the workbook. A linked source is read when the page opens, when you return to it, and every five minutes while it is open. The source name and fetch time appear in Sync setup. **Open source** takes you back to the source to make changes. If a read fails, Twelfth shows the error and retries automatically when the view regains focus. Questions and product views also read the applicable calendars on demand. A source change therefore appears on the next successful read; it does not require importing a new copy. If several calendars apply to the same remit, Twelfth combines their entries while keeping each calendar's source and any read error separate. One spreadsheet can hold calendars for several teams or remits. Choose **Use an existing tab** to select and map one already in the spreadsheet. Choose **Start with a new tab** to have Twelfth add one. ### Start with a new tab If the spreadsheet is shared with Twelfth as **Editor**, this is one click: name the tab (Twelfth suggests *Promotions*, *Trading* or *Calendar*), and **Create tab and sync** adds it with the right header row, writes in whatever the calendar already holds in Twelfth (entries applied from chat, for example), and links it. That is the initial sync: what Twelfth had moves into the sheet. From then on the tab is the source of truth, exactly as for any linked tab, so rows your team types or pastes in afterwards are read by Twelfth on the next refresh. Twelfth never writes to the tab again after that click. If Twelfth is only a **Viewer**, it cannot add a tab, and the page says so. Either re-share as Editor, or do it by hand: **Copy template headers**, open Google Sheets, paste them into A1 of a new tab, then choose that tab under **New tab, once created**. The by-hand path is always available, whatever the share. ### Use an existing tab Choosing an existing tab means you want what is in it: Twelfth checks and maps its columns and links it read-only. Two caveats, both stated on the page: - **Linking does not merge.** If the calendar already holds entries in Twelfth, linking a populated tab clears them: the tab is the source from then on and the only copy. Move them into the sheet first if you want to keep them (see below), or start with a new tab. - **An empty or header-only tab can be filled from Twelfth.** When the chosen tab is blank, **Set up … and sync** writes the template headers and Twelfth's entries into it, then links it — the same as starting with a new tab. When the tab has its own headings but no rows, **Write … entries into …** writes Twelfth's entries beneath them, in the tab's column order, using the mapping shown under **Reads as** (Twelfth refuses rather than drop a field the tab has no column for). Both need an Editor share; a tab that already has rows is never written to. Twelfth updates and checks tabs automatically when you return. A tab with the correct headers can be linked before it contains any events. ### Checking a spreadsheet Before a tab is linked, Twelfth checks it automatically and shows what it found: each column and the field it **reads as**, anything required that is missing, how many rows read cleanly, a preview of the first rows, and any row that would be rejected. The headings do not have to be on row 1. A title row or blank row above them is skipped, grouped headings above the heading row are folded in, and the check says which rows it read them from. A column with no heading (a checkbox column, say) is ignored. Each column also shows what its values **look like** (dates, codes, numbers, text) with a sample, because the values decide as much as the heading: with an *ETA* full of month names and an empty *Embargo date*, the ETA is the start. A second SKU column is left unmapped for you to choose, and any number of columns can read as **Note** (each keeps its heading in the note). When the sheet has a SKU column, a *Supplier* column is left alone: the product is linked, so its supplier, brand and category come from your catalogue rather than the sheet. The **Reads as** picker explains each field and the kind of value it takes. Headings such as *Name*, *Starts*, *Ends*, *SKU*, *Kind*, *Product*, *Affects*, *States*, *Assignee* and *Note* are recognised automatically, including common variants (*Start date*, *Title*, *Product code*, *Region*, *Owner*). Twelfth suggests a mapping for unfamiliar headings with AI when it is available and falls back to the familiar heading matches. Every result remains editable under **Reads as**, and changing a mapping re-runs the check. The mapping is saved with the link and applied on every read. In the promotion grid, months and week-ending dates are shown on separate header rows. Hover a promotion mark, or focus it with the keyboard, to see the promotion name, full date range and any available context. **Assignee** is optional and holds whoever owns the row, such as a buyer, planner or category manager. Headings such as *Owner*, *Assigned to*, *Buyer*, *Responsible* and *Contact* are recognised automatically, and a monday **people** column is mapped to it from the board's own column type whatever the column is called. It is shown as a column on the calendar table and in a promotion's details, and the assistant can answer "whose promotion is this" from it. **Name** (or **Product**) and **Starts** are required. In a promotion calendar every row also needs a **SKU** (a promotion on one product) or an **Affects** value naming the category, brand or supplier it covers (a promotion across a range); the grid gives a range promotion its own line under that name. A missing end date means a single day. Dates are read as typed: native sheet dates, `2027-03-12`, `7-Mar-2022`, `12 March 2027`, `Mar 2027`, and `12/03/2027` read day-first (Australian) unless the column shows otherwise. A bare month (`July`) or span (`Sept/Oct`) runs the whole month when the tab's title names a year (*2027 Pre-Orders*); without one the row is reported. `NOW`, `TBC` and the like are not dates. A formula error only matters in a column the calendar reads. SKUs keep their displayed leading zeros. A header-only tab can be linked while empty; after that, every populated row must read cleanly, so nothing partial or wrong reaches a buying page. ### Checking a monday board A monday board is a table, so Twelfth reads it the same way it reads a spreadsheet tab: each column is shown with the field it **reads as**, along with anything required that is missing, how many items read cleanly, a preview, and any item that would be rejected. Twelfth adds three columns at the front: the item's **ID** (so an entry keeps its identity when someone renames the item), its **Name**, and its **Group**. Twelfth uses the board's own column types where they settle the question: a **timeline** column arrives as two columns, its start and its end, already mapped, and the first **people** column is mapped to **Assignee** whatever it is called (*Owner*, *PIC*, *Squad*). Date columns are read from their real date, not from however monday displays it, so there is no timezone to choose. Everything else competes on its heading, exactly as a spreadsheet's headings do: a *Launch date* column is recognised, an unfamiliar heading gets an AI suggestion, and anything can be corrected under **Reads as**. Mirror and formula columns are read as the value monday shows. A promotion calendar from monday still needs a **SKU** column (one product) or an **Affects** column naming the category, brand or supplier (a range). Map whichever column on the board holds it. Twelfth reads a board at most once a minute, however many people have the page open, so a linked board does not consume your monday account's daily API allowance. ### Checking a calendar Choosing a Google or Outlook calendar reads it over the date range shown on the Calendar tab and shows what it holds before anything is linked: how many events there are, a preview table of the ones that read cleanly, and each event the link would refuse and why. A calendar links only when every event in the range reads cleanly (an empty calendar can be linked and filled later). A public-holidays or team calendar belongs in a **trading** calendar, where every dated event is welcome; it is refused as a promotion calendar because its events name no product or range. For a promotion calendar from Google Calendar, use a dedicated calendar and give each event description a `SKU: …` line (one product) or an `Affects: …` line naming the category, brand or supplier (a range). Optional `Product: …`, `States: …`, `Assignee: …` (or `Owner: …`) and `Kind: …` lines add context. Recurring events and cancellations are reflected in the view. ## Calendars in AI chat Twelfth AI knows which calendars your workspace keeps. Type **@** in any chat composer and pick a calendar, such as **@Trading** or **@Promotions**, to have the answer read it and relate what it finds (an upcoming Black Friday, a promotion on a product, a public holiday in a quiet week) to the figures in the answer. You do not have to mention one: when timing bears on a buying, forecasting or performance question, Twelfth consults the relevant calendar on its own and says so. It only ever reads calendars within your access, and only the dates in the window the question is about. ## Update in chat Without a linked source, choose **Update in chat** to leave Settings and open a new full-page chat with an editable prompt for that calendar. Paste or attach the calendar material, adjust the request if needed, then send it when you are ready. Twelfth reads the existing calendar and prepares a complete replacement for review; if no calendar of that type exists yet, it creates one to hold the proposal. Open the review link, check the entries, and choose **Apply update** or **Discard update**. There are no event-entry forms or editable calendar cells. A linked source cannot be overwritten through chat. To change that workflow, an admin can unlink the source; the calendar then starts empty until a new source is linked or an update from chat is applied. ## What we will do next We will keep improving spreadsheet setup, automatic column mapping and recovery when a source changes. Longer term, we will evaluate additional calendar sources and reviewable outbound workflows with customers. The principle is that Twelfth comes to where your plan already lives rather than asking your team to move it. Two-way sync and direct event editing are not committed features today: they need explicit ownership, conflict handling and review controls before Twelfth can safely write to a team's source of truth. This page will be updated as planned capabilities become available; the status table above is the current source of truth. An account marked **Not configured in this environment** needs its OAuth configuration completed by the workspace operator before it can connect. If a linked account loses access, use **Reconnect account** or have the source owner restore access. --- ## [Categories & remits](https://twelfth.ai/docs/settings/categories/) --- title: Categories & remits description: "The managed category registry: curate the categories your team trades and give them names people recognise, while the data keys underneath stay fixed." lastmod: 2026-10-06 --- # Categories & remits Open **Settings → Categories & remits** for the set of categories your team trades. The page has two views: **Categories** (this guide) is the set itself; **[Remits](/people/)** is who owns each part of it. Twelfth seeds the categories from your product data and lets you give each one a friendly name that people recognise. The underlying data keys stay fixed, so nothing downstream breaks when you rename. ## Where categories come from Every product carries a raw category value from the system it was imported from, often terse or inconsistent (`hair-beauty`, `Hair & Beauty`, `HAIRCARE`). Twelfth **ingests** the distinct values it finds and turns each into a managed category with: - a **stable key**: a slug derived from the raw value (`Hair & Beauty` → `hair-beauty`) that never changes, so anything referencing the category keeps working; - a **friendly label**: Title Case by default, and yours to edit; - one or more **aliases**: the raw values that map to this category. Every raw value maps to exactly one category, so a label can float above messy data and two raw values can merge into a single row; - a **product count**: how many products currently sit under it. ## Reconcile new categories As products change, new raw values appear in the data. They surface at the top of the page as a **reconcile queue** (_"3 new categories in your data"_), with the raw value and how many products carry it. For each one you can: - **Add as new**: create its own managed category (repeat, or use **Add all as new** to accept the batch); or - **Map into…**: fold it into a category you already have. This is how you merge variants: point `HAIRCARE` at the existing **Haircare** and both raw values now roll up together. ::: callout note "Nothing is deleted" When you map a raw value away and an ingested category is left with no aliases, Twelfth **archives** it rather than deleting it. It drops out of pickers, but if the same key re-appears in the data later it reactivates the same row instead of forking history. ::: ## Rename a category Under **Managed categories**, edit any label inline and save. Only the friendly name changes. The key and the raw aliases underneath are untouched, so reports, remits, and recommendations that reference the category keep pointing at the same data. Use **Check for new** to re-scan your product data for raw values that have appeared since you last reconciled. ## Open a category Click any row to open the category's own page. It has two tabs: - **SKUs**: every product filed under this category, searchable and sortable, filterable by remit and supplier. A category spans remits, so the remit column is usually the one you want; the list is narrowed to the remits you can read. - **Settings**: how demand is measured for these SKUs. The page's address carries the category's id rather than its name, so a link keeps working after a rename. Right-click a category badge, or long-press it on a touch screen, to filter the table you are currently reading to that category or open the category's page. Selecting the active category again clears that filter. In places that cannot be filtered by category, the menu keeps the link to the category page. ## How demand is measured Two numbers on the **Settings** tab decide what the Demand columns mean on every buy, price and transfer review for SKUs in this category: - **Sales window**: how far back **Units / wk** looks. A 28-day window and a 90-day one describe the same SKU very differently. Hover the column header on any review grid and it names the window in force. - **Cover target**: the cover this category aims to hold. **Cover** is shaded against it: well under target reads as thin, well over as money sitting still. Without a target, a cover figure is shown but not shaded. Each number shows where it came from (**Workspace default** or **Set for this category**), so you can tell an inherited value from a deliberate choice. ::: callout note "Cover is derived, not imported" Cover is the stock on hand divided by the **Units / wk** shown beside it, so the two columns can't contradict each other. Where your source system reports its own days-of-cover figure, it's kept in the row's evidence as *Days cover (source)*. If the two disagree, you can see both; Twelfth does not reconcile them for you. A SKU with stock and no sales reads **No sales**, not a very large number; one selling with none on hand reads **Out of stock**; and a SKU whose sales rate was never reported shows an em dash, because "we don't know" is a different fact from zero. ::: ## Who can edit - **Owners and admins** can add, map, merge, and rename categories. - **Everyone else** sees the current set read-only. - **The demand settings are managed by Twelfth.** They change what every buyer sees, so they're set by us rather than per workspace. You can always see the numbers in force. If they don't match how your team reads demand, tell us and we'll change them. ## Categories power remits The categories you curate here are the same set people are assigned on the [Remits](/people/) view of this page. Category remits are picked from this registry rather than typed as free text, so everyone's ownership refers to the same curated set. ## Related - [Remits](/people/) - [Suppliers](/settings/suppliers/) - [Settings overview](/settings/overview/) --- ## [Google Chat](https://twelfth.ai/docs/settings/comms/gchat/) --- title: Google Chat description: Ask Twelfth in Google Chat, in a direct message or by @mentioning it in a space, once a workspace owner or admin turns Google Chat on in Settings. lastmod: 2026-10-15 --- # Google Chat Ask Twelfth in a direct message or @mention it in a space. Owners and admins connect under **Settings → Comms & chat → Google Chat**. Until the Marketplace listing is live, [contact Twelfth](https://twelfth.ai/contact) to make the app available to your domain. ## Add to Google Chat Two steps are needed, in either order: 1. A Twelfth admin chooses **Add to Google Chat** and approves access. 2. Your Google Workspace admin or each user installs the app in Google Chat. The Google grant reads spaces and the organisation directory to recognise people. Twelfth sends replies as the app, not as the connecting person. ## How it works Twelfth receives direct messages and @mentions, not the rest of a space. Answers use the recognised asker's Twelfth access and are visible in that chat. An unlinked participant in an existing shared thread needs an approved [thread category](/settings/comms/#category-access-in-shared-threads). ### When Twelfth doesn't recognise someone Use the one-time sign-in link in its reply; it lasts 30 minutes. If only the connecting person is recognised, ask your Google Workspace admin to check **Directory → Directory settings → Contact sharing**. ## Manage **Manage** shows the connected identity and spaces where the app has been added or mentioned. **Disconnect Google Chat** removes Chat access only. **Disconnect Google** revokes the shared grant, also affecting Search Console, Merchant Center and linked Google Calendar sources. --- ## [Comms & chat](https://twelfth.ai/docs/settings/comms/) --- title: Comms & chat description: Connect Slack, Google Chat or Microsoft Teams so Twelfth can post into the channels and spaces your team already works in. lastmod: 2026-10-14 --- # Comms & chat Open **Settings → Data & AI → Comms & chat** to connect the messaging tools your team uses. Use them to ask Twelfth in a channel, space or direct message. Operational data connections have their own [Integrations](/settings/integrations/) page. Only workspace owners and admins can change comms connections. Each tool shows a status (**On**, **Off**, or a warning such as *Bot not configured — cannot post yet*) and a single action to connect or, once connected, **Manage**. ## Providers Each provider has its own setup and management guide: - **[Slack](/settings/comms/slack/)**: install the Twelfth app into your Slack workspace and choose the channels it can post to. - **[Google Chat](/settings/comms/gchat/)**: post into Google Chat spaces using your workspace's shared Google grant. - **[Microsoft Teams](/settings/comms/teams/)**: your Microsoft 365 admin installs the Twelfth app once; then ask Twelfth in a chat or @mention it in a channel. Available on request. ## Follow-ups without a mention Once Twelfth has answered in a Slack or Teams channel thread, your team can keep asking in that thread without naming it again. Twelfth weighs each message it receives there: a follow-up gets an answer, a thank-you gets a 👍, and a conversation between colleagues gets no reply. When it is unsure, it does not reply. **Settings → Comms & chat → Follow-ups without a mention** sets this for the whole workspace. Choose **Only when @mentioned** and Twelfth answers when it is named or messaged directly, and is silent otherwise. Only owners and admins can change it. Google Chat is unaffected either way: Google only delivers messages that name the app, so Twelfth answers there when @mentioned whichever setting is chosen. Microsoft Teams needs app version 1.1.0 (see [Teams](/settings/comms/teams/)). ## Category access in shared threads Answers in a shared channel, space or group chat are visible to its participants. Twelfth uses a recognised asker's own category access. For a person without a linked Twelfth account, an owner or admin can choose **one category** for that thread on the provider's Manage page under **Conversations**. Only then may Twelfth answer that person's queued messages, using the conversation creator's current access limited to the chosen category. Choose a category only when its data may be shared with everyone in that thread. With no category chosen, the message waits until the person's account is linked. Direct messages never use the shared-thread category setting. A paused member cannot use it either. ## Who is told when a surface breaks If a surface stops working for your workspace (a revoked Slack token, a withdrawn Google grant, the Teams app removed from a team), Twelfth emails your ops contacts with what broke and what to do, at most once a day per problem. By default that is every owner and admin. The list is chosen once, for every surface and every integration, under **Settings → Admin → [Operational alerts](/settings/operational-alerts/)**; each surface's own page shows its **Health** and the addresses that would be told. ## Related - [Integrations](/settings/integrations/) — the operational systems Twelfth reads from - [Operational alerts](/settings/operational-alerts/) — who is emailed when a surface or integration breaks - [Notifications](/settings/notifications/) — how each person receives briefings and alerts --- ## [Slack](https://twelfth.ai/docs/settings/comms/slack/) --- title: Slack description: Connect Slack, ask Twelfth in a channel or direct message, save answers to a channel canvas, and understand who can see them. lastmod: 2026-10-15 --- # Slack Ask Twelfth in a channel or direct message. Owners and admins connect under **Settings → Comms & chat → Slack → Add to Slack** and approve the install. Add Twelfth to the channels it should use, including private channels. ## Asking in a channel @mention **twelfth** to start a thread. Follow-ups can omit the mention once it has answered. Owners and admins can turn this off under [Follow-ups without a mention](/settings/comms/#follow-ups-without-a-mention). Your Slack email must match your Twelfth membership. Answers follow your access and are visible to everyone in the thread. An unlinked participant needs an admin-approved [thread category](/settings/comms/#category-access-in-shared-threads). ## Direct messages and questions in progress Use a direct message for a private question. An 👀 reaction means Twelfth is working. Follow-ups can queue behind the current answer; Twelfth tells you when it has queued one. Continue the same conversation in Twelfth if you prefer. ## Use a channel canvas Twelfth can read the channel's canvas as background context, up to 6,000 characters, cached for five minutes. Your data access stays the same. Missing or unreadable canvases do not stop answers. ### Save an answer 1. React 📝 or 📌 on **Twelfth's answer in a channel**. 2. It is saved under **Saved from twelfth**, with your name and the date. 3. A ✅ confirms the save. You need a recognised Twelfth membership. A canvas is created if the channel has none and its Slack plan allows one. Keep the section heading for later saves. If saving fails, Twelfth privately explains why. Missing permissions require a Slack admin to reinstall the app and approve the updated access. ## Reactions in Slack and Twelfth Reactions on completed Slack questions and answers also appear in Twelfth. Reactions added in Twelfth appear in Slack **as the Twelfth bot**. ## Manage **Manage** shows the connected workspace, channels, custom emojis and connection settings. Disconnecting revokes the bot token and stops Slack posting. --- ## [Microsoft Teams](https://twelfth.ai/docs/settings/comms/teams/) --- title: Microsoft Teams description: "Add the Twelfth app to your Microsoft 365 tenant so your team can ask Twelfth in Teams: in a chat, a group chat, or by @mentioning it in a channel." lastmod: 2026-10-15 --- # Microsoft Teams Ask Twelfth in a direct chat, group chat or channel. Owners and admins enable it under **Settings → Comms & chat → Microsoft Teams**. If the card offers **Request Microsoft Teams**, request pilot access first. ## How it works Two steps are needed, in either order: enable Teams in Twelfth and have your Microsoft 365 admin install the app. Twelfth recognises members by their work email and answers within their current access. An unlinked participant in an existing shared thread needs an admin-approved [thread category](/settings/comms/#category-access-in-shared-threads). Everyone in that conversation can see the answer. ## The switch in Twelfth Choose **Add to Microsoft Teams**, download the app package and send it to your Microsoft 365 admin. The install card changes from **Pending** to **Installed** when Teams reports the install. The app must also be enabled in Twelfth to answer. ## What your Microsoft 365 admin does Use the [Teams admin centre](https://admin.teams.microsoft.com/). ### 1. Allow custom apps in your tenant Allow custom apps under **Teams apps → Manage apps → Org-wide app settings**. To let users upload packages themselves, also allow uploads in their app setup policy. Policy changes can take time to reach the Teams client. ### 2. Upload the Twelfth app package Under **Manage apps → Upload new app**, upload the zip from Twelfth. Do not unzip or repackage it. ### 3. Make it available Make **twelfth** available to the intended people or teams. They can find it under **Apps → Built for your org**. See [Microsoft's custom-app instructions](https://learn.microsoft.com/en-us/microsoftteams/upload-custom-apps). ## Using it Open a direct chat, or add the app to a team or group chat and @mention **twelfth**. It answers in the thread. With app version **1.1.0 or later**, follow-ups in a channel thread can omit the mention. Owners and admins can choose **Only when @mentioned** in Twelfth's Comms & chat settings. ## Updating the app Version 1.1.0 adds **ChannelMessage.Read.Group** consent for channel follow-ups. Download the current package, update **twelfth** in **Teams apps → Manage apps**, and approve the permission. Older installations continue to answer @mentions and direct chats. ## Manage - **Conversations**: shared conversations; private direct chats are counted, not named. - **Settings**: recognition, health, access rules and **Turn off**. Turning Teams off in Twelfth does not uninstall the app from your tenant. ### Health **Needs attention** or **Not answering** names the connection problem. Check the Health panel for the last failure and required action. ### Who is told when it breaks Twelfth emails workspace ops contacts about provider failures, at most once a day per problem. Choose those contacts under [Operational alerts](/settings/operational-alerts/). ### Who sees what People in a channel or group chat can read the answer. Use a direct chat for a private question. Administrators see shared conversations; private-channel titles are restricted and direct chats are counted without being named. ### What twelfth can do here Ask the same retail questions as in the app. Answers are text with an **Open in twelfth** link for the full session. Upload files and view charts in Twelfth; scheduled channel briefings are not available yet. --- ## [Decision vocabulary](https://twelfth.ai/docs/settings/decision-vocabulary/) --- title: Decision vocabulary description: Rename the pipeline stages and decision types so Twelfth speaks your team's language. The wording changes across the workspace; the pipeline does not. lastmod: 2026-10-06 --- # Decision vocabulary Open **Settings → Business → Decision vocabulary** to rename the parts of the [decision pipeline](/pipeline/) so they match the words your team already uses. This changes wording across the workspace; it does not change how the pipeline works. Owners and admins can edit these. ## Pipeline stages Rename the three stages of the pipeline. The defaults are: | Default stage | What it holds | | --- | --- | | Triage | New signals waiting to be sorted. | | Pending | Work a person has picked up but not yet committed. | | Decided | The permanent record of committed decisions. | Renaming a stage updates its label everywhere it appears: the stage strip across a [project](/projects/), headings, and the flow view under Decisions. ## Decision types Rename and recolour the types of decision Twelfth raises. The defaults are **Buy**, **Price**, **Transfer**, **Watch list**, **Promo**, and **Clearance**. - **Name**: the label shown on cards, chips, and filters. - **Colour**: the accent used to tell types apart at a glance. ::: callout note "Wording only" Changing a name or colour is cosmetic. It does not move work between stages, change guardrails, or alter what Twelfth recommends. ::: ## Related - [How work flows through Twelfth](/pipeline/) - [Guardrails](/settings/guardrails/) --- ## [Guardrails](https://twelfth.ai/docs/settings/guardrails/) --- title: Guardrails description: The category GP floor, the authority limit and the strategic-vendor lock — the limits every decision passes through, whichever part of Twelfth raised it. lastmod: 2026-09-21 --- # Guardrails Open **Settings → Business → Guardrails**. Guardrails tell Twelfth when commercial work needs more review. They are shared: a range proposal, a price move and a buy all pass the same floor and the same authority limit, whichever capability raised the finding behind them. Agree these with the people responsible for commercial policy before changing them. Owners and admins can edit them. | Control | What it changes | | --- | --- | | Category GP floor | Enter the lowest acceptable gross-profit percentage. New lines below it are held for review rather than moving ahead as normal. | | Authority limit | Enter the largest value that can be approved at this level. Decisions above it are sent to a manager for sign-off. | | Strategic vendors | Keep this on to limit changes to strategic-vendor settings to authorised operators. Turn it off only when your workspace policy allows broader access. | ::: callout warning "Warning" Changing a guardrail changes who is asked to review commercial work. Confirm the policy and the decision owner first. ::: ## Where a guardrail shows up - A [price change](/decisions/price/) that would take a line below the GP floor, or above the authority limit, is held for review or sent for sign-off. - A [purchase order](/decisions/purchase-orders/) above the authority limit waits for a manager. - The **gate** on a [project](/projects/) reads the same limit when it decides whether an order is ready to raise. ## Related - [How work flows through Twelfth](/pipeline/) - [Regional & commercial](/settings/regional-and-commercial/) - [Decision vocabulary](/settings/decision-vocabulary/) --- ## [Adobe Commerce (Magento)](https://twelfth.ai/docs/settings/integrations/adobe-commerce/) --- title: Adobe Commerce (Magento) description: "A planned read-only e-commerce mirror connector for Adobe Commerce (Magento): orders, products and inventory, in the same shape as the Shopify connector." lastmod: 2026-10-06 --- # Adobe Commerce (Magento) **Adobe Commerce (Magento)** is a **planned** [Integration](/settings/integrations/) in the **Commerce** category. It will be **inbound and read-only**: Twelfth mirrors your store and never writes back. New to the Adobe Commerce connector? [What Twelfth will do with Adobe Commerce data](https://twelfth.ai/integrations/adobe-commerce) gives the overview. ::: callout note "Planned" Adobe Commerce isn't available to connect yet. If you'd like it, **[request it](/settings/integrations/request/)** so we can prioritise it for your workspace. ::: ## What it will read A read-only **e-commerce mirror** of orders, products, and inventory for Adobe Commerce / Magento stores, in the same shape as the live [Shopify](/settings/integrations/shopify/) connector. ## Interested? Choose **Request** on the Adobe Commerce row, or use **Request an integration**, to tell us what you need it to do. See [Request an integration](/settings/integrations/request/). ## Related - [Integrations overview](/settings/integrations/) — every connection in one place - [Shopify](/settings/integrations/shopify/) — the available commerce connector --- ## [Customer-managed BigQuery](https://twelfth.ai/docs/settings/integrations/bigquery/custom/) --- title: Customer-managed BigQuery description: Keep your warehouse in your own GCP project and grant Twelfth read-only access to a fixed webapp_* serving contract, with self-serve validation. lastmod: 2026-10-06 --- # Customer-managed BigQuery **Customer-managed** ("**Your BigQuery**") is the self-serve [BigQuery](/settings/integrations/bigquery/) model: you keep the data in your own Google Cloud project and grant Twelfth **read-only** access. It's inbound and read-only, reached from **Settings → Integrations → Google BigQuery**. The connection is *configuration only*. Twelfth stores the project, dataset and location, and nothing else. There is **no secret to upload and none is stored**: access rides a dedicated Google service account that you grant read-only IAM roles inside your own project. Revoke those roles and Twelfth immediately loses read access to everything, with no change needed in Twelfth. ::: callout note "Owners and admins only" Only workspace **owners and admins** can connect, validate, or change a warehouse connection, and BigQuery must be enabled for your workspace first (see the [BigQuery overview](/settings/integrations/bigquery/)). ::: ## What you'll need Before you start, have these to hand: - Your **GCP project id** (e.g. `my-project`). This is the project that runs the queries and is billed for them. - The **BigQuery dataset** that holds your serving tables (e.g. `warehouse_au`). - The dataset's **[location](https://docs.cloud.google.com/bigquery/docs/locations)** (e.g. `australia-southeast1`). This must match the dataset's real location exactly. - Permission in Google Cloud to grant two IAM roles, one on the dataset and one on the project. ## How Twelfth connects You keep the data in your own Google Cloud project. Twelfth connects with a dedicated Google **service account** and you grant that account read-only access. Twelfth never receives, stores, or asks for a key, password, or JSON credential. The identity lives on Twelfth's side and the *grant* lives on yours. ## Set up the connection The connect page walks through five steps. You can leave and come back: the saved connection, its last validation result, and your table selection persist. ### 1 · Where does the warehouse live? Confirm the page offers **Your BigQuery**. If it says **Twelfth managed**, the connection is already owned and operated by Twelfth and the setup fields are intentionally unavailable. ### 2 · Point at the project and dataset Enter three values and choose **Save connection**: | Field | Example | Rules | | --- | --- | --- | | **GCP project id** | `my-project` | Lowercase, starts with a letter, 6–30 chars (a valid GCP project id) | | **Dataset** | `warehouse_au` | Letters, numbers and underscores | | **Location** | `australia-southeast1` | The dataset's real BigQuery location | Saving stores this configuration against your workspace. It does **not** yet prove anything can be read. That's the next step. If you later edit the values, choose **Update connection**. ### 3 · Grant this principal read-only access Twelfth shows the **service-account principal** to grant access to. Copy it with the copy button. Grant it **exactly two roles**: | Role | Where you grant it | Why | | --- | --- | --- | | [`roles/bigquery.dataViewer`](https://docs.cloud.google.com/bigquery/docs/access-control#bigquery.dataViewer) | On the **dataset** | Read the serving tables and their metadata | | [`roles/bigquery.jobUser`](https://docs.cloud.google.com/bigquery/docs/access-control#bigquery.jobUser) | On the **project** | Run the query jobs (they run on *your* project's billing) | ::: callout tip "Least privilege" These are the only two roles Twelfth needs, and both are read-only. `dataViewer` lets Twelfth read; `jobUser` lets Twelfth run the SELECT that does the reading. Grant `dataViewer` on the **dataset** (not the whole project) to keep the scope tight. If the principal shows as *pending*, your dedicated service account is issued when BigQuery is enabled for your workspace. Grant access once it resolves. ::: ::: callout tip "Jump straight to Google Cloud" Once you've entered your project and dataset, the connect page shows **Open project IAM** and **Open dataset in BigQuery** links that deep-link into the Google Cloud console for *your* project. Grant `jobUser` (and add the principal) in **IAM**, and grant `dataViewer` from the dataset's **Sharing → Permissions**. ::: To open the console by hand, swap your own ids into these URLs: ```text # Project IAM — grant jobUser, add the principal https://console.cloud.google.com/iam-admin/iam?project=YOUR_PROJECT # Dataset in BigQuery — grant dataViewer via Sharing → Permissions https://console.cloud.google.com/bigquery?project=YOUR_PROJECT&d=YOUR_DATASET&page=dataset ``` ### 4 · Prove the grants Choose **Run validation**. Twelfth runs three staged checks, cheapest first. Each proves exactly one grant, so a failure points straight at the missing role: | Check | What it proves | Fails when | | --- | --- | --- | | **Run query jobs in the project** | A dry-run `SELECT 1`: the principal can create jobs | `roles/bigquery.jobUser` is missing on the project | | **Read the dataset** | The dataset's metadata is readable | `roles/bigquery.dataViewer` is missing, or the location is wrong | | **Discover serving tables** | The expected `webapp_*` tables are found, with row counts | The dataset doesn't hold the serving contract, or earlier grants aren't in place | Later checks are **skipped** once an earlier one fails, so you fix one grant at a time. The result is saved to the connection, so the page shows your last validation when you return. ### 5 · Choose the serving tables Validation discovers the tables and their row counts. Tick the ones you want Twelfth to use and choose **Save selection**. Expand any table to review its **columns, types and descriptions** before selecting it. Discovery only ever shows allowlisted `webapp_*` tables (see [What Twelfth reads](#what-twelfth-reads)), and your selection can only **narrow** that list. It can never widen access beyond the allowlist. ## What Twelfth reads Discovery is deliberately narrow. Even if you grant `dataViewer` on a dataset that holds many tables, Twelfth only ever surfaces the **serving contract**, a fixed allowlist of `webapp_*` end tables. Anything outside this list is invisible to Twelfth and can't be discovered, selected, or queried. The serving-contract tables are: | Table | Holds | | --- | --- | | `webapp_sku` | SKUs: name, department, category, sub-category | | `webapp_outlet` | Outlets and their type | | `webapp_supplier` | Suppliers | | `webapp_sku_supplier` | SKU ↔ supplier links (and which is primary) | | `webapp_sku_user` | SKU ↔ user assignments | | `webapp_sku_performance` | Per-SKU metrics over time | | `webapp_category_performance` | Per-category metrics over time | | `webapp_supplier_performance` | Per-supplier metrics over time | | `webapp_user_performance` | Per-user metrics over time | | `webapp_recommendation_price_change` | Price-change recommendations | | `webapp_recommendation_purchase_order` | Purchase-order recommendations | | `webapp_recommendation_stock_transfer` | Stock-transfer recommendations | If you don't already produce the `webapp_*` contract, see [Transaction inbound](/settings/integrations/bigquery/transaction-inbound/), which reads raw transaction and customer data instead. ## How Twelfth queries your warehouse Every read Twelfth makes goes through one bounded gateway, with the same guards on every query. The connect page's query console uses this exact path: - **Read-only, single statement.** Only a single `SELECT` (or a `WITH … SELECT`) is allowed. Anything else (multiple statements, `INSERT`, `UPDATE`, `DELETE`, `CREATE`, `DROP`) is rejected before it reaches BigQuery. Twelfth cannot write to your warehouse. - **Cost gate.** Every query is dry-run first to estimate bytes processed and rejected if it exceeds the cap. BigQuery also enforces a hard `maximumBytesBilled` server-side (default **500 MB**), so no query can bill beyond the cap even if the estimate is off. - **Row cap and deadline.** Results are capped (10,000 rows by default) and each query has a timeout (60s by default). - **Runs on your billing.** Because `jobUser` is granted on *your* project, query jobs run in your project and appear in your own [BigQuery job history](https://console.cloud.google.com/bigquery?project=YOUR_PROJECT&page=jobs) (swap in your project id). ## Security and guarantees - **Read-only, always.** Only single-statement `SELECT` queries run, enforced before they reach BigQuery. Twelfth never writes to source systems. - **Narrow by design.** Discovery and queries are confined to the `webapp_*` serving allowlist; a broad `dataViewer` grant on a mixed dataset can't leak unrelated table names or data into Twelfth. - **Your identity, your revocation.** Remove the two IAM roles from the service account and Twelfth loses all access instantly, with no Twelfth-side step needed. - **Location pinned.** The dataset location is stored with the connection, so reads stay in the region you chose. - **One connection per workspace.** A workspace holds a single live BigQuery connection at a time. ## Manage or change a connection Return to **Settings → Integrations → Google BigQuery** at any time to: - **Update** the project, dataset or location (choose **Update connection**), then re-run validation. - **Re-run validation** after changing IAM grants, for example after granting a role the last run flagged as missing. - **Change the serving-table selection** and save it again. ## Troubleshooting ::: callout warning "Validation is your map" When something's wrong, **Run validation** tells you exactly which grant is missing. Read the first check that fails, not the last. ::: | Symptom | Likely cause | Fix | | --- | --- | --- | | **"Run query jobs in the project"** fails | `roles/bigquery.jobUser` not granted on the project | Grant `roles/bigquery.jobUser` to the shown principal, on the **project** | | **"Read the dataset"** fails | `roles/bigquery.dataViewer` not granted, or the location is wrong | Grant `roles/bigquery.dataViewer` on the **dataset**; confirm the location matches the dataset exactly | | **"Discover serving tables"** fails, or finds fewer tables than expected | The dataset doesn't hold the `webapp_*` serving contract, or the tables are named differently | Confirm the dataset is the one that holds your `webapp_*` end tables | | The principal shows **"pending"** | Your dedicated service account hasn't been issued yet | Ask your Twelfth contact to enable BigQuery for the workspace, then reload | | A banner says the **gateway has no Google credential** on this environment | The environment isn't configured for warehouse access yet | The form still saves configuration; validation and queries become available once it's configured | | A query is rejected for **processing too many bytes** | The query would scan more than the cost cap | Narrow the query (fewer columns, a `WHERE` filter) | ## Related - [BigQuery overview](/settings/integrations/bigquery/) — the two models and three approaches - [Transaction inbound](/settings/integrations/bigquery/transaction-inbound/) — read raw transaction data instead of the serving contract - [Outbound sync (inquiry only)](/settings/integrations/bigquery/outbound-sync/) — push Twelfth's outputs to your own systems ### Google Cloud reference - [BigQuery access control roles](https://docs.cloud.google.com/bigquery/docs/access-control) — what `dataViewer` and `jobUser` grant - [Granting access to a dataset](https://docs.cloud.google.com/bigquery/docs/control-access-to-resources-iam) — Sharing → Permissions - [BigQuery locations](https://docs.cloud.google.com/bigquery/docs/locations) — pick the right location value --- ## [Google BigQuery](https://twelfth.ai/docs/settings/integrations/bigquery/) --- title: Google BigQuery description: "Connect Google BigQuery to Twelfth three ways: customer-managed read-only access, transaction data inbound, or an inquiry-only outbound sync." lastmod: 2026-10-15 --- # Google BigQuery Open **Settings → Integrations → Google BigQuery**. Available in early access; ask Twelfth if it is not shown. Owners and admins configure or validate access. ## Choose a connection - [Customer-managed](/settings/integrations/bigquery/custom/) — grant access to your project's serving tables. - [Transaction inbound](/settings/integrations/bigquery/transaction-inbound/) — bring raw transaction and customer data in. - [Outbound sync](/settings/integrations/bigquery/outbound-sync/) — inquire about outputs in your own reporting dataset. A **Twelfth-managed** workspace shows health and freshness rather than editable connection settings. Use **Contact Twelfth** for mapping changes; members cannot replace it with a customer-managed connection. ## Access Twelfth stores project, dataset and location, not a key or password. A service account uses IAM grants in your project. Remove the grant to end access. Inbound queries are read-only. Any outbound sync uses a nominated destination, not your operational systems. --- ## [Outbound sync (BigQuery)](https://twelfth.ai/docs/settings/integrations/bigquery/outbound-sync/) --- title: Outbound sync (BigQuery) description: Push Twelfth's recommendations, decisions and tracked pricing to a BigQuery destination so your own BI and downstream systems can consume them. lastmod: 2026-10-06 --- # Outbound sync (BigQuery) **Outbound sync** is the [BigQuery](/settings/integrations/bigquery/) approach for getting Twelfth's outputs **into your own systems**. Twelfth writes its results (recommendations, decisions, and tracked pricing) to a **destination dataset you nominate**, so your BI tools, reporting, and downstream systems can read them alongside your other data. It is **inquiry only**: outbound sync writes to a reporting destination you choose for consumption. It never writes back into your operational systems, and it doesn't act on your behalf anywhere. Reach it from **Settings → Integrations → Google BigQuery**; it's set up with Twelfth rather than fully self-serve. ::: callout note "Available on request" Outbound sync is configured with your Twelfth contact. You nominate the destination and the tables you want. Only workspace **owners and admins** can connect or change a warehouse connection. ::: ## When to use this Use outbound sync when: - You want Twelfth's recommendations and decisions **in your warehouse** to blend with your own reporting. - Another downstream system (a BI dashboard, a planning tool, a data mart) should read Twelfth's outputs. This is the mirror of the inbound models: instead of Twelfth reading *from* your warehouse, Twelfth writes its outputs *to* a destination you control. ## How it works 1. **Nominate a destination.** Choose the BigQuery dataset (in your project, or a shared one) that should receive Twelfth's outputs. 2. **Grant write access to that destination only.** Twelfth writes to the destination you name and nowhere else. 3. **Pick what syncs.** Choose which outputs to publish (for example price-change recommendations, purchase-order recommendations, stock-transfer recommendations, and tracked pricing), and Twelfth keeps them refreshed on a schedule. ## Security and guarantees - **Inquiry only.** The sync is for downstream consumption. It never writes back into your operational systems and never changes source data. - **Destination-scoped.** Twelfth writes only to the destination dataset you nominate. - **You choose the payload.** Only the outputs you select are published. ## Related - [BigQuery overview](/settings/integrations/bigquery/): the two models and three approaches - [Customer-managed BigQuery](/settings/integrations/bigquery/custom/): read-only inbound serving contract - [Transaction inbound](/settings/integrations/bigquery/transaction-inbound/): read raw transaction data in - [Request an integration](/settings/integrations/request/): ask Twelfth to set this up --- ## [Transaction inbound (BigQuery)](https://twelfth.ai/docs/settings/integrations/bigquery/transaction-inbound/) --- title: Transaction inbound (BigQuery) description: Land raw transaction and customer data in a BigQuery dataset for Twelfth to read, for teams that don't already produce the webapp_* serving contract. lastmod: 2026-10-06 --- # Transaction inbound (BigQuery) **Transaction inbound** is the [BigQuery](/settings/integrations/bigquery/) approach for teams that don't already produce Twelfth's `webapp_*` serving contract. Instead of pointing Twelfth at finished serving tables, you land **raw transaction and customer data** in a BigQuery dataset and Twelfth reads it in, builds the model, and keeps it in sync on a schedule. It is **inbound and read-only**: data flows into Twelfth, and Twelfth never writes back to your warehouse. Reach it from **Settings → Integrations → Google BigQuery**; it's set up with Twelfth rather than fully self-serve. ::: callout note "Available on request" Transaction inbound is fitted to your data, so it's enabled and mapped with your Twelfth contact. Only workspace **owners and admins** can connect or change a warehouse connection. ::: ## When to use this Use transaction inbound when: - You have transaction, order, and customer data in BigQuery, but **not** the finished `webapp_*` serving tables that [Customer-managed BigQuery](/settings/integrations/bigquery/custom/) expects. - You'd rather hand Twelfth raw tables and let it derive SKUs, outlets, suppliers, and performance itself. If you already publish the `webapp_*` contract, use [Customer-managed BigQuery](/settings/integrations/bigquery/custom/) instead. It is fully self-serve. ## How it works 1. **Land the data.** Keep your transaction and customer tables in a BigQuery dataset in your own GCP project. 2. **Grant read-only access.** As with the customer-managed model, you grant a dedicated Twelfth service account read-only IAM on the dataset and project. There is **no secret to upload**, and you can revoke the grant at any time. 3. **Map the data.** Twelfth works with you to map your raw tables to the model it needs, then reads them on a schedule. The same guarantees apply as every BigQuery read: single-statement `SELECT` only, a cost gate, a row cap, and queries that run on your project's billing. ## Security and guarantees - **Read-only inbound.** Twelfth reads the tables you nominate and never writes to your warehouse. - **No secret stored.** Access is an IAM grant in *your* project, governed and revocable by you. - **Scoped to what you land.** Twelfth reads only the dataset and tables you point it at. ## Related - [BigQuery overview](/settings/integrations/bigquery/) — the two models and three approaches - [Customer-managed BigQuery](/settings/integrations/bigquery/custom/) — self-serve read-only serving contract - [Custom integrations](/settings/integrations/custom/) — the same inbound idea outside BigQuery (S3, GCS, SFTP, API) - [Request an integration](/settings/integrations/request/) — ask Twelfth to set this up --- ## [Blue Yonder](https://twelfth.ai/docs/settings/integrations/blue-yonder/) --- title: Blue Yonder description: Blue Yonder on request, read-only or with write-back, so Twelfth's recommendations line up with how your ranges and space are planned. lastmod: 2026-10-06 --- # Blue Yonder **Blue Yonder** is an [Integration](/settings/integrations/) in the **Planning** category, available **on request**. It can be **read-only**, where Twelfth reads your planning data and never changes anything in Blue Yonder, or it can also **write back** to Blue Yonder. Which one depends on what you need, and we agree it with you when you ask. New to the Blue Yonder connector? [What Twelfth will do with Blue Yonder data](https://twelfth.ai/integrations/blue-yonder) gives the overview. ::: callout note "On request" Blue Yonder isn't a self-serve connection. **[Request it](/settings/integrations/request/)** and we set it up for your workspace, read-only or with write-back. ::: ## What it will read **Assortment and space** planning data, so Twelfth's recommendations line up with how your ranges and shelf space are planned. With write-back, Twelfth also sends changes back to Blue Yonder; what it writes is agreed when we set it up. ## Interested? Choose **Request** on the Blue Yonder row, or use **Request an integration**, to tell us what you need it to do, including whether it should write back. See [Request an integration](/settings/integrations/request/). ## Related - [Integrations overview](/settings/integrations/) — every connection in one place - [Custom integrations](/settings/integrations/custom/) — land a bespoke planning export via S3, GCS, or SFTP --- ## [Custom integrations](https://twelfth.ai/docs/settings/integrations/custom/) --- title: Custom integrations description: Read a system that isn't in the catalogue, such as a warehouse, internal API, S3 or GCS bucket, SFTP or read replica, through a read-only pipeline. lastmod: 2026-10-06 --- # Custom integrations For a system that isn't in the [Integrations](/settings/integrations/) catalogue, such as a data warehouse, an internal API, a nightly export or a bucket of transaction or customer data, Twelfth can read it through a **bespoke, read-only pipeline**. Reach it from **Settings → Integrations → Custom integration → Set up**. Only workspace **owners and admins** can set one up. ## How it works Like every [Integration](/settings/integrations/), a custom integration is **inbound and read-only**: Twelfth reads from your system and never writes back. 1. **Whitelist a dedicated static IP.** Twelfth reaches your system from one fixed address, so you can allow it through your firewall or bucket policy without opening anything wider. 2. **Point us at the data.** Common shapes: - **S3 or GCS bucket:** transaction or customer data dropped as CSV/Parquet/JSON exports. - **SFTP:** scheduled file drops. - **Read replica:** a read-only database credential. - **API:** an internal or third-party endpoint we poll. 3. **We build the ETL.** Twelfth builds the extract/transform pipeline and syncs it into your workspace on a schedule. ## S3 / GCS transaction & customer data The most common custom setup is a **bucket of exports**, for example daily transaction or customer files landed in an **S3** or **GCS** bucket. You grant read access to Twelfth's static IP (a scoped bucket policy or read-only service principal), tell us the path and file format, and Twelfth ingests each new drop on a schedule and maps it into your workspace. ## Setting one up Choose **Set up** on the **Custom integration** row. The row explains the shape and hands off to a scoped **[Request a custom integration](/settings/integrations/request/)**, where you describe the system, the data, and how you'd like Twelfth to reach it. ## Related - [Integrations overview](/settings/integrations/) — every connection in one place - [Request an integration](/settings/integrations/request/) — ask for a new or deeper connection - [Google BigQuery](/settings/integrations/bigquery/) — a read-only warehouse connector --- ## [Databricks](https://twelfth.ai/docs/settings/integrations/databricks/) --- title: Databricks description: "A planned data-warehouse connector for Databricks: read-only lakehouse queries against your own Unity Catalog, scoped to the data you grant Twelfth." lastmod: 2026-10-06 --- # Databricks **Databricks** is a **planned** [Integration](/settings/integrations/) in the **Data warehouse** category. It will be **inbound and read-only**: Twelfth queries your own Databricks catalog and never writes back. New to the Databricks connector? [What Twelfth will do with Databricks data](https://twelfth.ai/integrations/databricks) gives the overview. ::: callout note "Planned" Databricks isn't available to connect yet. If you'd like it, **[request it](/settings/integrations/request/)** so we can prioritise it for your workspace. ::: ## What it will read Read-only lakehouse queries against your own Unity Catalog, scoped to the data you grant. This is the same serving model as [Google BigQuery](/settings/integrations/bigquery/). ## Interested? Choose **Request** on the Databricks row, or use **Request an integration**, to tell us what you need it to do. See [Request an integration](/settings/integrations/request/). ## Related - [Integrations overview](/settings/integrations/): every connection in one place - [Google BigQuery](/settings/integrations/bigquery/): the available read-only warehouse connector - [Snowflake](/settings/integrations/snowflake/): another planned warehouse connector --- ## [Destination delivery and troubleshooting](https://twelfth.ai/docs/settings/integrations/destinations/delivery/) --- title: Destination delivery and troubleshooting description: Choose decision filters and delivery triggers, understand Recorded, Staged and Executed, and recover failed spreadsheet, API or webhook deliveries. lastmod: 2026-10-14 --- # Destination delivery and troubleshooting Open **Settings → Integrations → Destinations** to check a destination's last run, health and errors. Open a decision's **Delivered to** block to see where that particular line went and the reference returned. ## Choose which decisions go Each destination receives only the lines its filter admits; the card shows the filter as one sentence. - **Which decisions**: orders, price changes and stock transfers, in any mix. **Product updates** must be selected explicitly; you can then narrow **Product update reasons**. The ordinary default excludes product updates. - **Buyer scopes** and **suppliers**, from the workspace's own lists. - **Raised projects only**: wait until the project is raised. On by default when a destination receives orders and nothing else. - Under **More**: **Only the last (days)** and **Leave out SKUs starting with** (comma-separated prefixes). A line that stops matching every destination's filter is *withdrawn* on the ledger. Nothing is removed from the destination. A product update recorded locally only is not eligible for external delivery, even if you later select Product updates or run a nightly catch-up. ## Choose when to send Tick any of three, under **Name and filter**: - **As each decision is made**: a line lands the moment a buyer commits it. Pick it for a sheet your team works from during the day. - **When a project is raised**: the whole project lands at once, after sign-off. Pick it for a system that places orders. An orders-only destination with *raised projects only* first sees its lines here. - **Nightly catch-up at 05:00** (workspace time): anything changed or missed is sent again, and the columns your team filled in are read back. Leave it on: it is what fills in *Reference* and *Raised at*. A destination linked today has its first catch-up tomorrow. **Link and deliver** links the destination at once and sends the first delivery in the background; the dialog follows it and links straight to the sheet. **Deliver now** runs the whole filter at once. The **On / Off** switch keeps everything and delivers nothing while off. ## Understand the ledger - **Recorded**: committed in Twelfth; nothing has left yet. - **Staged**: delivered to at least one destination, not yet seen in your system of record. - **Executed**: seen in the system of record: a Raised at date on the sheet, or a raised date reported by your system. A reference alone is *acknowledged*, one step short. - **Withdrawn**: the line no longer matches any destination's filter. The decision's page carries a **Delivered to** block naming each destination, the status there, a link to the row where one exists, the reference that came back, and any error. The exported CSV carries a **State** column. Delivered is not the same as executed. A row in an upload workbook is staged for your team to import. A reference says the receiving system acknowledged the line; confirmation of execution is a separate result. Exact upload tabs have no read-back columns, so clearing a row after import does not report execution to Twelfth. Native Rex writeback confirms its supported changes against the product in Rex. ## Recover a failure The usual destination policy allows up to five total delivery attempts with increasing delays. After the limit, the delivery is marked dead; the card offers **Retry all** and **Recent deliveries** offers a per-row **Retry**. Native Rex writeback has its own confirmation and unknown-outcome rules; follow its guide before creating another approval. A refused credential stops automatic retries until an admin restores the connection. Edit the credential or share, then use **Deliver now** or the next configured trigger. For an API or webhook whose reply was lost, confirm the receiver honours Idempotency-Key before retrying a potentially real action. | Health | What to do | | --- | --- | | **Healthy** | The last delivery landed. Check the decision result if you need execution confirmation. | | **Degraded** | Some lines failed. Read their errors under Recent deliveries. | | **Failing** | Repeated runs failed. Fix the connection, mapping or receiver before retrying. | | **Connection lost** | Restore the spreadsheet share or replace the refused credential. | | **Off** | The destination is paused. Its configuration and past results remain. | ### Spreadsheet problems - **Viewer share**: change it to Editor and recheck. - **File belongs to another workspace**: share a separate copy; unlinking does not move its ownership. - **Missing supplier code**: correct the inbound supplier mapping before delivering to supplier-code template tabs. - **Row changed by your team**: review it in the workbook. Exact upload mode will not overwrite a row that no longer matches what Twelfth wrote. - **Row cleared after upload**: exact upload mode leaves it cleared, rather than filling it again on a later catch-up. **Remove** unlinks the destination without deleting records or files on your side. Turning **On / Off** off pauses delivery without removing the connection. ## Who is notified - **Workspace owners and admins** (and any extra address on the destination) hear when a destination goes *failing* or loses its connection, when a delivery gives up, and when a nightly read-back finds a deleted row. The message goes by email, and to the workspace's chat channel where one is connected. At most one message per destination per day. The daily brief carries one line. - **The buyer who decided** sees a line that gave up, or was executed, on the ledger entry and on the project's Raised stage. No email. Nobody hears about an individual attempt, a retry, or a run that succeeded. ## Related - [Destinations overview](/settings/integrations/destinations/) - [Spreadsheet destinations](/settings/integrations/destinations/spreadsheets/) - [System API destinations](/settings/integrations/destinations/system-api/) - [Webhook destinations](/settings/integrations/destinations/webhooks/) - [Retail Express writeback](/settings/integrations/rex/writeback/) --- ## [Destinations](https://twelfth.ai/docs/settings/integrations/destinations/) --- title: Destinations description: Send committed decisions to spreadsheets, custom APIs or webhooks, choose what each destination receives, and follow delivery on the decision ledger. lastmod: 2026-10-15 --- # Destinations Open **Settings → Integrations → Destinations** to send committed decisions to spreadsheets, your system's API or a webhook. Owners and admins configure delivery. For native Rex product updates, use [Retail Express writeback](/settings/integrations/rex/writeback/). ## Choose a guide - [Spreadsheets](/settings/integrations/destinations/spreadsheets/) — columns and upload templates. - [System API](/settings/integrations/destinations/system-api/) — your endpoint and credentials. - [Webhooks](/settings/integrations/destinations/webhooks/) — receiving decision batches. - [Delivery](/settings/integrations/destinations/delivery/) — filters, triggers and errors. ## Set up and preview Choose **Add a destination**, select a type, map the fields and review the preview. **Link and deliver** starts real delivery. Product updates require explicit opt-in under **Which decisions**. Local-only choices and zero-quantity order or transfer lines are excluded from delivery. A Rex API preset supplies defaults for your bridge; it does not enable native order writes. ## Follow delivery - **Recorded**: committed in Twelfth. - **Staged**: delivered to a destination. - **Executed**: execution reported or confirmed. Check the decision's **Delivered to** block for results and errors. A spreadsheet row is not proof that an order was raised. Fix access or credential problems before retrying; sustained failures notify workspace ops contacts. --- ## [Spreadsheet destinations](https://twelfth.ai/docs/settings/integrations/destinations/spreadsheets/) --- title: Spreadsheet destinations description: Deliver decisions to Google Sheets or Excel workbooks in Drive, choose safe tab layouts, map columns, and prepare Retail Express upload templates. lastmod: 2026-10-14 --- # Spreadsheet destinations Open **Settings → Integrations → Destinations → Add a destination → Google Sheet**. An Excel workbook (`.xlsx`) kept in Google Drive works the same way: Sheets opens it with an XLSX badge, and Twelfth writes into it as an Excel file, so your formatting, merged cells and other tabs stay as they are. 1. **Pick the spreadsheet.** The step lists every spreadsheet someone in your workspace has already shared with Twelfth (owned or shared by an eligible active, verified member), newest share first, each marked *Editor* or *Viewer*. Pick one. 2. **Not listed?** Open the spreadsheet, click **Share**, and add the Twelfth address shown under the list (**Copy address** copies it) as **Editor**. Come back to the tab and it appears. Or paste the link: a pasted link is checked at once. Twelfth shows the title, who shared it and whether the share is Editor; a Viewer share is refused and the step shows the address again with **Check again**. 3. Choose where rows land: - **Tabs Twelfth creates**: one tab, a tab per supplier, per buyer scope or per decision kind. Every tab Twelfth makes ends with **Tab name ends with** (`Twelfth` by default, so a supplier's tab reads `Mattel - Twelfth`), is coloured plum and is added after your last tab. Rename a tab if you like: Twelfth remembers what each tab is for and keeps writing to it under your name. In this mode Twelfth writes only to tabs it created and stamps each one; existing tabs are left alone. Delete a stamped tab and **Deliver now** brings its rows back on a fresh one. - **A tab you already use**: pick one of the spreadsheet's tabs. Twelfth finds its header row (row 10 in the Retail Express order and product templates, row 1 in the transfer template), then reads samples and proposes what each header reads as, and shows the table: *their header* (with sample values), *reads as*, *filled by*. A warning sits inline on a header it concerns, such as a column that holds mixed values or a header that repeats. Change any row; the Columns step shows the same table again without a preset chooser. Twelfth writes into that tab's columns and adds a Twelfth line ID column if the tab has none. Instructions, outlet and supplier cells, and type notes above the header stay as they are. Check outlet and supplier in the spreadsheet before uploading a purchase order to Retail Express. Tick **Keep this tab's columns exactly as they are** for a tab you upload as it stands, such as a Retail Express mass-upload template. Twelfth then fills only the tab's own columns and adds none: no Twelfth line ID, no Reference or Raised at. Each line goes on the next empty row, and a line that changes is rewritten on its own row as long as that row still holds what Twelfth wrote there. A row you cleared after uploading it is left alone, never refilled. Nothing is read back. - **A tab per supplier from a template** (set up by Twelfth): the Retail Express order workbook with one tab per supplier, each named by the supplier's Retail Express code (`AID`, `360`). A supplier's lines go to its tab; a supplier without a tab gets a copy of the template tab with its outlet and supplier code filled in. Codes come from your warehouse sync. A line whose supplier has no code is held back and the card says which supplier. Each linked tab holds up to 5,000 decision rows and 80 columns. The Product Master template has 53 columns; the added Twelfth line ID is the 54th. A full catch-up reads at most 5,000 ledger lines. If the working tab has added tracking columns, for a manual Retail Express upload copy only the template's import columns into the upload file: A:G for order details, A:BA for Product Master, or A:D for the four-column transfer sheet. The extra Twelfth line ID column stays in Google Sheets so later syncs update the same row. ## Columns your team fills in Exact upload tabs have no added tracking or read-back columns. The following applies to working tabs with those columns in their mapping. Working-sheet presets include four columns that are yours: **Reference**, **Raised at**, **Status** and **Notes**. Twelfth reads them back **nightly** and never overwrites them. A filled-in Reference marks the line *acknowledged*; a filled-in Raised at marks it *executed*. ## Check the share first Destinations need **Editor** access. The file must belong to this workspace under [Google file sharing rules](/settings/integrations/google-files/sharing/). A company email domain alone is not proof. Another workspace needs a separate copy, even if the original file was unlinked. ## Mapping and preview The mapping decides which fields go, in which order, under which names. Start from a preset and change anything. The Retail Express presets are offered only where Twelfth already reads the workspace's Retail Express; everywhere else the mapping starts from **Twelfth columns** and there is no preset to choose. | Preset | What it is for | | --- | --- | | **Twelfth columns** | Every identifier, the decision, and the four columns you fill in. The default. | | **Retail Express purchase orders** | The `MassUploadPurchaseOrders` headers first — `ProductId`, `ManufacturerSKU`, `SupplierSKU`, `SupplierSKU2`, `Qty`, `SupplierBuy` — then the canonical columns. | | **Retail Express products** | The `MassUploadProducts` price headers first — `ProductId`, `POSPrice`, `WebPrice`, `DiscountPrice`, `DiscountEnd`, `SupplierBuy`, `BuyPriceEx`, `RRP` — one price decision setting POS and web alike, then the canonical columns. | Each row names the column, what it **reads as** (a field of the line, a fixed value, or a template such as `{{source.sku}} — {{decision.quantity}}`) and who **fills it in**. Columns you fill are read back and never overwritten. The **Twelfth line ID** column cannot be removed, because it is how a changed line finds its own row. **Preview** shows how many lines the filter matches, how they fall across tabs, and the first rows in the destination's shape, before anything is delivered. ## Before you start delivery Preview the rows and their supplier tabs, confirm the filter and triggers, then choose **Link and deliver**. This starts real delivery in the background. **Deliver now** runs the filter again; already delivered unchanged lines are skipped. Review errors on the card rather than assuming every previewed line was sent. An upload workbook prepares the file your team imports into Rex. It does not raise the purchase order or transfer itself. Check the supplier and outlet before uploading. See [Rex writeback](/settings/integrations/rex/writeback/) for the native actions and upload path. ## Related - [Destinations overview](/settings/integrations/destinations/) - [Delivery and troubleshooting](/settings/integrations/destinations/delivery/) - [Google file sharing](/settings/integrations/google-files/sharing/) --- ## [System API destinations](https://twelfth.ai/docs/settings/integrations/destinations/system-api/) --- title: System API destinations description: Connect a customer-provided API to receive committed decisions, test it safely, map request fields, and identify the reference returned by the system. lastmod: 2026-10-14 --- # System API destinations Ask the team that owns your receiving system to confirm its endpoint, accepted request format, authentication, dry-run handling and duplicate protection. These settings describe their API; Twelfth does not invent the endpoint. For native Retail Express prices and end-of-life updates, use [Retail Express → Writeback](/settings/integrations/rex/writeback/). The setup below is for an endpoint your team provides, such as an order bridge; its Retail Express preset does not enable native purchase-order or transfer writes. **Add a destination → Your system's API.** Twelfth itself calls your system's endpoint with your credential when a decision lands, and records the reference it returns. The system can be Retail Express (hosted, self-hosted or through a bridge your IT runs) or any other. If the kind is greyed out with *Not configured in this environment*, this environment cannot hold credentials yet; ask Twelfth. 1. **Preset.** Where Twelfth already reads the workspace's Retail Express, *Retail Express* fills the system name, the purchase-order path and the API-key header; *Custom* starts blank. Elsewhere there is no preset to choose: every system starts blank. 2. **System** and **Base URL**: the name shown on the card and everywhere else (`Retail Express`, `Cin7`, `Our order bridge`), and the endpoint the paths are added to, for example `https://integrations.example.com.au/retail-express`. 3. **Paths**, one per kind: orders, prices, transfers and product updates. At least one is required; a kind with no path is not sent here. 4. **Auth**: *None*, *API key* (header name, default `x-api-key`), *Bearer*, or *Basic* (`user:password`). The credential is stored encrypted and never shown again. When editing, leave it blank to keep the stored one. 5. **Requests**: *Per decision* (a purchase order with its lines) or *Per line*. **Body**: *Twelfth envelope* (below) or *Mapped fields only*, which sends exactly the columns you mapped, one object per line, as `{ "lines": [...] }` when grouped per decision. **Reference path**: where the reference sits in the reply, as a dot path such as `id` or `purchaseOrder.id`. A map keyed by Twelfth line ID at that path also works. ## Check the endpoint and test request - **Check** calls the base URL with the credential and answers in one line: *Reachable · credential accepted · 210 ms*, or what went wrong. A `401` or `403` reads *credential refused*. - **Send a test order** POSTs a sample request to the kind's path with `X-Twelfth-Dry-Run: true` and shows the reply compactly, with every path in it that could be a reference as a chip. Click a chip to set the reference path; the one Twelfth suggests is marked. This sends a real HTTP request: your endpoint must honour the dry-run header and avoid creating records. Confirm that behaviour with your technical team before using this button. Neither button saves anything. ## Request format for your technical team One JSON purchase order per decision (or per line), to the path for its kind, with the *Twelfth envelope* body: ```json { "twelfthDecisionId": "…", "kind": "purchase_order", "supplier": "Mattel", "supplierKey": "mattel", "sourceSupplierId": "1842", "buyerScope": "Toys", "decidedBy": "sam@example.com", "decidedAt": "2026-10-14T15:10:00+11:00", "rationale": "…", "links": { "decision": "https://…", "project": "https://…" }, "lines": [ { "lineId": "…", "decisionId": "…", "kind": "purchase_order", "fields": { "ProductId": "10234", "ManufacturerSKU": "ABC-123", "Qty": 24, "…": "…" }, "sourceProductId": "10234", "sku": "ABC-123", "supplierSku": "MAT-ABC-123", "productName": "…", "quantity": 24, "unitCostEx": 12.5, "price": null, "requiredBy": "2026-10-14", "lane": null, "line": { "twelfth": { "…": "…" }, "source": { "…": "…" }, "decision": { "…": "…" } } } ] } ``` The example time uses `+11:00` for Melbourne AEDT. `fields` is the line in the columns you mapped (the *Retail Express purchase orders* preset gives the bulk-upload names); `line` is the whole line. Every request carries an `Idempotency-Key`. Your endpoint must use it to deduplicate requests so a retry does not raise the same order twice. A `2xx` reply with a reference at the reference path marks every line in the request *acknowledged*, with that reference as its purchase order number. A `2xx` without one is *delivered*; the lines wait for a reference. A `401` or `403` loses the connection: nothing further is attempted and the card says *Retail Express refused the credential. Update the API key or token.* Edit the destination and enter the new one; delivery resumes on the next trigger or with **Deliver now**. Any other non-`2xx` is a failed attempt, retried on the schedule below. ## Product updates An endpoint can receive product-update decisions if **Product updates** is selected in the filter and its path is configured. The Twelfth envelope includes the selected product field, value and reason code. Your endpoint must understand those fields and apply the intended change. A default order-only Rex preset does not set up that path. ## Related - [Destinations overview](/settings/integrations/destinations/) - [Delivery and troubleshooting](/settings/integrations/destinations/delivery/) - [Retail Express native writeback](/settings/integrations/rex/writeback/) --- ## [Webhook destinations](https://twelfth.ai/docs/settings/integrations/destinations/webhooks/) --- title: Webhook destinations description: Send decision batches to your receiving system, verify webhook signatures, handle repeated requests, and return references for the decision ledger. lastmod: 2026-10-14 --- # Webhook destinations Use a webhook when your own receiving system will handle a batch of decisions. Ask its technical owner for the URL and whether it expects signed requests. The receiving system decides what to do with the batch; Twelfth sending it successfully does not prove the downstream action happened. **Add a destination → Webhook**, with a URL and, for signed requests, a shared secret (at least 8 characters). Twelfth POSTs each batch of decisions as JSON: ```json { "destination": { "id": "…", "name": "Supplier orders" }, "sentAt": "2026-09-28T04:10:00.000Z", "lines": [ { "lineId": "…", "decisionId": "…", "kind": "purchase_order", "fields": { "SKU": "ABC-123", "Qty": 24, "…": "…" }, "line": { "twelfth": { "…": "…" }, "source": { "…": "…" }, "decision": { "…": "…" } } } ] } ``` Every request carries an `Idempotency-Key`, `X-Twelfth-Destination` and `X-Twelfth-Timestamp` (Unix seconds). With a secret set, it also carries ``` X-Twelfth-Signature: sha256=HMAC_SHA256(secret, ".") ``` over the raw body. Reply with a successful `2xx` response when the batch has been accepted; to hand back your own reference per line, include `{ "references": { "": "PO-48812" } }`. A line with a reference is *acknowledged*. Anything other than a `2xx` is a failed attempt and is retried. ## Receiver requirements Your technical team should verify the signature when a secret is configured and use **Idempotency-Key** to handle repeated requests once. Twelfth includes the key; duplicate protection depends on the receiver honouring it. A successful response without per-line references is recorded as delivered. References acknowledge individual lines. A reference alone does not mark a line Executed. Choose only the decision kinds this receiver understands; **Product updates** requires explicit opt-in. ## Related - [Destinations overview](/settings/integrations/destinations/) - [System API destinations](/settings/integrations/destinations/system-api/) - [Delivery and troubleshooting](/settings/integrations/destinations/delivery/) --- ## [Email](https://twelfth.ai/docs/settings/integrations/email/) --- title: Email description: "A planned Workplace connector for email in Twelfth: briefing delivery to the people who need it, and supplier email threads alongside the related work." lastmod: 2026-10-06 --- # Email **Email** is a **planned** [Integration](/settings/integrations/) in the **Workplace** category, covering **briefing delivery and supplier threads**. ::: callout note "Planned" The Email integration isn't available to connect yet. If you'd like it, **[request it](/settings/integrations/request/)** so we can prioritise it for your workspace. ::: ## What it will do - **Briefing delivery**: send briefings to the people who need them. - **Supplier threads**: bring supplier email context alongside the related work. ::: callout note "Notifications already send email" Twelfth already delivers briefings and alerts by email through [Notifications](/settings/notifications/), with no integration required. This planned connector is about reading supplier threads and richer delivery, not basic email notifications. ::: ## Interested? Choose **Request** on the Email row, or use **Request an integration**, to tell us what you need it to do. See [Request an integration](/settings/integrations/request/). ## Related - [Integrations overview](/settings/integrations/) — every connection in one place - [Notifications](/settings/notifications/) — email delivery that works today - [Calendars](/settings/calendars/) — trading and promotion calendars from a sheet or calendar --- ## [Google Sheets and Drive](https://twelfth.ai/docs/settings/integrations/google-files/) --- title: Google Sheets and Drive description: Share Google files with Twelfth for calendars, targets and AI context, or give Editor access for requested templates and decision destinations. lastmod: 2026-10-15 --- # Google Sheets and Drive Share your file with the **reader address shown in Twelfth's setup**, then select or paste its link. These flows do not connect a personal Drive account. ## Choose access - **Viewer** for calendars, targets and document context. - **Editor** when asking Twelfth to create a template or write decision rows. Editor access does not make every linked file a two-way sync. A shared file belongs to one Twelfth workspace, even after unlinking; use a separate copy for another workspace. ## Choose a guide - [Sharing and access](/settings/integrations/google-files/sharing/) - [Read files](/settings/integrations/google-files/reading/) — calendars, targets and context. - [Templates and destinations](/settings/integrations/google-files/writing/) — requested writes. ## Where to start | Use | Open | | --- | --- | | Calendar | Settings → Calendars | | Target plan | Performance → Targets | | Document context | Artefacts → Link a file | | Decision rows | Settings → Integrations → Destinations | Each use needs its own setup. Linking a sheet as context does not create a target plan. --- ## [Read Google files into Twelfth](https://twelfth.ai/docs/settings/integrations/google-files/reading/) --- title: Read Google files into Twelfth description: Use shared Google Sheets as calendar or target sources, link documents as AI context, and understand when each feature refreshes its data. lastmod: 2026-10-14 --- # Read Google files into Twelfth Share the file with Twelfth as **Viewer**, then link it where you intend to use it. [Sharing and access](/settings/integrations/google-files/sharing/) explains how Twelfth confirms the file belongs to this workspace. ## A planning calendar Open **Settings → Calendars**, add or choose the calendar, then select **Google Sheets · shared with Twelfth**. Choose the workbook and tab, review its preview, and correct the **Reads as** column mapping before confirming. Every populated row must pass the calendar's checks. Promotion rows need a product SKU or a range under **Affects**; trading calendars can hold public holidays and other dated events. The sheet becomes the source of truth. Linking populated data does not merge it with old local calendar entries. See [Calendars](/settings/calendars/) for fields, scope and setup. Calendar sources are read when needed and refreshed while their calendar view is open. Edit the sheet in Google; Twelfth reads it on the next successful refresh. This is inbound sync, not publication back to Google. ## A target plan Open **Performance → Targets → Add target plan**, then **Connect sheet**. Choose a Google workbook and target tab, read the columns and confirm their mapping. Sources are read hourly, or with **Sync now**. Changed figures stage a revision under **Review changes**. An administrator activates the revision before it replaces the active targets. Unchanged reads create no revision; a source error preserves the last active targets. See [Sales and performance targets](/targets/). ## A document for the assistant Open **Artefacts → Link a file** and paste the shared file's link. Check its name and readability, choose the whole workspace or a remit, and explain what it is useful for. Workspace admins can link anywhere; remit owners can link within their own remit. | File | Read as AI context | | --- | --- | | Google Sheet | Text from up to 12 tabs and 2,000 rows per tab. | | Google Doc or Slides | Exported text. | | Plain text, CSV or JSON | The file's text. | | Word (`.docx`) or PowerPoint (`.pptx`) | Text and tables; images and speaker notes are not read. | | Linked PDF, image or Excel file in Drive | No context-text extractor for these linked files. Convert to a supported Google format, or upload an Excel workbook as a static file on Artefacts. | Context snapshots refresh when more than an hour old and the assistant needs them. Choose **Refresh** on the file to read it again now. Large snapshots may be truncated. A context file supplies background text; it does not configure a calendar or target plan merely because it contains dates or target figures. See [Artefacts](/artefacts/) for visibility, uploads and file management. ## A spreadsheet attached to a chat or project Spreadsheet pickers can find eligible files in Google Drive, or accept a pasted link. An attachment is read for that chat or project flow. It does not establish ongoing calendar or target sync. Access and workspace ownership are still checked before a shared Google file is read. ## Related - [Google Sheets and Drive overview](/settings/integrations/google-files/) - [Sharing and access](/settings/integrations/google-files/sharing/) - [Templates and spreadsheet destinations](/settings/integrations/google-files/writing/) --- ## [Google file sharing and access](https://twelfth.ai/docs/settings/integrations/google-files/sharing/) --- title: Google file sharing and access description: Share a Google file with Twelfth, choose Viewer or Editor, confirm the workspace it belongs to, and resolve missing files or revoked access. lastmod: 2026-10-14 --- # Google file sharing and access Start from the feature you want to use: **Calendars**, **Targets**, **Artefacts** or **Destinations**. Copy the Twelfth reader address shown in that setup. ## Share the file 1. Open the file in Google and choose **Share**. 2. Add the reader address shown by Twelfth. Choose **Viewer** for reading, or **Editor** for a template or spreadsheet destination. 3. Return to Twelfth and pick the file or paste its link. Twelfth checks the file and who in the workspace owns or shared it before you confirm. An active member with a verified email must be able to vouch for the file as its owner or the person who shared it with Twelfth. Matching your company email domain or knowing the link is not enough. For a new file whose owner or sharer belongs to several Twelfth workspaces, ask a colleague who belongs only to the intended workspace to share it. Once that file is bound to the workspace, a member of several workspaces can keep using it there. ## Viewer or Editor? | What you want to do | Share as | | --- | --- | | Read a calendar tab, target source or context document | Viewer | | Ask Twelfth to create a calendar or target template tab | Editor | | Deliver decision rows to a spreadsheet | Editor | Google access and Twelfth permissions are separate. For example, calendar linking requires a Twelfth owner or admin, while a remit owner can link a context document within their remit. An Editor share alone does not grant someone a Twelfth admin role. ## One file, one workspace Twelfth binds each shared Google file to one workspace. That same file can serve different uses within the workspace, but it cannot be linked or read through these flows in another workspace. Unlinking does not remove the binding. To use the contents elsewhere, make a separate copy in Google and share that copy for the other workspace. Files previously linked across multiple workspaces can be refused until their ownership is resolved; use a separate copy or contact Twelfth. Files in a Google shared drive have no individual owner, so Google must be able to identify an eligible person who shared the file. If Twelfth cannot confirm ownership or sharing, it refuses the file rather than guessing. ## If a file does not appear or cannot be used | Symptom | What to check | | --- | --- | | The file is missing from the picker | Confirm the reader address, then return to Twelfth or use the recheck control. Paste the link if needed. | | Viewer access is refused for a destination | Change the share to Editor and choose **Check again**. Destinations write rows. | | Twelfth cannot confirm the workspace | Ask an active, verified member of the intended workspace to share it. For a new file, use a member who belongs only to that workspace. | | The file cannot be used in this workspace | It may already belong to another workspace. Share a separate copy. | | A previously linked file stops working | Check whether the share was removed, the file deleted, or the eligible owner or sharer lost workspace access. Restore access and recheck. | Access is checked again on reads and writes. For context documents, losing access clears the stored text snapshot. Removing a Twelfth link does not delete the original file in Google. ## Related - [Google Sheets and Drive overview](/settings/integrations/google-files/) - [Read files into Twelfth](/settings/integrations/google-files/reading/) - [Templates and spreadsheet destinations](/settings/integrations/google-files/writing/) --- ## [Google templates and spreadsheet destinations](https://twelfth.ai/docs/settings/integrations/google-files/writing/) --- title: Google templates and spreadsheet destinations description: Create a starter calendar or target tab on request, or give a spreadsheet destination Editor access to receive committed decisions from Twelfth. lastmod: 2026-10-14 --- # Google templates and spreadsheet destinations Give Twelfth **Editor** access only for a flow that needs to write. The file must still pass the [workspace sharing checks](/settings/integrations/google-files/sharing/). ## Create a calendar template In **Settings → Calendars**, choose a shared Google Sheet and **Start with a new tab**. Name it and choose **Create tab and sync**. Twelfth adds the headers, writes any existing local calendar entries, and links the tab as the source. A blank or header-only existing tab can also be filled during setup, using the mapping shown. A populated tab is not overwritten by this setup flow. After the link, your team edits Google and Twelfth reads it; it does not keep writing calendar rows back. With Viewer access, add the tab yourself: use **Copy template headers**, paste into A1 in Google Sheets, then select that tab in Twelfth. See [Calendars](/settings/calendars/). ## Create a target template In **Performance → Targets**, choose **Create linked template**, select your customer-owned workbook and choose **Create template & link**. Twelfth adds a new target tab and keeps existing tabs intact. Enter figures in Google, sync, review the changes and activate the revision. Template creation needs Editor access; reading an existing target source needs only Viewer access. You can also download Excel or CSV and prepare the sheet yourself. See [Sales and performance targets](/targets/). ## Deliver decisions to a spreadsheet A [spreadsheet destination](/settings/integrations/destinations/spreadsheets/) is an ongoing writing connection. Owners and admins choose which committed decisions it receives, where rows land, what each column means and when it runs. It can write a Google Sheet or an Excel workbook kept in Google Drive. This is separate from the Microsoft 365 Excel connection. Editor access is required. Choose between tabs Twelfth creates, an existing working tab, or an upload template whose columns must stay exactly as they are. Review the mapping and preview before **Link and deliver**, which starts real delivery in the background. See [Destinations](/settings/integrations/destinations/). ## Documents remain read-only Giving a context document Editor access does not make the assistant edit it. The document-linking flow reads text snapshots. To publish decisions, configure a destination; to change a calendar or target source, edit it in Google. ## Related - [Google Sheets and Drive overview](/settings/integrations/google-files/) - [Sharing and access](/settings/integrations/google-files/sharing/) - [Read files into Twelfth](/settings/integrations/google-files/reading/) --- ## [Google Merchant Center](https://twelfth.ai/docs/settings/integrations/google-merchant-center/) --- title: Google Merchant Center description: Request Google Merchant Center, understand the current account and domain connection, and review its Google permissions before connecting. lastmod: 2026-10-15 --- # Google Merchant Center Find it under **Settings → Integrations → Google Merchant Center**. Choose **Request** to discuss access; self-serve consent is currently unavailable. ## What is available today The current connector lists Merchant accounts and store homepages, then lets an owner or admin select an account. Product-feed prices, availability and GTINs are not imported yet. ## Connect When the connection is available, choose **Connect**, review Google's permission and select the Merchant account. Use the same Google identity already connected to the workspace's other Google integrations. ## Google permission Google's `content` permission allows product-listing and account management. Twelfth currently only reads accounts and homepages. The Google grant itself is broader than read-only. See [Google's scope reference](https://developers.google.com/identity/protocols/oauth2/scopes). ## One Google grant **Disconnect Google** revokes the shared grant, affecting Merchant Center, Search Console, Google Chat and linked Google Calendar sources together. ## If your account is missing Check that the connected Google account has access to it. If the Merchant API is not enabled, contact Twelfth; that configuration is on our side. --- ## [Google Search Console](https://twelfth.ai/docs/settings/integrations/google-search-console/) --- title: Google Search Console description: Connect Google Search Console to Twelfth to read search performance, queries, and verified sites over a read-only Google grant. lastmod: 2026-10-15 --- # Google Search Console Owners and admins connect under **Settings → Integrations → Google Search Console**. Twelfth reads query performance without changing your site. ## Connect 1. Choose **Connect** and approve Google's read permission. 2. Select the verified property your workspace should use. Signing into Twelfth with Google does not connect Search Console automatically. ## Choosing a property Choose a domain or URL-prefix property accessible to the connected Google account. Unverified properties cannot be selected. Change the selection in **Manage**. ## What the connection reads Queries, clicks, impressions, click-through rate and average position. The default window covers 28 days ending three days ago; this is not live traffic. ## One Google grant Use the same Google identity for the workspace's Google integrations. **Disconnect Google** also disconnects Merchant Center, Google Chat and linked Google Calendar sources. ## Connection problems - **Missing property**: check this Google account's Search Console access. - **Permission needed**: reconnect and approve the read permission. - **API not enabled**: contact Twelfth; that configuration is on our side. --- ## [Integrations](https://twelfth.ai/docs/settings/integrations/) --- title: Integrations description: Connect systems to Twelfth, find Excel and Raycast extensions, and configure approved Retail Express writeback or decision destinations. lastmod: 2026-10-16 --- # Integrations Open **Settings → Integrations**. Owners and admins connect or manage sources. **Connected** lists active connections; **Ready to connect** offers setup; **On request** offers a request form. Messaging apps are under [Comms & chat](/settings/comms/). ## Available connections | Guide | Current use | | --- | --- | | [Retail Express](/settings/integrations/rex/) | Managed nightly import; approved price and lifecycle updates | | [Shopify](/settings/integrations/shopify/) | Order events; full catalogue, stock and history imports unavailable | | [Maropost (Neto)](/settings/integrations/maropost/) | Orders, read-only | | [Qoblex](/settings/integrations/qoblex/) | Products, sales, stock and purchase orders, read-only | | [BigQuery](/settings/integrations/bigquery/) | Warehouse access, early access | | [Microsoft 365](/settings/integrations/microsoft-365/) | Outlook, Excel and file context | | [Google Sheets and Drive](/settings/integrations/google-files/) | Shared plans, file context, templates and destinations | | [monday.com](/settings/integrations/monday/) | Boards as calendars or context, read-only | | [Search Console](/settings/integrations/google-search-console/) | Query performance, read-only | | [Merchant Center](/settings/integrations/google-merchant-center/) | On request; account/homepage discovery, no feed import yet | | [Calendars](/settings/calendars/) | Five planning sources | | [Destinations](/settings/integrations/destinations/) | Decisions sent to spreadsheets, APIs or webhooks | | [Blue Yonder](/settings/integrations/blue-yonder/) | Scoped on request | | [Snowflake](/settings/integrations/snowflake/) / [Databricks](/settings/integrations/databricks/) | Planned | | [Adobe Commerce](/settings/integrations/adobe-commerce/) / [POS feed](/settings/integrations/pos-data-feed/) / [Email](/settings/integrations/email/) | Planned | Availability can vary by workspace. Each guide covers setup and current limits. ### Google data access One shared Google grant supports Search Console, Merchant Center, Chat and linked Google Calendar sources. Use the same Google identity when adding permissions. **Disconnect Google** disconnects those services together. Merchant Center's permission allows management even though Twelfth only reads. Shared Drive files use the separate [file-sharing flow](/settings/integrations/google-files/). ### One store, one workspace A Shopify or Maropost store belongs to one workspace at a time. Disconnect it from the old workspace before connecting it elsewhere. ## Extensions Below the system connections, **Extensions** lists [Twelfth for Excel](/extensions/excel/) and [Twelfth for Raycast](/extensions/raycast/). Each card links to its setup guide and shows whether it is available to install. Raycast's Store listing is in review. Extension connections and their access can be reviewed under **AI & agents → Usage**. Use the search icon at the top right to filter systems and extensions by name or category. Press Escape or select the close icon to restore the full list. ## Custom integrations For a system not listed, choose **Custom integration → Set up**. See [Custom integrations](/settings/integrations/custom/) for APIs, file drops and warehouse access scoped with your team. ## Requesting a connection Choose **Request** on a connector or **Request an integration** to name another system. Include the data and workflow you need. See [Requests](/settings/integrations/request/). --- ## [Maropost Commerce Cloud (Neto)](https://twelfth.ai/docs/settings/integrations/maropost/) --- title: Maropost Commerce Cloud (Neto) description: Connect a Maropost Commerce Cloud (Neto) store to a Twelfth workspace with a read-only staff user's API key. Orders sync every 15 minutes. lastmod: 2026-10-15 --- # Maropost Commerce Cloud (Neto) Connect under **Settings → Integrations → Maropost Commerce Cloud (Neto)**. Owners and admins manage one store per workspace. Twelfth only reads orders; product and stock imports are planned. ## Before you start: a staff user for Twelfth In Maropost, create a dedicated staff user and permission group with API read access to **Products**, **Orders**, **Customers** and **Categories**. Generate that user's API key. No write access is needed. ## Connect a store 1. Choose **Connect** in Twelfth. 2. Enter the store domain, staff username and API key. 3. Choose **Connect**, then **Sync now** to check orders arrive. Leave the username blank only for a global API key. Twelfth checks the key before saving it encrypted. To move a store, disconnect the old workspace first. ## Sync cadence The first sync reads up to a year of orders. New and changed orders are checked every 15 minutes. Cancelled orders are excluded from sales totals. **Manage** shows the last sync and error; **Sync now** starts a read immediately. ## Order updates (webhook) Optional: request faster reads when an order changes. The scheduled sync still runs. 1. In **Manage → Order updates (webhook)**, copy the URL and verify token. 2. In Maropost **Settings & Tools → API Settings**, paste the token into **Maropost Webhook Verify Token**. 3. Enable **Maropost API webhook**, paste the URL and save. 4. Choose **Send test call** in Twelfth, then change an order in Maropost. ### Check the webhook **Receiving** means an authenticated Maropost call arrived. **Token rejected** means the verify token is missing or wrong; copy it again and save in Maropost. **Webhook calls** shows recent calls. **Send test call** checks Twelfth's URL and token. It neither starts a sync nor proves Maropost is configured; only a Maropost call changes the status to **Receiving**. ## Disconnect Disable the Maropost staff user and any webhook, then choose **Disconnect** in Twelfth. Sync stops and the key is discarded; imported orders remain. ## Troubleshooting - **Key rejected**: check the active staff user, matching username and complete key. A global key requires a blank username. - **Orders not updating**: check **Manage**, choose **Sync now**, and check Orders read access. Reconnect if the key was replaced. - **Store unreachable**: enter its domain without `https://` or a path. - **Webhook unreachable**: contact Twelfth. The scheduled sync continues. [Maropost API authentication](https://developers.maropost.com/documentation/engineers/api-documentation/introduction-and-getting-started/authentication/) --- ## [Microsoft 365 calendars and Excel plans](https://twelfth.ai/docs/settings/integrations/microsoft-365/calendars-and-excel/) --- title: Microsoft 365 calendars and Excel plans description: Use Outlook events or Excel worksheets for planning calendars, create a starter worksheet, and connect Excel to reviewed sales and performance targets. lastmod: 2026-10-14 --- # Microsoft 365 calendars and Excel plans Microsoft 365 can supply planning calendars and target plans. Set up the source where you will use it; the Microsoft connection supplies access. ## Read an Outlook calendar 1. Connect Microsoft 365 with **Outlook calendars** permission. 2. Open **Settings → Calendars**, add or choose a calendar, then select **Outlook Calendar** as its source. 3. Choose the source calendar and timezone, review the events in the selected date range, and confirm the link. Use a trading calendar for public holidays or team events. A promotion calendar needs product or range information, so an ordinary team calendar may not pass its checks. See [Calendars](/settings/calendars/) for the required fields. Twelfth reads Outlook events; it does not create, change or delete them. ## Read an Excel worksheet as a calendar 1. Give the connected account access to the workbook in OneDrive or SharePoint and grant Twelfth file-reading access. 2. In **Settings → Calendars**, choose **Excel workbook**. 3. Pick the workbook or paste its link, choose the worksheet and review the preview. Correct the **Reads as** mapping for any column that means something different from Twelfth's suggestion. 4. Resolve rejected rows, then confirm the source. The worksheet becomes the source of truth. Linking populated source data does not merge it with old local calendar entries. Move those entries into the worksheet first if you need them, or create a new template worksheet. ### Start with a new worksheet Choose **Start with a new tab**. An owner or admin can grant the separate write permission with **Let Twelfth add the worksheet**, then create the worksheet with template headers and any existing local calendar entries. Twelfth writes this initial template on request. After linking, your team edits Excel and Twelfth reads it; calendar sync does not keep writing back. Without the write grant, add the worksheet yourself in Excel and choose it in Twelfth. See [Permissions and settings](/settings/integrations/microsoft-365/settings/). ## Keep an Excel target plan in sync Open **Performance → Targets → Add target plan**. Choose **Connect sheet**, select an Excel workbook and target worksheet, and review its columns. Linked target sources are read hourly, or with **Sync now**. Changed figures stage a revision under **Review changes**; an administrator activates it before it replaces the current targets. A source error keeps the last active targets. **Create linked template** adds a new worksheet to a customer-owned workbook and needs the separate files-write grant. Existing worksheets are preserved. You can instead download the Excel or CSV template, add your figures yourself, and connect the resulting worksheet. See [Sales and performance targets](/targets/) for scope, mapping, review and activation. ## Check freshness in the right place Calendar sources are read when needed and refresh while their calendar view is open. Target plans use hourly source reads and explicit revision activation. Context files use text snapshots refreshed when read. Linking the same workbook for one purpose does not configure the others. ## Related - [Microsoft 365 overview](/settings/integrations/microsoft-365/) - [Permissions and settings](/settings/integrations/microsoft-365/settings/) - [Calendars](/settings/calendars/) - [Sales and performance targets](/targets/) --- ## [Microsoft 365 files as AI context](https://twelfth.ai/docs/settings/integrations/microsoft-365/files/) --- title: Microsoft 365 files as AI context description: Link OneDrive and SharePoint files so Twelfth can read their text, choose the right workspace or remit scope, and keep the content current. lastmod: 2026-10-14 --- # Microsoft 365 files as AI context Use a linked file for the context behind a decision: supplier terms, range plans, policies or a presentation. Twelfth reads its text when a question needs it and cites the file by name. ## Add a file 1. Connect Microsoft 365 with **OneDrive & SharePoint files** access. 2. On the integration's **Files** tab, choose **Add a file**. Pick a recent or shared file, or paste a OneDrive or SharePoint link. You can also paste the link through **Artefacts → Link a file**. 3. Check the file name, whether its contents can be read, and any **Personal OneDrive** badge. 4. Choose the whole workspace or a remit, describe what the file is useful for, and confirm. The file appears on [Artefacts](/artefacts/). The assistant learns that an accessible document exists and reads it when relevant; linking does not insert its entire contents into every answer. ## What can be read | File | What Twelfth reads | | --- | --- | | Excel workbook | Visible worksheets, up to 12 worksheets and 2,000 rows per worksheet, as text. | | Word document (`.docx`) | Text and table rows. | | PowerPoint deck (`.pptx`) | Text and tables, arranged by slide. Images and speaker notes are not read. | | Plain text, CSV or JSON | The file's text. | | PDF or image | Can be listed, but the linked-file extractor cannot read it yet. Use a supported text document. | Large files and snapshots have limits; Twelfth reports unsupported or truncated content. A spreadsheet used as document context is read as text, not validated as a calendar or target plan. Link those through their own setup flows. ## Keep it current The assistant refreshes a context snapshot when it is more than an hour old and needs to read it. Choose **Refresh** on the file to read it again now. **Remove** unlinks it from Twelfth without deleting the Microsoft file. If Microsoft access is lost, Twelfth clears the context snapshot. Reconnect or restore the account's file access rather than uploading another copy to hide the connection problem. ## Choose who can read it Workspace admins can link files to any scope; remit owners can link within their own remit. People read workspace-wide files and files in their remits. They may refresh a file they can read. Microsoft access comes from the one connected account, while Twelfth access comes from the file's chosen scope. See [Permissions and settings](/settings/integrations/microsoft-365/settings/). ## Related - [Microsoft 365 overview](/settings/integrations/microsoft-365/) - [Calendars and Excel plans](/settings/integrations/microsoft-365/calendars-and-excel/) - [Artefacts](/artefacts/) --- ## [Microsoft 365](https://twelfth.ai/docs/settings/integrations/microsoft-365/) --- title: Microsoft 365 description: Use Outlook calendars and Excel plans in Twelfth, link OneDrive and SharePoint files as AI context, and choose the permissions your workspace needs. lastmod: 2026-10-15 --- # Microsoft 365 **Settings → Integrations → Microsoft 365** connects one account for the workspace. Owners and admins choose its permissions. Twelfth can access files that account can open, including its personal OneDrive. ## Connect Choose **Connect** and approve the read permissions you need. Your Microsoft 365 admin may need to approve the app first. Add permissions later from **Manage**. Excel template creation needs a separate write permission. Calendar and target sync read the workbook after the requested template is created. ## Choose a guide - [Calendars and Excel plans](/settings/integrations/microsoft-365/calendars-and-excel/) - [Files as AI context](/settings/integrations/microsoft-365/files/) - [Permissions and settings](/settings/integrations/microsoft-365/settings/) ## Disconnect Disconnecting removes the stored connection and clears its context snapshots. It does not delete files in Microsoft 365. --- ## [Microsoft 365 permissions and settings](https://twelfth.ai/docs/settings/integrations/microsoft-365/settings/) --- title: Microsoft 365 permissions and settings description: Connect the right Microsoft account, grant read or optional Excel write permissions, understand personal OneDrive access, and resolve connection problems. lastmod: 2026-10-14 --- # Microsoft 365 permissions and settings Open **Settings → Integrations → Microsoft 365 → Settings**. Owners and admins manage this workspace's connection; members use the sources they can access. ## Connect and grant access Choose **Connect** or **Manage** on the Microsoft 365 row, then grant the access your workspace needs. The **Calendars** and **Files** tabs offer missing read permissions; **Grant** beside a permission in Settings does the same job. Each consent adds to the same connection. Use the same Microsoft account. | Permission | Why Twelfth asks for it | | --- | --- | | Outlook calendars — `Calendars.Read` | Read events in calendars the connected account can see. | | OneDrive and SharePoint files — `Files.Read.All` | Read documents and Excel worksheets the account can open. | | Optional Excel writes — `Files.ReadWrite.All` | Add and fill a template worksheet when an admin requests it. It is asked for separately from the read connection. | The write grant is broader than one worksheet: Microsoft permits writing files the connected account can access. Twelfth uses it for the requested Excel calendar and target templates. It does not enable outbound Outlook event sync. See [Microsoft's permission reference](https://learn.microsoft.com/en-us/graph/permissions-reference#filesreadwriteall). ### Grant Excel template access In **Settings → Calendars**, choose an **Excel workbook** source and **Start with a new tab**. If write access is missing, choose **Let Twelfth add the worksheet** and complete the separate Microsoft consent screen. Return to finish the setup. You can also add the worksheet yourself and link it read-only. A linked target plan uses that same write grant when creating its template. To work without it, [download a target template](/targets/), add it to Excel yourself, and link the existing worksheet. ### If your tenant requires admin approval If Microsoft refuses consent because of your organisation's policy, Twelfth shows an **admin consent link**. Send it to your Microsoft 365 administrator. Once approved, return and connect again. Tenant approval and permission to manage the Twelfth workspace are separate requirements. ## Who this reads as There is one connected account for the whole workspace, not a separate account per buyer. Twelfth reads files and events as that account. The account's own OneDrive files are marked **Personal OneDrive** in file pickers and linked-file lists. The badge does not prevent linking them. To keep personal files outside the connection's reach, use an account with access only to the team locations you intend to use. A workspace admin can link context files anywhere; a remit owner can link within their own remit. A linked file is then readable by people who can read its workspace or remit scope. Check that scope before linking. ## Disconnect Use **Disconnect** in the Settings tab's danger zone. This removes the stored connection for the whole workspace. Outlook and Excel sources stop loading, and Microsoft context snapshots are cleared. Files and events in Microsoft 365 are not deleted. Reconnect to restore access. ## When something cannot be opened | Message or symptom | Next step | | --- | --- | | Microsoft refused the credential | Reconnect Microsoft 365 with the intended account. | | The account cannot open a file | Give that account access in Microsoft, then check again. Granting Twelfth a scope does not give the account access to a new library. | | File not found | Check the link and whether the file was moved or deleted. | | Missing worksheet write permission | Use the calendar worksheet setup above, or create the template yourself. | | Rate-limited or temporarily unavailable | Try again shortly. | ## Related - [Microsoft 365 overview](/settings/integrations/microsoft-365/) - [Calendars and Excel plans](/settings/integrations/microsoft-365/calendars-and-excel/) - [Files as AI context](/settings/integrations/microsoft-365/files/) --- ## [monday.com](https://twelfth.ai/docs/settings/integrations/monday/) --- title: monday.com description: Connect a monday.com account, read boards as planning calendars, and hand a board to the assistant as written context. lastmod: 2026-10-15 --- # monday.com Connect under **Settings → Integrations → monday.com**. One account supplies boards as calendars or assistant context. Twelfth only reads; it never edits boards or creates board webhooks. ## Connect the account Owners and admins choose **Connect monday.com** and approve read access. Boards visible to that account become available automatically. Reconnect with the same monday account. To switch accounts, disconnect first. Disconnecting or removing the app stops reads without changing monday data. ## Boards as AI context Choose **Boards as AI context → Add a board**. Pick the board, workspace or remit scope, and a short description of what it helps explain. Admins can link to any scope; remit owners can link within their remits. Members read workspace-wide boards and boards in their remits. Snapshots refresh when more than an hour old and needed by the assistant. **Refresh** reads now; **Remove** unlinks context without removing a calendar that uses the same board. Linked boards also appear on [Artefacts](/artefacts/). ### Limits Up to 5,000 items and 52 columns. Large boards are capped or rejected with an explanation. API reads count against your monday account's allowance; Twelfth reuses reads for a minute to reduce repeated calls. ## Boards as calendars Choose **Map a board to a calendar**, or open [Settings → Calendars](/settings/calendars/). Review the column mapping and optionally choose a group. The board stays the source of truth and can serve the workspace or one remit. --- ## [POS data feed](https://twelfth.ai/docs/settings/integrations/pos-data-feed/) --- title: POS data feed description: A planned read-only connector for network sales and volume from a point-of-sale data feed, for chains whose sales don't flow through one commerce platform. lastmod: 2026-10-06 --- # POS data feed **POS data feed** is a **planned** [Integration](/settings/integrations/) in the **Retail & POS** category. It will be **inbound and read-only**: Twelfth reads your sales feed and never writes back. New to the POS data feed? [What Twelfth will do with a POS data feed](https://twelfth.ai/integrations/pos-data-feed) gives the overview. ::: callout note "Planned" The POS data feed isn't available to connect yet. If you'd like it, **[request it](/settings/integrations/request/)** so we can prioritise it for your workspace. ::: ## What it will read **Network sales and volume** from your point-of-sale feed, for chains and multi-outlet retailers whose sales don't flow through a single commerce platform. For a full point-of-sale source of truth, see also the planned [Retail Express](/settings/integrations/rex/) connector. ## Interested? Choose **Request** on the POS data feed row, or use **Request an integration**, to tell us what you need it to do. See [Request an integration](/settings/integrations/request/). ## Related - [Integrations overview](/settings/integrations/) — every connection in one place - [Retail Express](/settings/integrations/rex/) — the planned POS source of truth - [Custom integrations](/settings/integrations/custom/) — land a bespoke POS export via S3, GCS, or SFTP --- ## [Qoblex data mapping and troubleshooting](https://twelfth.ai/docs/settings/integrations/qoblex/data-mapping/) --- title: Qoblex data mapping and troubleshooting description: Understand Qoblex categories, suppliers, costs, tax basis, stock and order quantities, and resolve missing or doubled sales in Twelfth. lastmod: 2026-10-14 --- # Qoblex data mapping and troubleshooting Use this guide when a sync succeeds but the product or figures are not what you expected. [Inbound sync](/settings/integrations/qoblex/inbound-sync/) explains when each source is read. ## Products, suppliers and lead times | Qoblex field | How Twelfth uses it | | --- | --- | | Product type | Product category and an initial remit. A missing type becomes **Uncategorised**. Regroup under [Categories and remits](/settings/categories/). | | Supplier link | The default variant-supplier link is preferred; otherwise the first available link or supplier is used. Missing supplier access can leave the product without a supplier. | | Unit cost | Moving-average cost, with purchase price as the fallback when it is absent or zero. If neither supplies a usable cost, the imported cost is zero. This is catalogue cost, not historical cost on the sale date. | | Lead time | The selected supplier link's positive lead time, rounded to days. Missing, zero or invalid lead times stay unknown, rather than becoming same-day supply. | Catalogue and sales are both needed for Performance: products supply category and cost context for their sales. A received sales line without its catalogue context may not appear in the expected view. ## Sales and tax Sales use the order line's unit price and quantity. Quotes are not sales. Cancelled or deleted orders keep their lines marked voided, so they drop out of sales totals. An order that reverts to a quote is voided too. Each sale order can declare a different tax basis from the account. Twelfth keeps the order's basis and line tax rate, then uses that rate to align the figures to the account basis where both are available. If the order basis or rate is absent, no conversion is invented. Check the account's tax settings and the actual order when figures differ from the raw line price. Qoblex permits fractional quantities; the current import rounds sales and purchase quantities to whole units. Take this into account for products sold by weight or length. ## Stock and purchase orders Location stock is read with catalogue data. Purchase-order lines include ordered and received quantities, supplier, status, costs and expected dates. The expected date uses the line ETA, then the order due date, then the order's creation date if neither is supplied. That fallback is not a confirmed delivery promise from the supplier. Source coverage and availability in a particular workspace view are different. Ask Twelfth if imported stock or supplier facts are missing from the surface you need. ## Sales look doubled If Shopify orders flow into Qoblex and the workspace connects both, a sale can arrive from both sources. Choose one source for those sales; there is no cross-provider deduplication here. ## A product or supplier is missing Check the product type, variant SKU and supplier access in Qoblex. Variants without a SKU cannot be imported as a product. Let the next catalogue pass finish or use **Sync now**, then review the counts and last error. ## Related - [Qoblex overview](/settings/integrations/qoblex/) - [Setup and settings](/settings/integrations/qoblex/setup/) - [Inbound sync](/settings/integrations/qoblex/inbound-sync/) --- ## [Qoblex inbound sync](https://twelfth.ai/docs/settings/integrations/qoblex/inbound-sync/) --- title: Qoblex inbound sync description: Follow the first Qoblex catch-up, catalogue and order refresh schedules, live progress, manual sync and errors without interrupting the background read. lastmod: 2026-10-14 --- # Qoblex inbound sync Open **Settings → Integrations → Qoblex → Manage**. The dialog shows the account, counts, sales date span and last sync. Connecting starts the first read automatically; you do not need to keep the dialog open. ## First catch-up Twelfth reads every product and reaches back 365 days for sale orders. Reads are paced to 30 API calls per minute per key, so a large account takes several minutes or longer. A pass that uses its call budget resumes in the background. **Catching up** means that work is still running. Product and sales counts update as progress is announced. A quiet count alone does not prove the sync failed; check the status and last error. ## Normal refresh schedules | Source | Schedule | | --- | --- | | Sale orders | New and changed orders every 15 minutes. | | Catalogue and stock | Full catalogue and location stock pass every hour. | | Purchase orders | Daily. | Qoblex is polled; there is no webhook for you to configure. The catalogue is read in full because this connector cannot reliably ask only for changed products. Sale-order updates include cancellations, deletions and orders that revert to quotes. ## Sync now **Sync now** starts a short pass immediately and reports products and orders read. If more work remains, the background sync continues. Use it to check a new connection or an apparent delay; repeatedly pressing it does not make the account's API limit disappear. The dialog shows the account name and currency, products and sales lines received, the sales date span, the last full catalogue read, and the last sync or error. Catalogue and sales are separate passes: one recent timestamp does not prove every pass has completed. ## If updates stop - **Catching up**: let the pass continue and watch for progress or an error. - **Last sync failed**: read the message. A revoked key or missing API access usually needs reconnection, not another manual sync. - **Sync now reads rows**: the connection is reachable. Check [data mapping](/settings/integrations/qoblex/data-mapping/) if the expected figures still do not appear. - Repeated errors or a stalled catch-up: contact Twelfth with the account name and error shown, without sending your API key. ## Related - [Qoblex overview](/settings/integrations/qoblex/) - [Setup and settings](/settings/integrations/qoblex/setup/) - [Data mapping and troubleshooting](/settings/integrations/qoblex/data-mapping/) --- ## [Qoblex](https://twelfth.ai/docs/settings/integrations/qoblex/) --- title: Qoblex description: Connect Qoblex read-only, follow catalogue and order sync, and understand how products, stock, purchase orders, costs and tax basis appear in Twelfth. lastmod: 2026-10-15 --- # Qoblex Connect **Qoblex** (formerly Stock&Buy) under **Settings → Integrations → Qoblex**. Owners and admins manage one account per workspace. Twelfth only reads. ## What arrives | Data | Schedule | | --- | --- | | Products and location stock | Hourly | | Sale orders | Every 15 minutes | | Purchase orders | Daily | The first sync reads the catalogue and the last 365 days of sale orders. **Manage** shows progress; closing it does not stop the sync. ## Connect and check - [Setup](/settings/integrations/qoblex/setup/) — create a key, connect or disconnect. - [Inbound sync](/settings/integrations/qoblex/inbound-sync/) — catch-up, schedules and errors. - [Data mapping](/settings/integrations/qoblex/data-mapping/) — costs, tax, quantities and suppliers. If Shopify orders also flow into Qoblex, choose one sales source. Connecting both can count those sales twice. --- ## [Qoblex setup and settings](https://twelfth.ai/docs/settings/integrations/qoblex/setup/) --- title: Qoblex setup and settings description: Create a Qoblex API key, connect it to one Twelfth workspace, replace a refused key, and disconnect without deleting imported business data. lastmod: 2026-10-14 --- # Qoblex setup and settings Only workspace owners and admins can manage this connection. Start with an API key from the Qoblex account that should supply this workspace's data. ## Before you start API access must be enabled on your Qoblex account. It is available during the free trial; after that, whether it is included or needs an add-on depends on your plan. Check [Qoblex's API access information](https://qoblex.com/custom-integrations/). 1. Open Qoblex's API page: [go.qoblex.com/r/integrations/api](https://go.qoblex.com/r/integrations/api). Sign in if it asks. 2. Choose **Install** if the API integration is not installed yet. 3. Choose **Create API key** and copy the key. ## Connect 1. Open **Settings → Integrations** and choose **Connect** on the **Qoblex** row. 2. Paste the **API key** and choose **Connect**. Twelfth checks the key against your Qoblex account before it saves anything. If Qoblex rejects the key, nothing is saved and the dialog says why. The key is **encrypted at rest** and is never shown again or returned to the browser. A workspace holds **one Qoblex account**. Connecting again replaces the stored key on the same connection. That is also how you change the key. Once connected, choose **Manage** to see the account and sync status. The first pass starts immediately and can continue after you close the dialog. See [Inbound sync](/settings/integrations/qoblex/inbound-sync/). ## Replace the key In **Manage**, use **Reconnect with a new key**, paste the new key and choose **Reconnect**. Twelfth checks the account before saving. Connecting again updates the credential on the workspace's existing connection. ## Disconnect 1. In Twelfth, open the **Manage** dialog on the **Qoblex** row and choose **Disconnect**. 2. In Qoblex, open the [API page](https://go.qoblex.com/r/integrations/api) and choose **Revoke API key** on the key, so it stops working. Disconnecting stops the sync and discards the stored key. Products and sales already read stay in the workspace. ## When connecting fails **"Qoblex refused the API key."** Check that you copied the whole key and that it has not been revoked in Qoblex. Create a new key and connect again. **"Qoblex says API access is not on this account's plan."** Check whether API access is included or needs an add-on on your current Qoblex plan. Enable it in Qoblex, then connect again. **"The API key is missing a permission."** The message names the permission. Give the key that permission on the API integration in Qoblex, then connect again. **"Paste the API key from Qoblex's API integration."** The field was empty or did not hold a key. Copy the key again and paste it with nothing before or after it. **"Twelfth couldn't reach Qoblex."** Qoblex did not answer. Try again in a minute. If it keeps happening, contact support. **"Qoblex isn't configured on this environment yet."** The environment cannot store keys yet. Contact support. ## Related - [Qoblex overview](/settings/integrations/qoblex/) - [Inbound sync](/settings/integrations/qoblex/inbound-sync/) - [Data mapping and troubleshooting](/settings/integrations/qoblex/data-mapping/) --- ## [Request an integration](https://twelfth.ai/docs/settings/integrations/request/) --- title: Request an integration description: Ask Twelfth for a new connector, a deeper version of an existing one, missing data, or a bespoke integration, using a form scoped to what you need. lastmod: 2026-10-06 --- # Request an integration When the connector you need isn't available yet, or an existing one doesn't go deep enough, you can ask for it from the [Integrations](/settings/integrations/) page. Requests open a feedback form scoped to what you need. ## Requesting a planned connector Planned connectors offer **Request** instead of Connect. Choosing **Request** opens the feedback form scoped to that tool: pick whether you need - a **new** integration, - a **deeper** version of an existing one, - **missing data** from a connection you already have, or - **help** with a connection, then describe what it should do for you. ## Requesting anything else - The **Request an integration** row at the end of the list opens the same form **without** preselecting a tool. Use it for a connector that isn't listed at all. - The **Custom integration** row's **Set up** action hands off to a scoped **Request a custom integration** for bespoke, read-only pipelines. See [Custom integrations](/settings/integrations/custom/). ## Related - [Integrations overview](/settings/integrations/) — every connection in one place - [Custom integrations](/settings/integrations/custom/) — bespoke read-only pipelines (S3, GCS, SFTP, API) --- ## [Retail Express inbound sync](https://twelfth.ai/docs/settings/integrations/rex/inbound-sync/) --- title: Retail Express inbound sync description: Check Retail Express nightly update health, source table coverage, freshness, and the data the managed import publishes to Twelfth. lastmod: 2026-10-14 --- # Retail Express inbound sync Open **Settings → Integrations → Retail Express → View**. A **Twelfth managed** connection imports Rex data read-only. Twelfth scopes, builds and runs the pipeline; workspace members do not configure its extraction credentials, endpoints or schedule here. This import reads products, outlets, suppliers, stock positions, sales, purchase orders, receipts and product price history. Twelfth maps the data into your workspace and publishes the tables used by the [pipeline](/pipeline/), Performance and other workspace views. To change Rex products, configure the separate [writeback connection](/settings/integrations/rex/settings/#retail-express-settings-connect-for-writeback). ## Update health **Update health** opens first. The current managed nightly runs from **04:00** and usually finishes by about **05:30**, Melbourne time (**AEST/AEDT**). The panel shows the next run and the last 14 nights, including partial and failed updates. The latest run has three steps: 1. **Pulled from Retail Express** — source tables were read. 2. **Prepared for Twelfth** — the data was mapped into serving tables. 3. **Available in Twelfth** — the workspace import completed. **No new data** means the import found no new snapshot to apply. The connection summary shows **Data current to**, the latest successful snapshot's date, and **Last refreshed**, when the last successful refresh completed. A recent refresh and recent source data are different: a table can be pulled successfully while its source has stopped changing. ### Needs attention Each item says whether the issue is on **your Retail Express sync** or **Twelfth's** side. - If the pull, preparation or workspace import fails, Twelfth is alerted automatically. Your workspace keeps the last successful update. - If only some tables arrive, those that missed the run retain their previous data. The panel names the missing tables. - If Twelfth is pulling a table every night but its newest records are old, check the sync that copies Rex into your own database, where your managed connection uses one. This is different from Twelfth failing to pull it. Use **Contact Twelfth** on the connection page for a freshness issue or to request a field or mapping change. ## Source tables Every table the managed pipeline reads from Retail Express is listed under its own name (`retailexpress_orders`, `retailexpress_productdetailslog` and so on), with a plain-language label and: - **Status**: *Synced* (read every night), *Backfilling* (history still loading), *Planned* (access agreed, sync not yet switched on) or *Retired* (superseded by another table and no longer read). - **Rows**: how many rows the warehouse holds for it. - **Data from … to …**: the span of the table's watermark, from the earliest to the latest change the warehouse has seen. A table with only a "to" date is a current-state table, not a history. - **Watermark**: the Retail Express column the nightly filters on, so you can tell which changes a refresh picks up (a `created_on` log is append-only; a `coalesce(modified_on, created_on)` table also carries edits). - **In the sync since**: the date the table joined the nightly, shown for tables added after the connection first went live. - **Unlocks**: what having the table makes possible in Twelfth, for example your own price history from the product change log, or supplier lead times from purchase-order receipts. Twelfth publishes this list from the pipeline itself, so it describes what is actually read rather than what was planned. Planned and retired tables show no rows or dates: they are declarations, not measurements. ## What we sync The connection page lists every table the managed pipeline publishes to your workspace, with: - **Status**: *Synced* (in the latest refresh), *Not published yet* (an optional table the pipeline does not produce for your workspace yet), or *Pending first sync*. - **Rows**: how many rows the latest refresh carried. - **Source updated**: when that table last changed at the source, so a stale table stands out even when the refresh itself succeeded. Tables marked *optional* are extensions (for example buyer remits or recommendation rationale) that a pipeline may publish later; their absence never blocks a refresh. The two lists describe different stages: **Source tables** is what the pipeline reads from Rex; **What we sync** is what it publishes into Twelfth. Source coverage does not mean every source column is available in a workspace view. ## Related - [Retail Express overview](/settings/integrations/rex/) - [Settings and data rules](/settings/integrations/rex/settings/) - [Writeback](/settings/integrations/rex/writeback/) --- ## [Retail Express](https://twelfth.ai/docs/settings/integrations/rex/) --- title: Retail Express description: Connect Retail Express to Twelfth with a managed nightly import, approved price writeback, and mapped end-of-life updates. lastmod: 2026-10-15 --- # Retail Express Open **Settings → Integrations → Retail Express**. Twelfth manages the nightly import. Approved product changes use a separate writeback connection. ## What is available | Action | Availability | | --- | --- | | Import products, stock, sales and supplier history | Managed, read-only, nightly | | Update sell or web prices | Native writeback after setup and approval | | Mark or reverse EOL | Reviewed lifecycle updates with an admin's field mapping | | Raise purchase orders or transfers | Native writes unavailable; prepare upload files or use your own API bridge | ## Choose a guide - [Inbound sync](/settings/integrations/rex/inbound-sync/) — freshness and table coverage. - [Writeback](/settings/integrations/rex/writeback/) — approvals, EOL choices and results. - [Settings](/settings/integrations/rex/settings/) — credentials, mappings, record links and data rules. Choose **View** to inspect the managed import. Owners and admins configure **Writeback**. Having imported Rex data does not grant permission to change Rex. ## Request a connection Use **Contact Twelfth** to request a managed import or mapping change. Native writeback can be configured even without a managed inbound connection. --- ## [Retail Express settings](https://twelfth.ai/docs/settings/integrations/rex/settings/) --- title: Retail Express settings description: Set up Rex writeback credentials, select prices and lifecycle mappings, and configure source record links and data rules for your workspace. lastmod: 2026-10-15 --- # Retail Express settings Open **Settings → Integrations → Retail Express**. Owners and admins configure writeback, record links and data rules. The managed import uses separate access. ## Connect for writeback 1. Open **Writeback** and enter the HTTPS **Instance URL**, without a record path, query or fragment. 2. Enter the instance's **Primary key** and **Secondary key**. 3. Choose **Test connection**, then **Save credentials**. **Read access verified** proves reading, not write permission. Use keys issued for the intended Rex instance; the displayed URL alone does not verify the account behind them. Keys are stored encrypted and not shown again. ### Change or recheck credentials Choose **Change**. Leave a key blank to retain it; changing the instance needs both keys. Test again before saving. **Cancel** keeps the saved connection. Use **Reload saved settings** if someone changed the settings meanwhile. ## Writeback settings | Setting | Use | | --- | --- | | **Price to update** | Sell or web price, tax inclusive; only that field is changed | | **Price changes** | Enable or pause price delivery | | **End-of-life decisions** | Enable mapped lifecycle updates independently | | **Purchase orders / Stock transfers** | Native writes unavailable | Finish with **Save writeback settings**. Changed credentials or price fields require fresh approvals for earlier price decisions. Pausing does not reverse changes already sent. ### Map an end-of-life value Choose **Refresh fields**, select an existing **REX product field** and **Value for end of life**, then set **Label in Twelfth**. Enable **End-of-life decisions** and save. Use **Previous / Next** to browse paged fields. The label changes Twelfth's wording, not the Rex field. Buyers review the mapped value before sending; see [Writeback](/settings/integrations/rex/writeback/). ## Record links On a managed connection, open **Record links**. Copy a real product, purchase order or supplier-invoice URL and replace its record number with `{id}`. Save each template separately; leave unused ones empty. Readers still need Rex access. ## Data rules On a managed connection, describe where channels are recorded, how the field encodes them, and their exact source names. Add other interpretation rules and choose **Save rules**. For example, a store may encode marketplaces as salesperson accounts rather than a dedicated channel field. Rules explain that to chat; they do not edit Rex or replace the managed import's mappings. Request mapping changes from Twelfth. ## Connection problems - **Storage unavailable**: contact Twelfth. - **Check failed**: verify the instance's keys and permissions, then test again. - **Missing lifecycle values**: refresh fields and choose an existing value. - **Stale imported data**: check [Inbound sync](/settings/integrations/rex/inbound-sync/); writeback credentials do not repair the managed import. --- ## [Retail Express writeback](https://twelfth.ai/docs/settings/integrations/rex/writeback/) --- title: Retail Express writeback description: Send approved prices and optional EOL product updates to Rex, review their outcomes, and prepare purchase-order and transfer upload workbooks. lastmod: 2026-10-15 --- # Retail Express writeback Owners and admins configure **Settings → Integrations → Retail Express → Writeback**. [Save the connection](/settings/integrations/rex/settings/) and enable the actions to send. The managed import remains a separate, read-only connection. ## Approved price changes 1. Select **Sell price (tax inclusive)** or **Web price (tax inclusive)** and enable prices. 2. A buyer approves a new price for a valid Rex product. 3. Twelfth reads the product, changes only the selected field and confirms it by reading again. 4. Check **Delivered to**. A confirmed native update is **Executed** on the ledger. Earlier approvals are not sent when connecting or changing keys, instance or price field. Review and approve a new decision after those changes. ### Verify a controlled write **Test connection** only checks reading. Test an approved change on a designated product, check the result in Rex and restore its original price or lifecycle value. ### When a price needs review - **Future date**: native writes do not schedule it; review again on that date. - **Invalid product ID**: check the source mapping. - **Sell price changed since approval** or **newer delivery**: review the current price and approve again. - **Unknown outcome**: inspect Rex before another decision; Twelfth does not blindly repeat writes. Pausing prices does not reverse applied changes. Workspace data refreshes on the managed import's schedule, not immediately after writeback. ## End-of-life decisions An admin maps an existing Rex field and EOL value in [Settings](/settings/integrations/rex/settings/). When muting a routine product, choose **End of life**, review **Also update the connected system** and confirm. Clear that option to record EOL locally. Without an enabled mapping, the choice stays local. **Mark end of life** on a product also records EOL, without automatically muting routine checks. Explain the decision with at least four words and 20 characters outside links. Twelfth changes only the mapped field; an already matching value is confirmed without another write. Local-only choices never enter external delivery, even if a mapping is enabled later. Unmuting a routine does not reverse EOL in Twelfth or Rex. ### Review EOL options On a marked product, choose **Review EOL options**: | Choice | Effect | | --- | --- | | Resume routine checks only | Use the listed routine's **Resume checks**; EOL remains | | Reverse EOL in Twelfth only | End local EOL; Rex and routine mutes remain | | Reverse EOL and restore the previous REX value | Review and restore the value captured by the newest confirmed EOL change | | Reverse EOL and choose another REX value | Review and send a non-EOL value from the current field | External reversal does not resume routine checks. Disabled choices explain what is missing. Restore needs a captured value for the current connection and field, unchanged Rex data, and a previous value that is not now an EOL target. An **Unset** value can be restored. If Rex already had EOL when confirmed, Twelfth captured no previous value. Twelfth rechecks before writing. Changed settings, a newer decision or an intervening Rex edit require another review. External edits can still race the final write; inspect uncertain outcomes in Rex. Reversals create new decisions and currently use native Rex delivery, not generic destination exports. ### Keep the decision context **Lifecycle history** keeps who decided, their explanation, evidence, source-dated figures and outcomes. Later imports do not overwrite the original figures. Editing an EOL mute adds a note rather than replacing its original explanation. ### Read the result | Result | Next step | | --- | --- | | Recorded locally / No mapping | No external change; enabling a mapping later does not backfill it | | Queued / Updating | Wait for processing | | Confirmed | Rex returned the expected value | | Failed | Fix the error and use **Retry update** where offered | | Outcome unknown | Inspect Rex before another decision | | Cancelled | Review changed settings, ended mutes or newer decisions | The deciding buyer or an admin can retry eligible failed updates. ## Purchase orders and stock transfers Native writes are **Unavailable**. Use [Spreadsheet destinations](/settings/integrations/destinations/spreadsheets/) to prepare Rex upload files, or an API bridge your team supplies. Writing a workbook does not raise an order or transfer in Rex. Check its supplier, outlet and mapping before uploading. --- ## [Shopify inbound data](https://twelfth.ai/docs/settings/integrations/shopify/inbound-sync/) --- title: Shopify inbound data description: Understand Shopify order events, allocated discounts, cancellations, catalogue requirements, and the current limits of historical and refund data. lastmod: 2026-10-14 --- # Shopify inbound data Connect your store from **Settings → Integrations → Shopify**, then use **Manage** to see the store, granted read scopes, **Last order** and any **Last update failed** message. ## What is imported today The connector receives supported Shopify order events and updates their sales lines. New orders, changed orders and cancellations are covered. Read scopes also include products, inventory, customers, locations and price rules, but a permission is not the same as a completed import. This connector does not currently run a full historical order backfill or a full product-catalogue and inventory sync. **Last order** is the last processed order update, not confirmation that every store record has been refreshed. For historical coverage or a complete product and stock source, contact Twelfth about the workspace's data setup. ## Order lines and discounts An order line supplies product identifiers, SKU, quantity, unit price, currency, location and sale date. The processed sale date is preferred, with created or updated time used when it is absent. Sales use the line quantity and price less its allocated discount. Shopify can allocate an order-level discount to individual lines even when their separate line-discount field is zero; Twelfth uses those allocations first and falls back to the line discount when no allocations are supplied. The same discount reduces sales and gross profit calculations. Gross profit and category views also require matched catalogue and cost context. An order event arriving does not guarantee every Performance view can show it. If **Last order** updates but expected figures are missing, ask Twelfth to check the catalogue and source mapping. ## Cancellations and refunds Cancellation updates mark the order's lines voided so they drop out of sales totals. Repeated deliveries of the same event do not add the sale again. Separate refund events do not currently create normalised refund sales lines. Do not assume a partial refund has been subtracted merely because Shopify sent its webhook. This source alone is not a full refund reconciliation. ## If nothing appears 1. Check the connected **Store** is the one you intend to use. 2. Open **Manage** and read **Last order** and any update error. 3. Compare an actual order created or changed after connecting. Connecting alone does not fetch past orders. 4. If the source still does not update, contact Twelfth with the store domain and order reference. Twelfth can check the event subscription and delivery. If the same Shopify orders also flow into [Qoblex](/settings/integrations/qoblex/), connecting both can count them twice. Choose the intended sales source. ## Customer data Stored order events omit customer names, email addresses, phone numbers and addresses; an opaque customer ID supports repeat-purchase analysis. Twelfth handles Shopify's customer data-request and deletion notifications. Customer deletion clears the identifying reference while retaining commercial sales facts; store-level deletion is handled when Shopify requests it. Uninstalling the app revokes the connection. Disconnecting in Twelfth removes the stored credential; those actions do not promise that all historical commercial data has been erased. ## Related - [Shopify connection and settings](/settings/integrations/shopify/) - [Qoblex](/settings/integrations/qoblex/) - [Integrations overview](/settings/integrations/) --- ## [Shopify](https://twelfth.ai/docs/settings/integrations/shopify/) --- title: Shopify description: Connect one Shopify store to a Twelfth workspace, read order events, understand discounts and current sync coverage, and manage the connection. lastmod: 2026-10-15 --- # Shopify Connect under **Settings → Integrations → Shopify**. Twelfth reads supported order events without changing your store. Owners and admins manage the connection. ## Connect a store 1. Enter your `your-store.myshopify.com` domain and choose **Connect**. 2. Approve Shopify's read permissions. 3. Return to Twelfth and check the store shows **Connected**. A store belongs to one Twelfth workspace at a time. To move it, disconnect it from the old workspace first. The stored credential is encrypted. ## What arrives New and updated orders, discounts and cancellations. Full historical, catalogue and stock imports are not available yet; separate refund events are not reconciled into refund lines. See [Inbound data](/settings/integrations/shopify/inbound-sync/) for coverage and missing figures. If Shopify sales also flow into Qoblex, choose one sales source to avoid counting them twice. ## Manage or disconnect **Manage** shows the store, **Last order** and update errors. **Disconnect** removes the connection; it does not erase all past commercial data. --- ## [Snowflake](https://twelfth.ai/docs/settings/integrations/snowflake/) --- title: Snowflake description: "A planned data-warehouse connector for Snowflake: read-only warehouse queries against your own Snowflake database, scoped to the data you grant Twelfth." lastmod: 2026-10-06 --- # Snowflake **Snowflake** is a **planned** [Integration](/settings/integrations/) in the **Data warehouse** category. It will be **inbound and read-only**: Twelfth queries your own Snowflake database and never writes back. New to the Snowflake connector? [What Twelfth will do with Snowflake data](https://twelfth.ai/integrations/snowflake) gives the overview. ::: callout note "Planned" Snowflake isn't available to connect yet. If you'd like it, **[request it](/settings/integrations/request/)** so we can prioritise it for your workspace. ::: ## What it will read Read-only warehouse queries against your own Snowflake database, scoped to the data you grant. It uses the same serving model as [Google BigQuery](/settings/integrations/bigquery/). ## Interested? Choose **Request** on the Snowflake row, or use **Request an integration**, to tell us what you need it to do. See [Request an integration](/settings/integrations/request/). ## Related - [Integrations overview](/settings/integrations/) — every connection in one place - [Google BigQuery](/settings/integrations/bigquery/) — the available read-only warehouse connector - [Databricks](/settings/integrations/databricks/) — another planned warehouse connector --- ## [Members](https://twelfth.ai/docs/settings/members/) --- title: Members description: Invite people to a Twelfth workspace, manage each member's access, and let anyone with a verified email on your company domain join automatically. lastmod: 2026-10-16 --- # Members Open **Settings → Members** to manage people in the active workspace. Owners and admins can invite people, update access, and configure domain access. The invite box sits at the top of the page and is always available. Below it, three subtabs organise the rest: - **Members**: the list of people who belong to the workspace. - **Pending**: invitations that have been sent but not yet accepted. The count of outstanding invites shows on the tab. - **Settings**: workspace-level joining rules, such as automatic company-domain access. ## Invite a member At the top of the page, enter a colleague's email, choose **Member** or **Admin**, then select **Invite member**. This is available from every subtab. | Role | Can do | | --- | --- | | Owner or admin | Manage workspace settings, members, invitations, security, and API keys. | | Member | Manage their own profile, preferences, notifications, and account security. | ## Members tab Search by name, email, role, or remit, or select **Export CSV** to download membership data with each person's full remit list. Each member shows up to two assigned categories or remits; select one to explore the products it covers. A **+N** link opens the person's profile for their full list. **No remit assigned** means they have no current remit assignments; their workspace role still determines administration access. Select a member's name to open their profile and decision history. Commercial ownership is managed in [Categories & remits](/settings/categories/). ## Pending tab See invitations that haven't been accepted yet, with who invited them and when they expire. Under each email is a best-effort delivery update. You may see **Email sent** or **Email delivered** when delivery is known. If Twelfth knows the message was not sent or could not be delivered, the row suggests checking the address and resending. Missing tracking information is not shown as a failure. Invites lapse after 7 days. From a pending invite's **⋮** menu, choose **Resend invite** to reset the clock (there's a short cooldown before you can resend again), or **Cancel invite** to rescind one. Once someone accepts, their invite drops off this tab and they appear under **Members**. ## Settings tab ### Company domain access Owners and admins can allow anyone with a verified company-email address on your domain to join automatically. Personal email providers are never eligible, and a domain can belong to only one workspace. ::: callout note "Verify your own email first" You can only turn on domain access once your own work email is verified. See [Verify your email](/settings/security-and-access/#verify-your-email). Until then the toggle prompts you to verify first. ::: ## Deactivate or reactivate access Deactivate access without deleting the person, membership, or history. Select **Reactivate** to restore access later. ::: callout warning "Warning" Deactivation is limited to the active workspace. It does not remove the person from any other Twelfth workspace they belong to. ::: --- ## [My workspaces](https://twelfth.ai/docs/settings/my-workspaces/) --- title: My workspaces description: Every Twelfth workspace you belong to in one place. Switch between them, create a new one, accept an invitation, or leave a workspace you no longer need. lastmod: 2026-10-06 --- # My workspaces A Twelfth workspace is an organisation and its shared data. Open **Settings → Personal → My workspaces** to see every workspace you belong to and move between them. This page is yours: what it lists depends on your memberships, not on the workspace you are in. ## Switch, create, and leave Each workspace you belong to is listed with a **Switch** action. Switching changes the active organisation for the app and for every workspace-level setting. You can also **create a new workspace** from here. To leave a workspace you're a member of, use **Leave workspace** and confirm by typing the workspace name. ::: callout note "The last owner can't just leave" If you're the only owner, you can't leave until you promote another member to owner in [Members](/settings/members/), or delete the workspace instead from [Workspace](/settings/workspace/). ::: ## Invitations Pending invitations are shown here too. Select **Accept** to join the invited workspace, or **Decline** to dismiss it. Invitations are organisation-specific; Twelfth does not create personal workspaces. ::: callout note "Note" Your profile and preferences remain your own after you join. Your permissions in the new workspace are set by your membership role. ::: ## Which workspace am I in? The active workspace is named in the workspace switcher at the top of the left rail. If you belong to more than one, check it before changing anything under **Business**, **Capabilities**, **Admin** or **Data & AI**, because those settings belong to the workspace, not to you. ## Related - [Workspace](/settings/workspace/) — the workspace's name, logo, security policy and deletion - [Members](/settings/members/) — who is in it, and how people are invited - [Settings overview](/settings/overview/) --- ## [Notifications](https://twelfth.ai/docs/settings/notifications/) --- title: Notifications description: Choose your personal briefing delivery schedule and alert preferences, starting from the workspace default and overriding any control for yourself. lastmod: 2026-10-01 --- # Notifications Open **Settings → Notifications** to choose your personal delivery schedule and alert preferences. ## Briefing delivery Briefings are off until you turn them on. Once enabled, delivery starts with the workspace default, and you can set a personal override for any of these controls: | Control | Options | | --- | --- | | Delivery time | Any half-hour time of day. | | Channel | Email and in-app, email only, or in-app only. | | Monday deep brief | Turns the weekly portfolio and category read on or off. | Select **Use workspace briefing defaults** to remove your personal override and return to the workspace schedule. ## Alert types Every alert starts off. Each one inherits the workspace default until you make your own choice, so you receive an alert only when you or a workspace admin has turned it on. | Alert | When you receive it | | --- | --- | | Decide-today alerts | A decision reaches your sign-off. | | Above-threshold escalations | A commercial signal exceeds its configured guardrail. | | Promo lock-date reminders | A promotion approaches its commitment date. | | Weekly digest | Your regular portfolio and category summary. | Turning off an alert changes only your delivery. It does not change the workspace default or stop the underlying decision or escalation. --- ## [Operational alerts](https://twelfth.ai/docs/settings/operational-alerts/) --- title: Operational alerts description: Who is emailed when a chat surface or an integration stops working for your workspace, what is being watched, and what has broken lately. lastmod: 2026-10-06 --- # Operational alerts Open **Settings → Admin → Workspace → Operational alerts**. This page covers breakages in the things Twelfth *relies on*, rather than in your business. When a chat surface refuses Twelfth's credential, or an integration can no longer refresh the access you granted, Twelfth emails the people named here with what broke and what to do. Owners and admins can see and change it. This is different from [Briefings & alerts](/settings/briefings-and-alerts/), which are the commercial alerts (decide-today, above-threshold escalations, the weekly digest), and from each person's own [Notifications](/settings/notifications/). ## Why this exists A bot that has gone quiet looks exactly like a quiet week. A Google grant that stopped refreshing looks like a workspace that has nothing new. Nothing inside the product says otherwise, because from inside the product nothing is happening. So when a platform refuses Twelfth for your workspace (a Slack app revoked when an admin leaves, the Teams app removed from a team, Google returning *invalid_grant* on a token refresh, an Outlook grant expired), Twelfth records it and emails your ops contacts, before anyone notices a bot not answering or a number gone stale. Twelfth sends at most one email a day per problem. The emails stop on their own when the next answer, refresh or reconnect succeeds. ## Who is told when something breaks By default, every **owner and admin** of the workspace with a verified email address. To send these to a specific inbox instead, such as IT, security or an on-call address, choose **Change** and enter the addresses, up to ten, comma-separated. Leave the list empty to go back to every owner and admin. The page always shows the list an email would actually go to, not the rule. One list covers everything: Slack, Google Chat and Microsoft Teams, and every integration Twelfth holds a credential for. ## What is watched Every chat surface the workspace has turned on and every integration it has connected, each with its standing right now: working, or the problem Twelfth has found against it and since when. A Google grant that also carries the Chat permission appears twice, once as the data grant and once as the chat surface, because each can break on its own. Each row links to where it is reconnected. ## Recent alerts What has broken for this workspace in the last thirty days, open problems first, with when each was first seen, when the contacts were last emailed, and when it recovered. A repeat after a recovery is a new alert and emails again. ## What the email says The subject line names the service and the problem, for example *Slack is refusing Twelfth's credential*, *twelfth's access to Google has lapsed*. The body says what it means for the workspace (people asking there get nothing back; anything that reads from the integration goes stale), the one thing to do, what the platform said if it said anything, and a button to the page where it is fixed. The footer links back here to change who receives them. ## Related - [Comms & chat](/settings/comms/) — the chat surfaces themselves, each with its own **Health** panel - [Integrations](/settings/integrations/) — the systems Twelfth reads from - [Briefings & alerts](/settings/briefings-and-alerts/) — the commercial alerts, which are a different thing --- ## [Settings overview](https://twelfth.ai/docs/settings/overview/) --- title: Settings overview description: "Where every setting lives in Twelfth: the same five groups the Settings page uses, and who can change each one." lastmod: 2026-10-06 --- # Settings overview Open **Settings** from your avatar menu in Twelfth (**⌘⇧S** / **Ctrl Shift S**). The left-hand nav is five groups, and these docs are organised the same way, so a page in Settings and its page here sit under the same heading. | Group | What it holds | Whose it is | | --- | --- | --- | | **Personal** | How Twelfth looks and behaves for you, your account, what you are told and when, and the workspaces you belong to | Yours; nobody else's changes touch it | | **Business** | Facts about the business every capability reads: where it trades, its guardrails, its vocabulary, its categories and remits, its projects, its calendars | The workspace's; owners and admins change them | | **Capabilities** | The settings a capability carries — today, Supplier | The workspace's | | **Admin** | Who the workspace is and who is in it | Owners and admins | | **Data & AI** | What Twelfth reads from, where it answers, and the AI clients connected to it | Workspace members can view; owners and admins connect | ## Personal | Section | What it controls | | --- | --- | | [Preferences](/settings/preferences/) | Appearance, dates, display, accessibility, and the model and thinking intensity new chats start with | | [Account](/settings/profile/) | Your [profile](/settings/profile/) (name, title, role, photo), then [sign-in methods, two-factor authentication, passkeys, and sessions](/settings/security-and-access/) | | [Notifications](/settings/notifications/) | Briefing delivery and the alerts delivered to you | | [My workspaces](/settings/my-workspaces/) | The workspaces you belong to: switch, create, leave, and accept invitations | ## Business | Section | What it controls | | --- | --- | | [Regional & commercial](/settings/regional-and-commercial/) | Timezone, currency, country, and how tax is named and read | | [Guardrails](/settings/guardrails/) | The category GP floor, the authority limit, and the strategic-vendor lock every decision passes through | | [Briefings & alerts](/settings/briefings-and-alerts/) | The workspace's starting point for everyone's brief and alerts | | [Decision vocabulary](/settings/decision-vocabulary/) | The names of the pipeline stages and the decision types | | [Categories & remits](/settings/categories/) | The managed categories your team trades (friendly names, reconciling, merging) and, on the [Remits](/people/) view, who owns each commercial section | | [Projects](/settings/projects/) | The rules every project follows (whether a finished project closes itself, which workflows people can start) and each workflow's own: who raises a supplier order, the cost of goods basis a negotiation is sized against | | [Calendars](/settings/calendars/) | Trading, promotion and custom calendars, read from a shared sheet or a Google Calendar, mentionable with **@** in Twelfth AI | ## Capabilities | Section | What it controls | | --- | --- | | [Supplier](/settings/suppliers/) | Supplier favicons. Lead-time overrides, response times and the supplier directory itself are **Suppliers** in the left rail | ## Admin | Section | What it controls | | --- | --- | | [Workspace](/settings/workspace/) | Workspace name, logo and identity, the [two-factor policy](/settings/workspace-security/), the chat-sharing policy, and deletion | | [Members](/settings/members/) | Invitations, member roles, domain access, and member export | ## Data & AI | Section | What it controls | | --- | --- | | [Integrations](/settings/integrations/) | The operational systems Twelfth reads from: commerce platforms, warehouses, POS feeds, monday.com, email | | [Comms & chat](/settings/comms/) | The chat surfaces Twelfth posts to and answers in: Slack, Google Chat, Microsoft Teams | | [AI & agents](/settings/ai-and-agents/) | Your workspace's connections (an assistant such as Claude, ChatGPT or Cursor, or a server of your own) and the keys behind them | Every section and every setting inside it is also reachable from the global search (**⌘K** / **Ctrl K**): type the setting's name and select it to land on the row, which is highlighted so you can see where it is. The address in your browser at that point is a shareable link to that exact setting. ::: callout note "Which workspace?" Your workspace is the organisation you are currently working in. If you belong to more than one, switch under [My workspaces](/settings/my-workspaces/) before changing anything in Business, Capabilities, Admin or Data & AI. ::: --- ## [Preferences](https://twelfth.ai/docs/settings/preferences/) --- title: Preferences description: Choose your default home view, first day of the week, date conventions and interface behaviour. These personal settings change nothing for anyone else. lastmod: 2026-10-16 --- # Preferences Open **Settings → Preferences** to adjust how Twelfth works for you. These settings are personal and do not change the workspace for anyone else. ## General | Control | Options | What it changes | | --- | --- | --- | | Default home view | Home, Triage | The first view you see when you open Twelfth. | | First day of the week | Monday, Sunday | Routines, weekly planning, and date pickers. | | Display names | Full name, First name | How people are named throughout your workspace views. | ## Interface | Control | What it changes | | --- | --- | | Dark mode | Uses a darker appearance across Twelfth. Turn it off for the light appearance. | | Compact density | Fits more decisions and signals into each view by reducing spacing. | | Underline links | Always underlines links in text content. | | Use pointer cursors | Uses a pointer cursor when you hover over interactive elements. | | Product images | Show images inside expanded catalogue rows (the default), or inline beside every product. The Products toolbar’s **Images** menu changes the same saved preference. | | Product thumbnail size | Small, medium (the default) or large. Images load lazily as resized thumbnails; missing images show a placeholder. Images appear when the connected product feed publishes an image URL. | | Tidy shouted names | Reads ALL-CAPS product, supplier and category names back in title case ("TOY COOEE POGO STICK" becomes "Toy Cooee Pogo Stick"). Only what you see changes: copies, exports, filters and searches keep the spelling your source system stored. | ## Pricing How a competitor comparison reads on the [Tracked set](/price-intelligence/tracked-set/). The two settings are independent, and each one only sets where the page **opens**. The **Prices** control on the toolbar changes it for the page you are on, and that choice rides in the address so a reload or a shared link keeps it. | Control | Options | What it changes | | --- | --- | --- | | Price comparisons show | Price, Gap, Index | What a comparison against a competitor prints. Price is their price, the figure you quote and negotiate. Gap is their price minus yours, in dollars. An index is your price ÷ theirs × 100, where 100 is parity and above 100 means you are priced above them, so a column of them is comparable down its whole length whatever the articles cost. The arrow and colour are the same in all three. | | Price comparisons read | Last seen, 4 wk, 8 wk, 12 wk | Which days the comparison covers. **Last seen** is the most recent price actually observed for each listing, so it reflects a rival who corrected their price yesterday; it is the latest observation rather than a live lookup, so on a weekly-collected retailer it can be a few days old. A week count averages the observed daily prices over that period, which is the fairer read of where a competitor sits because one observation can be a promotion, a listing error or a stale scrape. | You can also ask the assistant for either of these in plain words ("show prices on the last price seen"); it proposes the change and you confirm it. ## AI assistant Tune how Twelfth's own assistant answers you. | Control | Options | What it changes | | --- | --- | --- | | Default model | Auto (Twelfth recommended), or a specific model | Which model answers your questions. **Auto** lets Twelfth pick the best available model for you. | | Thinking intensity | Instant, Balanced, Thorough, Auto | How much the assistant reasons before answering — faster replies versus more careful ones. | | Tone | Standard, Straight shooter, Executive brief, Coach, Analyst, Friendly, Formal; for fun: Sassy, Aussie mate, Race caller, Quest master | How the assistant words its answers, everywhere you chat with it (the app, Excel, Slack, Teams, Google Chat). Open it to compare each voice's portrait and answer to the same question. Your chosen portrait also appears in the app's AI chat. Only the wording changes: figures, sources, tables and anything drafted for a supplier stay the same. You can also ask in chat ("keep it shorter", "be less formal") and Twelfth will propose a tone. | ## Related - [AI and agents](/settings/ai-and-agents/): the workspace's AI and server connections, and which chat the Ask menus open - [Use the Tracked set](/price-intelligence/tracked-set/): where the pricing preferences above take effect Changes save as you make them. If you use more than one workspace, the same personal preferences follow your account. --- ## [Price bands](https://twelfth.ai/docs/settings/price-bands/) --- title: Price bands description: "The bands that decide when a line reads as priced above or below market, who set them, and who can remove them." lastmod: 2026-10-13 --- # Price bands A price band says how far a line's price can sit from the market price before the Pricing page reads it as **Priced above market** or **Priced below market**. Inside the band it reads **In line with market**. A band reads "+8% / −5%": more than 8% above the market price is priced above market, and more than 5% under it is priced below market. **Settings → Price bands** shows every band that applies to your lines. It appears in workspaces with pricing intelligence. Bands change how the Pricing page reads a line. They do not create tasks: your tasks come from your routines, which set their own thresholds. ## The default band The default band applies to every line that no override covers. Owners and admins change it here in the band editor (see **The band editor** below), price tiers and dollar limits included, and press **Save**. Save stays off until the band differs from the one in force. Everyone else sees the default in words, for example "±10% under $500, ±5% from $500", and that an owner or admin can change it. An owner or admin needs a verified email to manage the workspace's bands: the default, whole-business overrides and competitor bands. Until their email is verified, they can set and remove bands only within their own remits, like any buyer. ## Overrides An override sets a different band for a brand, a supplier, a category or a saved view, or for two of brand, supplier and category together. You add one here with **Add band** (see below), or by asking twelfth in chat, for example "set a +8% / −5% band for Mattel in my remit". A band you ask for in chat is limited to your own remits unless you ask for it to be workspace-wide, which only an owner or admin can apply. Nothing changes until you press **Apply** on the Price bands page in Settings. If you're limited to remits, a band that covers none of your lines isn't listed, unless it's limited to your own remits and so yours to remove. Each row shows: - **Applies to**: the brand, supplier, category or saved view, or both attributes of a pair ("Board Games · Hasbro"). A saved view that has since been deleted reads "Deleted saved view". A saved view that isn't a Pricing view reads with "(not a Pricing view)" after its name. A category that has since been removed or archived reads "Removed category". If you're limited to remits, names read as your own lines spell them, and a category that none of your lines fall in reads "Unknown category". - **Remove only**: a band whose target has gone or can't apply offers Remove only, with the note "This band no longer applies to any line." That covers a removed category, a deleted saved view, a saved view that isn't a Pricing view, a brand or supplier no longer on any line, and a pair that no longer covers any line. A band on a saved view that isn't a Pricing view no longer applies to any line. A new band can't be set on any of these. If a band's lines couldn't be checked when the page loaded, the row reads "Couldn't check this band's lines. Reload to try again." It offers Remove only until a reload checks them. - **Limited to**: the remits the override covers, or **Whole business**. Remits you can't see are counted, not named ("Toys + 2 other remits"). - **Band**: the band, for example "+8% / −5%". - **Changed**: who last set it, and when, in Melbourne time ("Michael · 12 Oct 17:18 AEDT"). Someone who is no longer a member reads "a teammate". When more than one override covers a line, they are tried in this order, and the first that covers it applies: 1. A band on two attributes before a band on one. 2. The kind: a saved view, then a brand, then a supplier, then a category. 3. Within one kind, an override limited to remits before a whole-business one. 4. Among saved views, the smaller view (fewer lines) first. 5. Then the most recently changed. A line no override covers takes the default band. You can remove an override limited to your own remits. Owners and admins can remove any override. Lines it covered go back to the next band that applies. ## Adding and editing a band Press **Add band** above the overrides to add one. - **Applies to**: choose a kind (Brand, Supplier, Category or Saved view), then pick a value. Each value shows how many of your lines on the Pricing page it covers. Values that cover none of your lines aren't listed. Saved view lists only saved Pricing views, the views saved from the Pricing page. A view saved from the catalogue or from pre-orders can't take a band. - **Competitor**: owners and admins also see a Competitor kind. It sets a band for one competitor's prices, across the whole business, so it has no Limited to. A competitor that already has a band isn't listed; change its band in the competitor list instead. - **Add another attribute**: after picking a brand, supplier or category, you can add one of the other two. Only values sold together with the first in the remits you chose are listed. Board Games from Hasbro reads "Board Games · Hasbro". A saved view and a competitor take no second attribute. If you change **Limited to** after picking the second value, that value is cleared and the list shows the values for the remits you now chose, so pick it again. - **Limited to**: a band is limited to your own remits. Owners and admins can choose **Whole business** instead. If you hold no remits and aren't an owner or admin, you can't add a band, and Add band isn't shown. - **Band**: the band editor (below). Add starts from the default band, price tiers and dollar limit included. If what you picked, limited to the same remits, already has a band, the form loads that band and says "A band for this already exists. You're editing it." Save then changes that band rather than adding another. **Edit** changes the numbers only: the whole band, in the band editor, with any price tiers and dollar limit it has. What a band applies to and where it is limited stay as they are; to change those, remove the band and add another. Edit appears on the rows you can change, overrides and competitor bands alike, beside Remove. A band whose brand, supplier, category or saved view has gone shows Remove only. If the bands change while the form is open, your Save is not made. The form shows your change against the latest bands, before and after, and you press **Save** again to make it. ## Price tiers and dollar limits A band can have **price tiers**: a different band by price. "±10% under $500, ±5% from $500" reads lines under $500 with ±10% and lines from $500 with ±5%. The tier a line uses is picked by our shelf price, on the Pricing page's price basis (live, or the 4, 8 or 12-week average). For a competitor band, it is picked by our price against that competitor. A band has at most 3 tiers. A band can also have a **dollar limit** on either side. "±$20 or ±5%, whichever is lower" reads a line as priced above market when it is more than $20 or more than 5% above the market price, whichever limit is lower. The same test applies below. Each side is separate, so a band can have a dollar limit above and none below ("+$20 or +8%, whichever is lower / −5%"). Each tier can have its own dollar limit. Every band takes tiers and dollar limits: the default (owners and admins, in **The default band**), an override (**Add band**, or **Edit** on its row) and a competitor band (**Add band**'s Competitor kind, or **Edit** on its row). ### The band editor The default, Add band and Edit all use the same band editor: - **Above %** and **Below %**: each a number from 0 to 50, in steps of 0.5. - **Add a dollar limit** adds **Above $** and **Below $** to every row. Each is optional: leave one empty for no dollar limit on that side. Type dollars as you would anywhere: "$1,500", "1500" and "20.5" all work. An amount takes $0.01 to $10,000, to the cent. Anything else, such as "2.505", "0" or "−5", is refused on the field with "Enter dollars from $0.01 to $10,000.", and Save stays off; nothing is rounded for you. **Remove the dollar limit** clears every amount. - **Add a price tier** adds a row that starts **From $** a price you type, with its own Above % and Below % (and Above $ and Below $ when the band has a dollar limit). The first row then reads "Under $500", for the lines below the first tier. A from-price must be above $0 ("Start a tier above $0.") and at most $100,000 ("Up to $100,000."). Add a price tier is hidden once the band has 3 tiers. Each tier has a **Remove**. - The tiers sort by their from-price as you type. Two tiers can't start at the same price: the second reads "Two tiers start at $500." until you change one. ## Applying a band proposed in chat When twelfth proposes a band, its link opens this page with a **Review band change from chat** panel at the top. For each change it shows what the band applies to, where it is limited, and the band before and after. A new band shows the band its lines take today, worked out over the lines it covers that you can see (the lines the Pricing page shows you: a line sold under two SKUs counts once), in the order above: for example "Default ±5% → +8% / −5%", or "Board Games category (Whole business) ±6% → +8% / −5%" when a category band covers them now. When those lines take different bands today, it reads "Varies (3 bands)". If a band that comes earlier in the order (a saved view's band over a brand band, say) will still cover some of the lines after you apply, the panel says on how many lines the change won't take effect. For a change that covers more than 1,000 lines, the panel reads the first 1,000 and says so, and its counts read "at least". In a proposal with many such changes, later ones may not be read at all: the panel says so and shows no band before them. A change that is already in force, because someone applied it already, reads **Already in force**, and applying it changes nothing: who changed the band and when stay as they were. Removing a band that someone else already removed reads the same for an owner or admin; anyone else sees it as a band they can't see, and can't apply it. When every change in the panel is already in force, there is nothing to apply. If you can't make a change, the panel says why before you press anything, and **Apply** is off. Press **Apply** to make the change, or **Discard** to drop it. Nothing changes until you press Apply. If someone changed the bands after twelfth proposed, the panel says so as soon as it opens and shows the change against the latest bands; **Apply** makes it against those. If they change again while the panel is open, your Apply is not saved: the panel shows the change against the newest bands, and you press **Apply** again. A change is never applied over bands you haven't seen. ## Competitor bands A competitor band sets the band for one competitor's prices, across the whole business. Only owners and admins can add, edit or remove one. ## When someone else changes the bands first If the bands change while you have the page open, your change is not saved. The page shows the latest bands, and you can try again. If a change is refused, the page gives the reason beside it. --- ## [Pricing](https://twelfth.ai/docs/settings/pricing/) --- title: Pricing description: "See the retailers Twelfth tracks for your workspace, request more, and set pricing defaults." lastmod: 2026-10-19 --- # Pricing **Settings → Pricing** is available in workspaces with pricing intelligence. It has two tabs: **Retailers** and **Settings**. **Retailers** lists the retailers Twelfth tracks for the workspace. The list is read-only. To add a retailer, track only part of one (a category, or first-party listings only), or drop one, choose **Request a retailer** and describe what you need. Twelfth replies by email. **Settings** shows the plan allowances and holds the workspace's delivery-check postcodes, plus your own competitor-favicon preference. To build your own list of products to watch, save a view on the Pricing page: filter it, or choose **Lines from a SKU list** and paste or upload SKUs or barcodes. A SKU list only picks from the lines Twelfth already tracks; any SKU it does not track is listed back to you rather than added. To change the lines on a saved view later, open it and use the list button beside its name. If the list lives in a Google Sheet or a OneDrive or SharePoint file, choose it with **From a drive** and tick **Keep in sync**. Twelfth reads the same tab and column every hour and replaces the view's lines. The view's toolbar shows when it last synced and how many values Twelfth does not track; open it to **Sync now** or **Stop syncing**, which keeps the current lines. If a sync cannot be used (the tab or column was renamed, or nothing in it is tracked), the view keeps its lines and says why. Choosing a list by hand also stops syncing. Views you save carry a pen mark in the Products sidebar; the others are Twelfth's. The tracked product basket and tracked sets are managed by Twelfth. See [Manage the tracked pricing set](/price-intelligence/tracked-pricing-set/) for how they work. --- ## [Profile](https://twelfth.ai/docs/settings/profile/) --- title: Profile description: Update the display name, title and other personal details colleagues see for you across your Twelfth workspaces, from the Profile card on the Account page. lastmod: 2026-10-16 --- # Profile Open **Settings → Account** to manage your personal identity in Twelfth. Profile is the first card on the Account page; your sign-in methods, two-factor authentication, passkeys and sessions follow it. See [Security and access](/settings/security-and-access/). ## Profile fields | Field | Description | | --- | --- | | Display name | The name shown to colleagues across your Twelfth workspaces. This cannot be blank. | | Title | What you do, such as "Category manager" or "Head of Commercial". This describes your work; it does not grant access. | | Email | Your sign-in email. It is shown for reference and cannot be changed from this form. Which providers are attached to it is shown in [Sign-in methods](/settings/security-and-access/) further down the same page. | Fields save when you leave them. Workspace access is managed in [Members](/settings/members/). Title and Role used to be two separate fields. They asked the same question, so they are now one. If you had filled in both, the first save joins them into the single Title field. ## Profile photo Select your photo to upload a replacement. Twelfth accepts PNG, JPEG, and WebP images up to 5 MB. It crops the image to a square and saves a compact 256px version. If you haven't chosen a photo, Twelfth tries your connected Google or Microsoft account in the background, then checks [Gravatar](https://gravatar.com) using a hash of your verified email address. This also applies to existing accounts and email/password signups. Photos depend on what those services make available; if none is found, your initials remain. Automatic lookups never delay sign-in or replace a photo you've uploaded. Results are cached, and missing photos are checked again after a day. Your profile photo and name help people identify you. --- ## [Projects](https://twelfth.ai/docs/settings/projects/) --- title: Projects description: "How a workspace runs its projects: the rules every project follows, and the rules each workflow keeps for itself." lastmod: 2026-10-06 --- # Projects settings A **project** is the container the work sits in. Twelfth's daily sync opens one per supplier, per remit or per lane and keeps feeding it: new lines land in the project that is already open, and the project's stages are the states its lines are in: **Triage** (what you have not settled), **Pending** (what you have), and the last stage, where the order is raised. People also start projects by hand for work that is not a batch of lines, such as logging a problem out of a conversation. Open **Settings → Business → Projects** to set the rules. The page has two parts. **Every project** holds the rules that apply whatever workflow a project runs on. **By workflow** holds the rules one workflow keeps for itself: pick the workflow from the row and its own rules appear beneath it. A workflow with nothing of its own yet says so and runs on the general rules alone. ## Every project ### Close a finished project that nobody touches Off by default. When it is on, Twelfth closes a project where **every line is decided** and **nothing has changed** for the number of days you set (1–90). It is never an override: the sweep only closes what a buyer could have closed themselves, and it never closes a project that still has an open line, or one the daily sync is still adding to. A project closed this way says so in its log. ### Workflows people can start This list sets which of the hand-started workflows appear on **New project**. Every workflow Twelfth offers is open to every workspace; this list only narrows it. The engine's own projects (supplier buys, price reviews and transfers) are opened by the daily sync and are not switched off here. | Workflow | What it is for | | --- | --- | | **Log a problem** | Short-horizon work with a date: a chat, the tasks it raises, and a close. | | **Supplier negotiation** | One category's terms negotiated with several suppliers at once, against a cost target. | Workflows that are designed but not built yet appear as dashed **Coming soon** cards on the New project form whatever this list says. Opening one shows what it will be and records that you want it, which is what decides the order they get built in. See [Projects → Workflows](/projects/#workflows) for the full library. ### Who takes work nobody owns Each supplier buy, price review and transfer the sync raises also appears in **Tasks**, assigned to whoever holds its remit. Some work has no holder: a remit nobody is assigned to, or a transfer between stores, which has no remit. Pick an owner or admin here and that work becomes their task. They can open every remit, and they can hand each task to someone else from its assignee chip. A task handed on this way stays with its new holder through later syncs. Once the remit gets an owner in **People**, the task moves to that person. Leave this on **Nobody** and the work stays in Projects only. ## By workflow ### Supplier buy: who raises the order A supplier project spans every buyer holding that supplier's lines: Mattel across three remits is one project and three sets of lines. This setting decides whether the order waits for all of them. | Choice | What it means | | --- | --- | | **Every buyer signs off** | The order can only be raised once nothing is left open. Nobody's lines are sent before they have decided them. | | **An owner may raise it early** | A workspace owner or admin can raise the order with lines still open. The override is recorded on the project, and the units still open move into a new project for the same supplier so nothing in flight is lost. | This rule applies to every supplier project in the workspace; the project's **gate** reads it when it decides whether the order is ready to raise. ### Supplier negotiation: cost of goods basis This sets what a supplier's cost of goods is wherever a negotiation sizes a cost target, an ask or an outcome against it. Twelfth reads it from trading history as **ex-tax sales × (1 − GP%)** over the window you choose (13, 26 or 52 weeks) and strips the **sales tax rate** you set only where your trading history reports sales including tax. A negotiation's Status page names the basis it is priced against and links back here. ## What raising an order does today Raising closes the batch and writes the consolidated order as a **CSV file** on the project, alongside the record of who raised it and when. **Nothing is sent to the supplier**. Sending it, by email or into the retailer's own system, is the next step; until that exists, the file is the hand-off. The next daily sync opens a fresh project for that supplier, so the new week's lines never land in a batch that has already gone out. --- ## [Regional & commercial](https://twelfth.ai/docs/settings/regional-and-commercial/) --- title: Regional & commercial description: "Where the business trades, in what currency, and how tax is read: the facts every commercial value in Twelfth is shown against." lastmod: 2026-10-09 --- # Regional & commercial Open **Settings → Business → Regional & commercial**. These are facts about the business rather than preferences: the timezone schedules run on, the currency values are shown in, and how tax is read off the figures your systems supply. Everyone in the workspace reads against them. **Timezone, Currency and Country are set by Twelfth.** Routine schedules, project close-outs, sign-offs and the suggested tax name all depend on them, so changing one after setup can make existing work read differently. A new workspace takes them from your browser when you create it. After that they show as read-only; ask us if one is wrong. Owners and admins can change the tax name, tax basis and labelling below. | Control | What it changes | | --- | --- | | Timezone | Schedules, routines, briefing delivery and activity timestamps. | | Currency | The default currency for commercial values. | | Country | Regional formats and a suggestion for the tax name. | | Tax name | The word Twelfth uses for tax on source amounts: GST, GST/HST, VAT, sales tax, SST, consumption tax, or a generic label. An explicit choice stays in place when country changes. | | Preferred inventory tax basis | Whether supplied stock costs are shown including or excluding that tax. | | Label tax basis on figures | Whether sales figures say "inc GST" or "ex GST" beside them. On by default for a workspace whose costs are read including tax. | ::: callout note "Change these before the data, not after" The tax basis and currency apply to what Twelfth shows, not to what your systems send. If the source feed reports costs including tax, say so here so a margin is read the same way everywhere. ::: ## Labelling sales figures Sales keep the basis your source supplied. With **Label tax basis on figures** on, the basis is named where a sales figure appears: Home's opening sentence, the Suppliers table (once, in the Sales header) and a supplier's Sales card, the Performance mix table, a negotiation's fact base, and pre-order net sales. Turn it off to keep tables quieter. Some figures are labelled either way. A column whose rows are on different bases names the basis in every cell. A negotiation names both bases when its sales are inc tax, because its cost of goods and range plays are always ex tax. Performance always states the basis in its header line. In a negotiation fact base with inc-tax sales, **Estimate ex tax for supplier meeting** gives a temporary ex-tax view using the workspace's configured negotiation tax rate. It names the rate and keeps the source figures available. This is an estimate: exemptions and mixed rates can make a supplier's finance total differ. Check a supplier total against finance before using it as a signed-off number. Changing Country suggests GST for AU, NZ, SG and IN; GST/HST for CA; SST for MY; VAT for the UK, EU and ZA; Sales tax for the US; Consumption tax for Japan; and Tax elsewhere. It changes terminology only. No tax rate or source basis is inferred from country. ## Related - [Guardrails](/settings/guardrails/) — the limits a decision passes through - [Briefings & alerts](/settings/briefings-and-alerts/) — whether and how people are told - [Settings overview](/settings/overview/) --- ## [Security and access](https://twelfth.ai/docs/settings/security-and-access/) --- title: Security and access description: Protect your Twelfth account with sign-in methods, two-factor authentication, recovery codes, passkeys, and session controls. lastmod: 2026-10-19 --- # Security and access Open **Settings → Account** to manage the ways you sign in and the devices that can use your account. ## Verify your email If your email address isn't confirmed yet, Twelfth shows a banner across the app that reads *"Verify your email to secure your account"* and names the address the link was sent to. Choose **Resend email** if you need another link. Your verified status is also shown as a **Verified** badge next to your address in [Profile](/settings/profile/). ::: callout note "Invited members are verified on the way in" If you joined from a workspace invitation, your email is confirmed automatically when you accept, so you won't see the banner. It only appears for self sign-ups whose address hasn't been confirmed yet. ::: ## Sign-in methods Use your Twelfth email and password, or sign in with **Google** or a **Microsoft work or school account**. Both buttons are on the front of the login page; passkeys, email and password and single sign-on are under **See other login methods**. See [Signing in](/signing-in/) for every option. **Settings → Account → Sign-in methods** lists what is attached to your account today; a provider joins the list by being used to sign in, not by being added here. Attaching a provider to an existing account needs the same email address, verified on both sides: - **Google** verifies the address it returns, so a Google sign-in with your Twelfth email attaches to your account straight away. - **Microsoft** only counts an address as verified when the organisation that owns the account has verified the email's domain in Microsoft Entra, which is the case for a normal company tenant. A personal or unverified address still signs in, but as a new identity: it cannot attach itself to an existing account, and Twelfth asks it to verify the email like an email-and-password signup. This is deliberate: an Entra administrator can put any address on a user in their own tenant, and the domain check is what stops that becoming someone else's account. ::: callout note "Microsoft: which account?" Microsoft asks which account to use each time, so a person with a seat in more than one tenant is never signed in as the wrong one silently. ::: ## Two-factor authentication 2FA uses a code from an authenticator app, such as 1Password, Google Authenticator, or Authy. 1. **Start setup.** Select **Set up 2FA** and confirm your password if asked. 2. **Scan the QR code.** Scan the Twelfth QR code with your authenticator app. 3. **Save recovery codes.** Save the one-time recovery codes somewhere secure. 4. **Verify the code.** Enter the current authenticator code. Password sign-ins then require a current code. Trusted devices expire after 30 days. ::: callout warning "Warning" Do not store recovery codes only in the same password manager or device that you use for your authenticator app. Each recovery code can be used once. ::: You can disable 2FA here unless your workspace requires it. ## Passkeys Passkeys let you sign in with your device biometrics, device PIN, or a security key. Select **Add passkey** and complete the device prompt. Keep another sign-in method before removing one. ## Signed-in sessions Review **Signed-in sessions** and sign out any device you do not recognise. Change your password if you think your account was exposed. --- ## [Google Workspace](https://twelfth.ai/docs/settings/single-sign-on/google-workspace/) --- title: Google Workspace description: "Set up SAML single sign-on to Twelfth from Google Workspace with a custom SAML app: what to create in the Admin console and what to enter in Twelfth." lastmod: 2026-10-06 --- # Google Workspace This guide sets up **SAML single sign-on** from Google Workspace. You'll need a Google Workspace super administrator and a Twelfth workspace owner or admin. Read [Single sign-on & SCIM](/settings/single-sign-on/) first if you haven't. ::: callout note "Google sign-in vs. Google Workspace SSO" Twelfth already offers **Continue with Google** on the login page. Setting up Workspace SSO adds what that can't: your Workspace context-aware access, device and session policies apply, and sign-in goes through your admin-controlled SAML app rather than a per-person Google consent. ::: ## 1. Create the custom SAML app 1. In the [Google Admin console](https://admin.google.com), open **Apps → Web and mobile apps → Add app → Add custom SAML app**. 2. Name it *Twelfth* and continue. 3. On **Google Identity Provider details**, either **Download metadata** (the XML file) or copy the **SSO URL**, **Entity ID** and **Certificate**. Keep this tab open; you'll need the metadata in step 3. ## 2. Paste Twelfth's details into Google In Twelfth, open **Settings → Workspace → Security & SSO → Single sign-on**. Under *Create the app in your identity provider* you'll find the values below with copy buttons. On Google's **Service provider details** page, set: | Google field | Twelfth value | | --- | --- | | ACS URL | *Reply URL (Assertion Consumer Service)* from the panel | | Entity ID | *Identifier (Entity ID)* from the panel | | Start URL | `https://twelfth.ai/login` (optional) | | Name ID format | **EMAIL** | | Name ID | **Basic Information → Primary email** | Continue to **Attribute mapping** and add these three, using exactly these app attribute names: | Google directory attribute | App attribute | | --- | --- | | Basic Information → First name | `firstName` | | Basic Information → Last name | `lastName` | | Basic Information → Primary email | `email` | Finish. ## 3. Paste Google's details into Twelfth 1. In Twelfth's panel, choose **SAML 2.0** and enter your **email domain** (for example `example.com`). 2. Paste the contents of the metadata XML you downloaded into **…or paste the metadata XML** (Google doesn't publish a metadata URL for custom apps), and press **Register identity provider**. ## 4. Prove you own the domain The panel shows a DNS **TXT** record. Add it at your DNS host (for a Workspace domain, usually where your MX records already live), then press **Check now**. Sign-in through Google Workspace SSO is refused until it resolves. ## 5. Turn the app on and test 1. In the Admin console, open the Twelfth app, then **User access**, and turn it **ON for everyone** (or for the organisational units that should have it). Google can take a few minutes to apply. 2. Sign out of Twelfth, open the [login page](https://twelfth.ai/login), choose **See other login methods → Continue with single sign-on**, and enter your work email. ## Provisioning Google Workspace only auto-provisions to apps in its pre-integrated catalogue, so **SCIM from Google Workspace is not available** for Twelfth. Manage membership through [Members](/settings/members/) (invitations for joiners, deactivation for leavers), or provision from a directory that supports SCIM to custom apps (Entra ID, Okta). ## Troubleshooting - **Google error "app_not_configured_for_user"**: the app isn't turned on for that person's organisational unit (step 5). - **"Provider domain has not been verified"**: the DNS record hasn't resolved yet. - **Signed in with no display name**: the attribute mapping in step 2 wasn't saved with the exact names `firstName`, `lastName`, `email`. --- ## [Single sign-on & SCIM](https://twelfth.ai/docs/settings/single-sign-on/) --- title: Single sign-on & SCIM description: Sign in to Twelfth through your own identity provider (SAML 2.0 or OpenID Connect) and let your directory manage who has access. lastmod: 2026-10-19 --- # Single sign-on & SCIM With **single sign-on (SSO)**, people sign in to Twelfth with their company account (Microsoft Entra ID, Google Workspace, Okta or any SAML 2.0 / OpenID Connect provider), and your identity provider's policies (MFA, conditional access, device rules) apply to Twelfth too. With **SCIM provisioning**, your directory adds and removes people from the workspace, so leavers lose access the moment they're removed from the app in your directory. Both live at **Settings → Workspace → Security & SSO → Single sign-on** and are part of the **Enterprise** plan. Only workspace **owners and admins** can set them up. ::: callout tip "Just want people to sign in with their Microsoft or Google account?" You don't need SSO for that. **Continue with Microsoft** and **Continue with Google** are on the login page for everyone, on every plan, with no setup. See [Signing in](/signing-in/). ::: ::: callout info "Enterprise plan" If the section shows *Enterprise* rather than a setup panel, single sign-on is not yet enabled for your workspace. Talk to your Twelfth contact and we'll switch it on as part of your agreement. ::: ## How it fits together - **One identity provider per workspace.** You register the IdP once; everyone whose work email is on your **email domain** is sent to it when they choose *Continue with single sign-on* on the login page. - **Existing people keep their accounts.** A buyer you invited earlier who already signs in with a password is linked to their SSO identity on first SSO sign-in — same email, same account, same remits and history. - **New people join automatically.** Someone your IdP asserts who has never used Twelfth gets an account and joins the workspace as a *member*. Owners and admins are still appointed in [Members](/settings/members/). - **Other sign-in methods stay available.** Password, passkey, Google and Microsoft sign-in keep working for existing accounts, so nobody is locked out while you set up. ## Set it up Follow the guide for your provider. Each one walks through both sides: ::: card "Microsoft Entra ID" icon:building-2 SAML app registration plus SCIM provisioning from Entra. [Open the guide](/settings/single-sign-on/microsoft-entra/){.docmd-button} ::: ::: card "Google Workspace" icon:globe Custom SAML app in the Google Admin console. [Open the guide](/settings/single-sign-on/google-workspace/){.docmd-button} ::: ::: card "Okta" icon:key-round SAML app integration plus SCIM provisioning from Okta. [Open the guide](/settings/single-sign-on/okta/){.docmd-button} ::: ::: card "Other providers & OpenID Connect" icon:plug-zap Any SAML 2.0 or OIDC identity provider. [Open the guide](/settings/single-sign-on/other-providers/){.docmd-button} ::: Every value in the panel is a chip: click it to copy, and it ticks. The **⋯** menu on step 1 exports the whole setup as a Markdown sheet for whoever runs your IdP, or as a prompt you can paste into ChatGPT, Claude or Copilot to be walked through your provider's console screen by screen. The panel works in the order an IdP administrator does: 1. **Copy Twelfth's details into your IdP**: the *Identifier (Entity ID)* and *Reply URL (ACS)* shown at the top of the panel, each with a copy button. 2. **Paste your IdP's details back**: the federation metadata URL (or the XML), and the **email domain** your people sign in with. 3. **Prove you own the domain**: add the DNS TXT record the panel shows and press **Check now** (the panel also re-checks every 30 seconds). If your domain's DNS is on a provider that supports Domain Connect (Cloudflare, GoDaddy, IONOS…), the panel offers **Add the record on …**. One click on their consent screen and they write the record for you. Sign-in through your IdP stays off until the record resolves; it is what stops anyone else claiming your domain. 4. **Test** with one person, then tell the team. ::: callout tip "DNS slower than your go-live?" If your DNS team can't add the record quickly, ask Twelfth support. Once we've confirmed the workspace owns the domain, we can verify it for you. ::: ## Signing in with SSO On the [login page](https://twelfth.ai/login), choose **See other login methods → Continue with single sign-on**, enter your work email, and you'll be sent to your company sign-in and back into Twelfth. After the first time, *Continue with single sign-on* is shown as your last-used method. ## Directory provisioning (SCIM) Once SSO is set up, the **Directory provisioning** section lets your IdP manage membership over SCIM 2.0: 1. Press **Generate SCIM token**. The token is shown **once**, so paste it into your IdP's provisioning settings straight away, together with the **Tenant URL** shown above it. 2. In your IdP, assign the people (or groups) who should have Twelfth. What provisioning does: | In your directory | In Twelfth | | --- | --- | | Person assigned to the app | Joins the workspace as a member (or is linked, if they already have an account) | | Person unassigned, deactivated or deleted | Becomes a **deactivated** member: can't sign in to the workspace; their remits, decisions and history are kept | | Person reassigned | Reactivated with everything intact | | Name changed | Updated on their profile | Roles (owner/admin) and remits are **not** driven by the directory; set them in Twelfth. Provisioning never deletes anyone, and it will never deactivate the last active owner. Tokens last a year. **Rotate token** issues a new one while the old keeps working until you **Revoke** it, so rotation never interrupts provisioning. ## Removing SSO **Remove** on the identity provider stops SSO for your domain. Nobody is signed out; the next sign-in falls back to password, passkey, Google or Microsoft. You can register a provider again at any time. **Disconnect** on directory provisioning stops SCIM and revokes its tokens; existing members are untouched. ## Related - [Workspace: security policy](/settings/workspace-security/) — authenticator-app enforcement for the workspace, alongside whatever your IdP enforces at login. - [Members](/settings/members/) — roles, invitations and deactivation by hand. - [Account: security & access](/settings/security-and-access/) — passkeys and 2FA for an individual account. --- ## [Microsoft Entra ID](https://twelfth.ai/docs/settings/single-sign-on/microsoft-entra/) --- title: Microsoft Entra ID description: Set up SAML single sign-on to Twelfth from Microsoft Entra ID (formerly Azure AD), then optional SCIM provisioning so Entra manages who has access. lastmod: 2026-10-19 --- # Microsoft Entra ID This guide sets up **SAML single sign-on** from Microsoft Entra ID (formerly Azure AD), then optional **SCIM provisioning** so Entra manages who has access. You'll need an Entra role that can create enterprise applications (Cloud Application Administrator or Global Administrator) and a Twelfth workspace owner or admin. Read [Single sign-on & SCIM](/settings/single-sign-on/) first if you haven't. ::: callout tip "Not the same as Continue with Microsoft" Anyone with a Microsoft work account can already choose **Continue with Microsoft** on the login page, with no setup. This guide is for routing your whole domain through Entra, with your conditional-access policies and SCIM. See [Signing in](/signing-in/#sign-in-with-microsoft-vs-single-sign-on). ::: ## 1. Create the enterprise application 1. In the [Entra admin centre](https://entra.microsoft.com), open **Identity → Applications → Enterprise applications → New application**. 2. Choose **Create your own application**, name it *Twelfth*, select **Integrate any other application you don't find in the gallery (Non-gallery)**, and create it. 3. In the new application, open **Single sign-on → SAML**. ## 2. Paste Twelfth's details into Entra In Twelfth, open **Settings → Workspace → Security & SSO → Single sign-on**. Under *Create the app in your identity provider* you'll find the values below, each with a copy button. In Entra's **Basic SAML Configuration** panel, set: | Entra field | Twelfth value | | --- | --- | | Identifier (Entity ID) | *Identifier (Entity ID)* from the panel | | Reply URL (Assertion Consumer Service URL) | *Reply URL (Assertion Consumer Service)* from the panel | | Sign on URL | `https://twelfth.ai/login` (optional) | Save. Leave **Attributes & Claims** at their defaults: Twelfth reads Entra's standard claims (`emailaddress`, `givenname`, `surname`, `displayname`) and the **Unique User Identifier** as `user.userprincipalname`. If your users' principal names are not their email addresses, change the Unique User Identifier to `user.mail`. ## 3. Paste Entra's details into Twelfth 1. In Entra's SAML page, under **SAML Certificates**, copy the **App Federation Metadata Url**. 2. In Twelfth's panel, choose **SAML 2.0**, enter your **email domain** (for example `contoso.com`), paste the metadata URL, and press **Register identity provider**. ::: callout note "Several email domains?" If your people sign in with more than one domain, enter them separated by commas. Each one needs its own DNS record in the next step. ::: ## 4. Prove you own the domain The panel now shows a DNS **TXT** record. Add it at your DNS host, then press **Check now**. Until it resolves, sign-in through Entra is refused. This is what stops anyone else registering your domain. ## 5. Assign people and test 1. In Entra, open the application's **Users and groups** and assign at least yourself. 2. Sign out of Twelfth, open the [login page](https://twelfth.ai/login), choose **See other login methods → Continue with single sign-on**, and enter your work email. You should land back in the workspace. ::: callout warning "Assignment required" Entra only issues an assertion for assigned users. Someone not assigned to the application sees an Entra error (*AADSTS50105*) rather than a Twelfth one. Assign them and try again. ::: ## 6. Provisioning (SCIM) With SSO working, let Entra manage membership: 1. In Twelfth's panel, under **Directory provisioning**, press **Generate SCIM token**. Copy the token (it is shown once) and the **Tenant URL** above it. 2. In Entra, open the application's **Provisioning → Get started**, set **Provisioning Mode** to *Automatic*, and under **Admin Credentials** enter the Tenant URL and the token as **Secret Token**. Press **Test Connection**, then **Save**. 3. Under **Mappings → Provision Microsoft Entra ID Users**, the defaults work. Make sure `userPrincipalName → userName` and `mail → emails[type eq "work"].value` are present (they are by default). 4. Set **Provisioning Status** to *On* and save. Entra provisions assigned users on its cycle (initially within ~40 minutes; you can trigger **Provision on demand** for one person to test). People assigned to the app join the workspace; people unassigned or deleted are deactivated in Twelfth (never deleted). Roles and remits are still set in Twelfth. ## Troubleshooting - **"Provider domain has not been verified"**: the DNS record hasn't resolved yet. Check the record name and value exactly as shown, then **Check now**. - **"Single sign-on isn't set up for that email domain"**: the domain typed on the login page doesn't match the domain registered in the panel. - **Entra error AADSTS700016 / AADSTS50011**: the Identifier or Reply URL in Entra doesn't match the panel exactly. Re-copy both. - **Signed in, but landed in the wrong workspace**: the person belongs to more than one workspace; switch from **Settings → Workspace → My workspaces**. --- ## [Okta](https://twelfth.ai/docs/settings/single-sign-on/okta/) --- title: Okta description: Set up SAML single sign-on to Twelfth from Okta, then optional SCIM provisioning so Okta manages who has access — the app integration and the Twelfth side. lastmod: 2026-10-01 --- # Okta This guide sets up **SAML single sign-on** from Okta, then optional **SCIM provisioning**. You'll need an Okta administrator who can create app integrations and a Twelfth workspace owner or admin. Read [Single sign-on & SCIM](/settings/single-sign-on/) first if you haven't. ## 1. Create the app integration 1. In the Okta Admin Console, open **Applications → Applications → Create App Integration**. 2. Choose **SAML 2.0** and continue. Name it *Twelfth*. ## 2. Paste Twelfth's details into Okta In Twelfth, open **Settings → Workspace → Security & SSO → Single sign-on**; under *Create the app in your identity provider* the values below have copy buttons. On Okta's **Configure SAML** page, set: | Okta field | Twelfth value | | --- | --- | | Single sign-on URL | *Reply URL (Assertion Consumer Service)* from the panel | | Audience URI (SP Entity ID) | *Identifier (Entity ID)* from the panel | | Name ID format | **EmailAddress** | | Application username | **Email** | Under **Attribute Statements**, add: | Name | Value | | --- | --- | | `email` | `user.email` | | `firstName` | `user.firstName` | | `lastName` | `user.lastName` | Finish (choose *I'm an Okta customer adding an internal app* if asked). ## 3. Paste Okta's details into Twelfth 1. On the app's **Sign On** tab, under *SAML 2.0*, copy the **Metadata URL**. 2. In Twelfth's panel, choose **SAML 2.0**, enter your **email domain**, paste the metadata URL, and press **Register identity provider**. ## 4. Prove you own the domain Add the DNS **TXT** record the panel shows, then press **Check now**. ## 5. Assign people and test Assign yourself on the app's **Assignments** tab, sign out of Twelfth, and use **See other login methods → Continue with single sign-on** on the [login page](https://twelfth.ai/login). ## 6. Provisioning (SCIM) 1. In Twelfth's panel, press **Generate SCIM token** and copy the token (shown once) and the **Tenant URL**. 2. In Okta, on the app's **General** tab, edit **App Settings** and tick **Enable SCIM provisioning**. A **Provisioning** tab appears. 3. Under **Provisioning → Integration**, set the **SCIM connector base URL** to the Tenant URL, **Unique identifier field for users** to `email`, tick *Push New Users*, *Push Profile Updates* and *Push Groups*, choose **HTTP Header** authentication and paste the token. **Test Connector Configuration**, then save. 4. Under **Provisioning → To App**, enable **Create Users**, **Update User Attributes** and **Deactivate Users**. People assigned join the workspace; people unassigned or deactivated are deactivated in Twelfth (never deleted). Roles and remits are still set in Twelfth. --- ## [Other providers & OpenID Connect](https://twelfth.ai/docs/settings/single-sign-on/other-providers/) --- title: Other providers & OpenID Connect description: Connect any SAML 2.0 or OpenID Connect identity provider to Twelfth, such as JumpCloud, OneLogin, Ping, Keycloak or Auth0, with the settings it needs. lastmod: 2026-10-06 --- # Other providers & OpenID Connect Twelfth works with any identity provider that speaks **SAML 2.0** or **OpenID Connect**, including JumpCloud, OneLogin, Ping, Keycloak and Auth0. Read [Single sign-on & SCIM](/settings/single-sign-on/) first for how the panel flows. ## SAML 2.0 Create a SAML application in your IdP with: | Your IdP's field (names vary) | Twelfth value | | --- | --- | | SP Entity ID / Audience / Issuer | *Identifier (Entity ID)* from the panel | | ACS URL / Reply URL / SSO URL | *Reply URL (Assertion Consumer Service)* from the panel | | NameID format | `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress` | | NameID value | the person's work email | | Binding | HTTP-POST for the assertion; HTTP-Redirect for the request | | Signing | Sign the assertion (Twelfth requires signed assertions) | Send these attributes, named exactly like this: | Attribute | Value | | --- | --- | | `email` | work email | | `firstName` | given name | | `lastName` | family name | | `displayName` | full name (optional, used when first/last are absent) | Then in Twelfth's panel choose **SAML 2.0**, enter the email domain, paste your IdP's **metadata URL or XML**, and register. If your metadata has no `SingleSignOnService` element, the panel will ask for the IdP's login URL as well. Twelfth's own SP metadata is available at the *metadata URL* shown in the panel for IdPs that want to import it. ## OpenID Connect Create an OIDC web application (authorization code flow with PKCE) with the **Redirect URI** shown as *OIDC redirect URI* in the panel. Then in the panel choose **OpenID Connect** and enter: | Field | Value | | --- | --- | | Issuer | your IdP's issuer URL — Twelfth reads `/.well-known/openid-configuration` | | Client ID | from the application | | Client secret | from the application | Twelfth requests the `openid`, `email` and `profile` scopes and reads the standard `email`, `email_verified` and `name` claims. ## Domain verification Whatever the provider, sign-in through it stays off until the DNS **TXT** record shown in the panel resolves. Press **Check now** once it's added. ## Provisioning Any directory that provisions to custom SCIM 2.0 apps can manage membership. Use the **Tenant URL** and a token from **Generate SCIM token** with bearer (HTTP header) authentication; `/Users` and `/Groups` with `filter`, `PATCH` and `DELETE` are supported, and `userName` should be the work email. --- ## [Suppliers](https://twelfth.ai/docs/settings/suppliers/) --- title: Suppliers description: "Lead times, order terms and the supplier portfolio: what Twelfth knows about the people you buy from, and how each supplier is performing." lastmod: 2026-10-19 --- # Suppliers Suppliers live in one place: the **supplier portfolio** (**Suppliers** in the app rail). It is both halves of the relationship, not a settings form. **Settings → Suppliers** holds supplier *settings* (the favicon preference and the list of hidden and archived suppliers) and links across to the portfolio for everything else. The list is where you read how a supplier is *performing*: choose **1w**, **1m**, **6m**, or **12m** for its sales, share, GP, promotion, and year-on-year figures, then read current stock, cover, open tasks, lead time, and range size alongside them. That is what you open to decide who to call. Selecting a supplier opens their profile, where you correct what Twelfth *believes*: the lead-time override, the website, and the notes your team keeps. **Display** (beside the search box) chooses which columns the list shows. It opens showing **lead time** and **SKUs**, the two a buyer scans for, with units, GP and declared coverage a tick away. The choice is remembered on this browser, for this table only, and is yours alone: it does not change what anyone else sees. ## You see your own lines Supplier figures are **scoped to your remit**, the same way work items are. Several buyers often share a supplier, each owning different categories under it, so the units, GP and SKU count you see cover *your* lines under that supplier rather than the whole relationship. An owner or admin, who can see every remit, sees the whole thing. The **Me / All** workspace view in the app header says which reading you are getting, so a partial rollup is never mistaken for the total. Buyers who can only read their own remit do not need that switch and will not see it. ## What Twelfth measures, and what it can't - **Trading**: sales value, share of selection, GP%, promotion penetration, and year-on-year growth over the selected period. - **Reliability**: the lead time in force, the share of the range that declares one, and typical case pack. **Lead time from receipts** is measured where the purchase-order history allows it: the median number of days from a PO being raised to its stock being received, over the last 24 months, with how many receipt lines it rests on. Three things are deliberately shown as **not measured**, with the reason: - **Lateness**, **delivery slip** and **fill rate** need an expected date and an ordered quantity to compare each receipt against, and the source does not carry them. - **Trade spend** is not captured anywhere in the warehouse. The pipeline emits the column as an explicit NULL so the gap stays visible rather than being faked. Supplier-level annual revenue is not carried either. It arrives from Retail Express at supplier grain with no category breakdown, so it cannot be shown per buyer without inventing the split. Every other number here is built from SKU-level facts that attribute cleanly. A number Twelfth does not have is shown as an em dash, never as zero. A supplier with no data must not read as a supplier doing no business. ## Partial figures and data coverage **Sellable units**, **Physical on hand** and **Stock at cost** add up only the products that report a figure. A product the source sends no count or cost for is left out of the total, never counted as zero, so a supplier's total is a floor rather than the whole range. - **Partial** beside a figure means fewer than 75% of the supplier's products reported it. Hover the figure for the exact count, for example "78 of 113 products report physical units (69%); the other 35 are unknown, not zero", followed by the stock date. - A figure covering 75% or more carries no mark, because the total is close to the whole range. Hovering it still gives the count. - A figure covering every product has no coverage note. - **Days' cover** is never marked partial. A product with stock and no sales is left out of a cover ratio on purpose, so the gap is expected. - Turn on the **Data coverage** column (under **Display**) to see each supplier's weakest coverage as a percentage and sort by it. Exports always include the counts, because a spreadsheet has no hover. Each total has its own coverage. A product the source counts but does not price is in **Physical on hand** and out of **Stock at cost**, so the two can show different counts for the same supplier. ## Lead times: never a default A buying check needs to know how long a supplier takes to deliver. Twelfth never assumes one. For each supplier it uses, in order: 1. **A lead time a buyer set.** It is labelled with who set it. 2. **The lead time measured from receipts, when the receipts can be trusted:** at least 20 receipt lines, and fewer than 15% of them received the same day the PO was raised. It is labelled "from 1,240 receipts". 3. **Nothing.** Some suppliers' POs are raised when the stock arrives, so their receipts say a day or less when the real lead time is weeks ("receipts look unreliable: 19% same-day"). That figure is offered as a suggestion, never used. Until a buyer sets a lead time, the supplier's products are not checked. Trade-in stock bought over the counter is never ordered from a supplier, so it is never checked. You don't have to come here to fill them in. On a routine that checks buying (a planned buy, the sell-out scan or a store transfer), open the routine's page, go to **Setup**, and edit its **Products** row: it lists the suppliers in that scope with no usable lead time and asks once for each. Where receipts suggest a figure it is shown beside the box with a **Use** button, but it is only saved if you type a figure or press Use. What you enter there is saved to the supplier, for every buyer. ## Supplier profile Select a supplier to open their profile: - **Lead time**: the real order-to-delivery time in days. Leave it empty to use a reliable receipts figure, or to leave it unknown. Whoever sets it is recorded, so a lead time is never a bare, unexplained number. - **Minimum order quantity** and **minimum order value**: the supplier's terms, for every product unless a product says otherwise. A minimum order value is shown on the supplier's orders and never stops one. - **Website** and **email response time**: reference details for the buying team. Twelfth checks likely website domains for a live page whose title and description match the supplier, then autosaves the strongest match. A bare domain like `acme.com` is still fine when correcting it manually. - **Notes**: an append-only stream of what the team learns over time (MOQs, seasonal closures, contacts). Notes accrete rather than overwrite, so the supplier's context builds up; future sources can add extracted notes alongside handwritten ones. You can also give the chat a supplier's terms: "make Lego's lead time 6 weeks", "AID's MOQ is 12 units" or "the minimum order for Mattel is $500". You can also paste a supplier's email that states a lead time. Either way, the chat shows a card with each term as it is now and as it will be. Nothing changes until you press **Apply**, and the terms then hold for every buyer. A lead time taken from a supplier's email also keeps their words as a note on the supplier. ## Supplier currencies and exchange rates Open a supplier’s **Facts** tab to set an optional **Supplier quote currency**. Leave it on **Workspace default (AUD)** for ordinary local quotes, or choose USD or another currency for that supplier. The workspace currency is AUD unless the workspace is configured otherwise. An explicit currency on a row, in its cost value, or in the cost column heading takes precedence over either default. Conflicting or invalid currency labels remain unresolved. Unlabelled prices and a bare `$` use the supplier default, then the workspace currency. The default is captured with each new imported offer that uses it. Changing or clearing it later does not reinterpret saved offers, invoices, sales, stock valuations, minimum-order values or raised orders. Minimum-order values continue to use the workspace currency shown beside the field. **Currency & conversion** shows the supplier-to-workspace reference rate, its observation date and its source. Rates come from [Frankfurter](https://frankfurter.dev), which publishes daily reference rates from central banks and official sources. The latest observation may be from an earlier day, particularly on weekends or holidays. It is not a bank settlement quote. Supplier portal prices on product pages show their original currency and an approximate workspace-currency equivalent, using the current reference rate rather than a historical accounting rate. Base-currency prices use the ordinary symbol, such as `$100.00`, without repeating AUD. Foreign prices show their code, such as `USD 100.00`, with an approximate AUD amount underneath. Chat buying cards use the same display. The rate's source and observation date sit beside the conversion or in its hover detail. Chat can also look up the dated reference rate for a conversion in its answer. Estimates do not change recorded order costs. Mixed original currencies stay separate; a single budget or shared price break needs costs in one currency. There is no daily FX table in the current app schema. The shared reference-rate service reads Frankfurter and caches observations; Retail Express invoice conversion values remain historical invoice data, rather than today's FX feed. Choose **Preview a mixed-currency cost** to add separate items or cost components. For example, enter USD 100 for goods and AUD 20 for freight: the preview converts the USD component and adds the AUD component once. The original totals remain grouped by currency. Add deposits, fees and tax as their own components; all amounts are non-negative costs, so this preview does not model credits or refunds. An optional **agreed rate** overrides the reference for that currency in the preview—for a contracted rate or a bank spread. The direction is always shown: `1 USD = … AUD`. Clearing the override returns to the reference rate. Missing rates leave the full total unknown until you supply one. A cached rate used during an outage is explicitly labelled. The preview is temporary and is not saved to an order. It does not change purchasing quantities, budgets, margins or the currency in which an order is raised. Saved purchasing decisions retain their existing price and currency basis. ## Hiding or archiving a supplier Two items in the **⋯** menu beside a supplier's name take it out of the way. Both apply to everyone in the workspace, so only owners and admins can use them. - **Hide supplier…** is for a supplier nobody buys from: packaging, a trade-in bucket, an internal code. - **Archive supplier…** is for a supplier the workspace has stopped dealing with. It asks you to confirm, and records the date. Either way, the supplier: - leaves the supplier list, the rail, every supplier picker, @-mentions and ⌘K search; - has its open suggestions closed; - keeps its range, notes, projects and decisions. Badges and links to it on past work still open its page. An archived supplier's page says it is archived. **Settings → Suppliers → Hidden and archived suppliers** lists them all. **Unhide** or **Unarchive** there, or from the supplier's own ⋯ menu, offers the supplier again and brings back the suggestions that were closed. ## Cover rules A cover rule sets how much a planned buy orders for each line on future runs. It is a number of days of cover, a number of units, or a number of cases (the line's carton size). It can apply to one SKU, a supplier, a category, a remit or all lines, and it is yours unless an owner or admin sets it for the whole organisation. There are two ways to set one: - **On an order task.** Change the cover, then choose **Use N days for *supplier* on future runs**. That saves your cover rule for that supplier. - **In the chat.** For example, "set my cover for All Interactive to 21 days" or "keep 2 cases of SKU-123". The chat saves nothing by itself. It shows a card under its answer with the rule in force now, the new rule, who it is for and how many of your lines it reaches. Press **Apply** to save it, or **Dismiss**. After you apply it, **Undo** puts back the rule it replaced. **Settings → Suppliers → Cover rules** lists every rule you work under, with who set it and when. Use **Change** or **Remove** on a rule there. When an order task's cover comes from a rule, the cover's description links to that rule. A planned buy picks the cover for each line in this order: 1. The cover chosen on the order task. 2. Your cover rule, then the organisation's. Within each, the most specific rule applies: SKU, then supplier, category, remit, all. 3. The routine's fixed cover. 4. The days to the routine's next run plus the supplier's lead time. 5. A 28-day default, flagged on the line. A rule in units or cases is converted to the number of days that much stock lasts at the line's forecast rate. A rule in cases is skipped for a line whose carton size is unknown, and the line says so. The organisation's max cover still caps every order. ## Activity A supplier's page opens on **Activity**: their open tasks, and how work on their products moves through your decision pipeline. You can show it by period, as a table, a flow or over time, and see how often their recommendations are followed or overridden. [Supplier activity](/suppliers/activity/) explains how to read each part. [Suppliers](/suppliers/) covers every tab on a supplier's page. ## Supplier badge shortcuts Right-click a supplier badge, or long-press it on a touch screen, to open its shortcut menu. From there you can filter the table you are currently reading to that supplier, open the supplier's page, or show and hide supplier website icons. The icon choice is a personal preference and does not change the view for other people in the workspace, like the **Display** column choice above. The same menu follows supplier badges through Triage, Pending, Products, Decisions, category and remit product lists, and supplier ranges. If a view cannot be filtered by supplier, the menu keeps the actions that still make sense there. --- ## [Tasks & routines](https://twelfth.ai/docs/settings/tasks-and-routines/) --- title: Tasks & routines description: Where to manage the rules that raise tasks and the settings around their delivery. lastmod: 2026-10-19 --- # Tasks & routines **Tasks** is one list of individual work items. Filter it by status, task type, or where a task came from, and group it by status, type or source. Tasks may come from a routine, project, chat, a person, or an integration. Type describes the work; origin describes what created it. **Routines** are the ongoing commercial checks that raise that work: each has its own purpose, schedule, scope and run history, and it keeps a record even when a run finds nothing to do. Routines has its own place in the sidebar, beside Tasks and Projects. ## Manage a routine Each routine has its own schedule and timezone, product filters or a checklist, an optional grouping rule (**one task per** supplier, category, or buyer scope), and a raise condition. Filters are by supplier, category, buyer scope or, where your sales feed splits by channel, **sales channel** (the products that sold through Kmart Marketplace or eBay in the last 13 weeks, say). A product sells through many channels, so channel narrows a routine but is never what its tasks group by. A run can raise several tasks, refresh tasks still open, or record that nothing met its condition. From the routine you can edit those rules, pause it, run it now, and inspect recent runs. ## Related settings **Settings → Tasks & routines** links to the controls that currently affect this work: - **Workspace timezone** sets the workspace time basis. Existing routines retain the timezone saved on each routine until edited. - **Notifications** controls the alerts and briefings that bring work to you. - **Decision destinations** controls where committed orders and decisions go after they are raised. ## Supplier orders and price reviews Twelfth's engine works out every day which suppliers need an order and which prices need a look. An **engine routine** brings that work into Tasks on its own schedule: one task per supplier order or price review, opening the same review grid, staged edits and sign-off as before. Twelfth sets these up for each person who holds a buyer scope: - **Reorder**: weekdays for people who order daily, weekly on Monday for everyone else. - **Price review**: weekly on Monday. When the workspace names someone to take work nobody owns (**Settings → Projects**), they get one more of each. Those cover every buyer scope that has no personal routine, and each task still goes to the scope's owner, or to that person if the scope has none. That person also gets a **Transfers** routine. A transfer is a lane between stores rather than a buyer scope, so this routine carries every lane: one task per lane, on their cadence. Change the schedule or the name in the routine's **Setup** tab. What the routine carries is fixed. Between runs, work that is already open keeps updating with the daily sync; only *new* work waits for the next run. Pause an engine routine and its work arrives with the daily sync again, so nothing goes missing. ### A routine waits for today's data A routine that checks products or carries the engine's work runs on the day's data, not on yesterday's. If the nightly data hasn't arrived by the scheduled time, the routine waits and its activity says so. It runs within a minute of the data landing, and the run says how long it waited. If the data still hasn't arrived six hours after the scheduled time, the routine runs on what there is and the run starts with **Stale: data as of** the date its data is from, so stale numbers never look fresh. **Run now** never waits, but it says when its data is stale. Every run shows the date its data is as of, which is the date of the data itself, not the time of the sync. A checklist routine reads no data, so it never waits. ### Raise the order On a supplier-order task, settle the lines, then press **Raise the order** in Pending. That raises your part of the supplier's order with the quantities on the grid. It goes into **Decisions** and out to every destination set to receive raised orders, such as your order sheet (**Settings → Integrations → Destinations**). Each buyer raises their own part, so nobody waits for anyone else's sign-off. Twelfth does not contact the supplier itself. While an engine routine carries a kind of work, its automatic projects drop out of **Projects**, Home and the New project picker, because the work is in Tasks. The projects aren't deleted, and old links to them still open. ## Head of buying An owner or admin can name one or more **heads of buying** in **Settings → Projects**. Only an owner or admin counts. If a person named there loses that role, they stop being head of buying. The head of buying gets a **Buyers** button on **Routines**. It opens one card per buyer with: - the buyer's scopes and routines, and for each routine whether it is live, in shadow or paused, how it last ran, and whether it is waiting for today's data or ran on stale data; - the buyer's open tasks, by action; - tasks that are overdue; - "Reviewed, no action" holds that end this week; - how many lines the buyer has muted. Each routine and task opens to its own page. The head of buying can act on any buyer's routine task: raise the order, record no action, mute a line, change a quantity, snooze it, mark it done, or hand it to someone else. This also works outside the head of buying's own scopes. A buyer's task always opens on all of the buyer's lines, even when the head of buying's view is set to **My remit**. Each action is recorded as the head of buying's, on behalf of the buyer. It shows on the task and in the routine's activity, so the buyer sees who did what. A buyer's routine stays theirs: the head of buying can read it but cannot change, pause or run it. Naming a head of buying does not change what any routine checks. A personal routine checks its owner's assigned scopes. An owner or admin with no scope assigned has none to fall back on, so their personal routine checks the products they pick across every scope. --- ## [Workspace security](https://twelfth.ai/docs/settings/workspace-security/) --- title: Workspace security description: Require two-factor authentication with an authenticator app for every member of your Twelfth workspace, from the Security & SSO tab of the Workspace page. lastmod: 2026-10-01 --- # Workspace security Workspace owners and admins can require every member to enrol an authenticator app for two-factor authentication (2FA). This policy applies to the active workspace and lives on the **Security & SSO** tab of the [Workspace](/settings/workspace/) page, under **Settings → Admin**. ## Require 2FA Open **Settings → Workspace → Security & SSO → Two-factor authentication** and turn on **Require two-factor authentication (2FA)**. Twelfth gives existing members a 14-day grace period to enrol. After that date, members without an authenticator app cannot use protected workspace access until they finish setup. New or existing members can enrol from **Settings → Account**. See [Security and access](/settings/security-and-access/) for setup steps and recovery code guidance. ::: callout info "Info" This setting requires an authenticator app (TOTP). If your organisation uses Google or [enterprise single sign-on](/settings/single-sign-on/), enforce login-time MFA with that identity provider as well. ::: ## Before enforcing 2FA - Tell members when the grace period ends. - Ask everyone to save recovery codes securely. - Make sure owners and admins have working authenticator apps before the deadline. - Keep a supported account-recovery process for people who lose a device. ## Turn off the requirement An owner or admin can turn the requirement off from the same page. This stops workspace enforcement, but it does not disable 2FA for members who have already chosen to use it. --- ## [Workspace](https://twelfth.ai/docs/settings/workspace/) --- title: Workspace description: "Manage your organisation in Twelfth: its name and logo, how people sign in, the two-factor and SSO policy, chat sharing, invitations, and deletion." lastmod: 2026-10-06 --- # Workspace A Twelfth workspace is an organisation and its shared data. Open **Settings → Admin → Workspace** for the things that belong to the organisation itself. Owners and admins can change these. The page has four tabs: - **General**: the workspace name and logo, a link to its members, and (for an owner) deleting it. - **Security & SSO**: the [two-factor policy](/settings/workspace-security/) it holds members to, and [single sign-on](/settings/single-sign-on/) with SCIM provisioning. - **Preferences**: defaults the whole workspace starts from, such as the chat-sharing policy. - **Operational alerts**: who is [emailed when a chat surface or integration stops working](/settings/operational-alerts/), what is watched, and what has broken lately. Switching between the workspaces you belong to, creating one, and accepting invitations are yours rather than the workspace's, and live under [My workspaces](/settings/my-workspaces/). ## Workspace identity Workspace owners and admins can update the workspace name and logo. The name is shown throughout Twelfth. The logo accepts PNG, JPEG, and WebP images up to 5 MB; Twelfth fits it within a compact image rather than cropping a wordmark. The workspace slug is shown as a stable identifier for integrations. It is read-only in Settings. ## Security & SSO Owners and admins can require every member to enrol an authenticator app for two-factor authentication. The policy, its 14-day grace period and what to do before turning it on are covered in [Workspace security](/settings/workspace-security/). Workspaces on an enterprise agreement also configure [single sign-on](/settings/single-sign-on/) here. ## Chat sharing Owners and admins choose one policy for standalone AI conversations under **Settings → Workspace → Preferences → Chat sharing**: | Policy | What chat creators can do | Where recipients find the chat | | --- | --- | --- | | Private | Keep each standalone chat visible only to its creator | Only in the creator's chat history | | Workspace link | Share an unlisted link with any active member of this workspace | From the link; it does not appear in recipients' chat history | | Specific access | Share with selected active people or remits | In recipients' chat history with a **Shared** badge | Recipients can read a shared conversation but cannot reply, rename it, edit its proposal, or change its sharing. Sharing covers the full live conversation: past and future messages, attachments, and working traces. Sharing with a remit follows its current assignments. Category and other subject links describe the conversation but do not grant access. Changing the policy is intentionally fail-closed: Twelfth makes every currently shared standalone chat private and removes its grants in the same change. Creators can then share again under the new policy. Decision chats keep their existing remit-based collaboration and are not controlled by this setting. See [Twelfth AI and chats](/assistant/#sharing-a-standalone-chat) for the person sharing a conversation. ## Delete a workspace Deleting a workspace is folded away at the bottom of **Settings → Workspace → General**, under **Leave or delete workspace**. Open it to reach the **Danger zone**. Only an owner can delete. - **Request deletion.** Owners choose **Request workspace deletion** and can add an optional reason. Twelfth's team runs the deletion: the request is sent to us and *nothing is deleted yet*. This protects a workspace with live data from being removed by a single click. - Deletion is permanent once carried out: it removes the workspace and its shared data for everyone in it. If you only want to step away from a workspace rather than remove it for the whole team, use **Leave workspace** under [My workspaces](/settings/my-workspaces/) instead. ## Related - [Workspace security](/settings/workspace-security/): the two-factor policy - [Members](/settings/members/): invitations, roles and domain access - [My workspaces](/settings/my-workspaces/): switch, create, accept an invitation, leave --- ## [Signing in](https://twelfth.ai/docs/signing-in/) --- title: Signing in description: "Sign in to Twelfth with your Microsoft work account, your Google account, a passkey, email and password, or your organisation's single sign-on." lastmod: 2026-10-19 --- # Signing in Open [twelfth.ai/login](https://twelfth.ai/login). You can sign in any of these ways, and an invited colleague can use whichever suits them: | Method | Where it is on the login page | Setup needed | | --- | --- | --- | | **Continue with Microsoft** | On the front of the login page, beside Google | None. Use any Microsoft work or school account (Microsoft 365 / Entra ID) | | **Continue with Google** | On the front of the login page | None. Use any Google account, including Google Workspace | | **Passkey** | **See other login methods** | Add one first in [Security & access](/settings/security-and-access/#passkeys) | | **Email and password** | **See other login methods** | Set when you sign up or accept an invitation | | **Single sign-on** | **See other login methods → Continue with single sign-on** | Your workspace admin connects your identity provider. Enterprise plan; see [Single sign-on & SCIM](/settings/single-sign-on/) | The method you used last time is the one the login page puts first, marked **Last used**. ## Sign in with Microsoft If your company runs on Microsoft 365, choose **Continue with Microsoft** and pick your work account. Nobody has to set anything up first: no admin step in Twelfth and no app registration in your Entra tenant. - **Work or school accounts only.** Personal Microsoft accounts (outlook.com, hotmail.com, live.com) are not accepted. - **Microsoft asks which account to use every time**, so if you have a seat in more than one organisation you never end up signed in as the wrong one. - **Your existing Twelfth account is reused** when the email matches and your organisation has verified its email domain in Microsoft Entra. That is the case for a normal company tenant. If the domain is not verified, Microsoft sign-in still works, but it creates a separate identity and asks you to confirm your email first. See [Security & access](/settings/security-and-access/#sign-in-methods) for why. - **Accepting an invitation** works the same way: open the invitation link, choose **Continue with Microsoft**, and sign in with the address the invitation was sent to. ::: callout note "Your Entra admin may need to approve Twelfth once" Some organisations block employees from signing in to new apps until an administrator approves them. If Microsoft shows *Need admin approval*, ask your IT team to grant consent for **twelfth sign-in**. It asks only for your basic profile: name, email address and photo. ::: ## Sign in with Microsoft vs single sign-on They both use your Microsoft account, but they are different things: - **Continue with Microsoft** is for each person. It works for anyone with a work account, on every plan, with no setup. - **[Single sign-on with Microsoft Entra ID](/settings/single-sign-on/microsoft-entra/)** is for the whole workspace. An Entra administrator registers Twelfth as an enterprise app, so everyone on your email domain is sent to Entra, your conditional-access and MFA policies apply, and SCIM can add and remove people automatically. It is part of the Enterprise plan. Start with **Continue with Microsoft**. Move to single sign-on when you want your directory to control who has access. ## See and manage your sign-in methods **Settings → Account → Sign-in methods** lists the providers attached to your account. A provider is added the first time you use it to sign in. See [Security & access](/settings/security-and-access/). --- ## [Supplier activity](https://twelfth.ai/docs/suppliers/activity/) --- title: Supplier activity description: "How to read a supplier's Activity tab: its open tasks, the decision pipeline by period, the Table, Flow and Over time views, and decisions on its lines." lastmod: 2026-10-19 --- # Supplier activity The **Activity** tab on a supplier's page answers two questions: what is waiting on this supplier now, and how has work on their lines gone lately. It is the tab a supplier's page opens on. Top to bottom it shows: 1. **Trading cards**: sales, GP%, sellable units, days' cover and the open-task count, over the **Trading period** chosen in the page header (1w, 1m, 6m or 12m). 2. The **decision pipeline**, with **decisions on their lines** under it. 3. **Open tasks**. 4. A **consolidated order**, only when you are reading the whole business and the supplier spans more than one remit. Everything here is **scoped to your remit**. A task counts for a supplier when at least one of its lines is a product that supplier provides, in a remit you can see. Several buyers often share a supplier, so two people can see different counts on the same page. An owner or admin sees every remit. See [Suppliers](/suppliers/) for how remit scoping works across the supplier pages. ## Open tasks **Open tasks** lists every task on this supplier's lines that has not been decided or dismissed. Each one is a single row: - the **task type** icon: a cart for a purchase order, a tag for a price change, arrows for a transfer; - the **title**, then a short summary such as "4 lines · warehouse purchase recommendations"; - on the right, how many of this supplier's **products** the task touches, and when it was last **updated** (or checked); - an arrow that opens the task. On a supplier's own page their name adds nothing, so a task whose title is just the supplier's name (common for purchase orders, which are raised per supplier) is shown by its kind instead, as **Purchase order**. Hover a row to see its exact created, updated and checked times in Melbourne time. **History** in the section header opens the tasks that are already settled: decided, dismissed, or superseded by a newer recommendation. **Documents** goes to your artefacts library. The list shows the 50 most recently updated tasks. When there are more, it says so. ## Decision pipeline The pipeline counts the tasks raised on this supplier's lines and where each one ended up. Two controls sit in its header. ### Period: 30d, 60d, 90d, All The period picker narrows every view in the section at once: the facts, the table, the flow and Over time. A task belongs to a period by the **date it was raised**. **All** includes everything, including tasks raised more than 90 days ago. The period is kept in the page address (`?period=30d`), so a link you share opens on the same period. ### The facts strip Four numbers lead the section, for the chosen period: | Fact | What it means | | --- | --- | | **Raised** | How many tasks were raised on this supplier's lines. | | **Decided** | How many of those have been decided, and that as a share of everything raised. Dismissed tasks are not counted as decided; hover to see the split. "None yet" means some were raised and none are settled. | | **Median time to decide** | The middle time from a task being raised to being decided, over the tasks raised in the period that have been decided. "<1 day" means it was decided on the day it was raised. | | **Oldest open** | How long the longest-waiting open task has been open. Select it to open that task. | A dash means there is nothing to measure yet, not zero. ### Table The table is the pipeline in numbers. Each row is a window by the date a task was raised: **Last 30d**, **Last 60d** (31 to 60 days ago), **Last 90d** (61 to 90 days ago), and **>90d**. The windows do not overlap, so the rows add up to the total. - **Items** is how many tasks were raised in that window. - **POs**, **Price** and **Transfer** split those tasks by type. - **Open**, **Dismissed** and **Decided** split them by where they stand **now**. A task raised 50 days ago and decided yesterday counts as Decided in the Last 60d row. The small arrows compare a window with the one before it: an up arrow on Last 30d means more was raised in the last 30 days than in the 30 before. The >90d row has no arrow, because it is not a window of the same length. ### Flow The flow shows the same counts as the table, drawn as a flow from the **type** of work raised (left) to its **outcome** (right). The width of each band is the number of tasks. Use it to see at a glance whether, say, price changes on this supplier mostly get decided while purchase orders sit open. Hover a block for what it means. Flow and table always agree, because they are read from the same counts. ### Over time Over time puts each task on a date axis, so you can see *when* work was raised and how long it waited. When there are 15 tasks or fewer in the period, each task gets its own row: - on the left, the task-type icon, its title and its size ("Purchase order · 4 lines"); - in the middle, its life on the axis: a **dot** where it was raised, and a line to where it ended; - on the right, where it stands, in words: **Open 5 days**, **Decided same day**, **Decided after 3 days**, **Dismissed after 12 days**. Open tasks come first, oldest at the top, then settled tasks, most recent first. Select any row to open the task. The line tells you how it ended: | Mark | Meaning | | --- | --- | | Dot in the task type's colour | Raised. Purchase orders are pink, price changes blue. | | Dashed line running to **Today** | Still open. | | Solid line ending in a filled square | Decided. | | Solid line ending in a hollow ring | Dismissed. | | Solid line ending in a grey ring | Superseded by a newer recommendation. | A dot and a square side by side means the task was raised and decided on the same day. With more than 15 tasks, rows would not fit, so the view folds them into **one lane per type** (Buy, Price, Transfer, Exit) with the same marks and a legend underneath. Hover a mark for its title and dates. The facts, table, flow and Over time use the same rules for which tasks count, independently of the 50-task Open tasks and History limits. Raised and Decided count tasks raised in the selected period. Over time also includes older tasks that remained open during that period, so it can show more rows than Raised. An open task counts only while it still has a line to act on, as it does in Open tasks. Over time shows up to the 2,000 most recently raised tasks and says when that limit is reached. Raised and Decided remain complete. Median time to decide and Oldest open show a dash when the task dates are incomplete. ## Decisions on their lines Under the pipeline, **Decisions on their lines** counts the individual lines that have been decided on this supplier's tasks, over all time: - **followed the recommendation**: the line was decided at the recommended quantity or price; - **went against it**: the buyer changed the quantity (on a purchase order or transfer) or the price (on a price change) before deciding. When lines went against the recommendation, the reasons recorded for doing so are listed with how often each was given. A supplier whose recommendations keep being overridden for the same reason is usually a supplier whose settings need correcting, for example a lead time or a minimum order. See [Suppliers](/suppliers/) for those settings. This section counts lines, not tasks. One purchase order with 12 lines can add 12 here. ## Consolidated order Several buyers can each have purchase-order lines for the same supplier. When you read the whole business (the **All** view) and the supplier's buying spans more than one remit, the **Consolidated order** card shows it as one order to that supplier: how many buyers and remits it covers, each remit's part and who owns it, and how many have signed off out of how many, by value. Each buyer signs off their own lines. How the whole order completes is a workspace setting, shown on the card and changed in [Settings → Projects](/settings/projects/): - **Every buyer signs off**: the order completes by itself when the last buyer signs off. - **An owner may raise it early**: an owner can **Sign off the whole order** before every buyer has, and the card records that it was an override. A signed-off order that gains new lines reopens, and can be signed off again. Tasks that were dismissed or superseded are left out of the roll-up, and the card says how many. ## Asking Twelfth AI Twelfth AI can read the same supplier figures. Useful questions on this tab: - "What is waiting on All Interactive Distribution, oldest first?" - "How long do our purchase orders for this supplier usually sit before we decide them?" - "Why do we keep overriding this supplier's recommendations?" If a number in an answer does not match this page, check the period picker and the Me / All view in the app header first: both change what is counted. --- ## [Supplier facts](https://twelfth.ai/docs/suppliers/facts/) --- title: Supplier facts description: "A supplier's Facts tab: contacts, payment terms, lead time, minimum order, currency, how to order, and the reliability Twelfth measures." lastmod: 2026-10-19 --- # Supplier facts The **Facts** tab holds what is true about the relationship with a supplier. Buyers keep most of it; a few figures are measured by Twelfth and cannot be typed over. Whatever you change here is saved as you go and applies to everyone in the workspace. If a save fails, the page says so beside the tabs and keeps your edit, with **Try again**. ## Supplier facts The supplier's name and the categories their products fall into in your range ("None recorded" when there are none). These come from your data and are read-only. ## Identity & contacts - **Also known as**: other names the supplier goes by in invoices, emails or your source system. - **Rep name**, **Rep email**, **Rep phone**. ## Ordering & working preferences - **Payment terms** - **Order schedule**: which days they take orders, or how often you order. - **Order cut-off**: include the time zone. - **Ad-hoc reorders**: whether they accept orders between the regular schedule. - **How they work** - **Availability & allocation**: how stock is allocated when it is short. Select the pencil beside a fact to edit it, then **Save**. A fact nobody has entered reads "Not recorded". An entered fact shows that a buyer entered it, and when ("Buyer-entered · 14 Oct 2026"). ## How to order A summary of how your team places orders with this supplier: the **methods** (portal, email, spreadsheet and so on), the **buyer** responsible, any **instructions**, and the **portal** link. If an ordering sheet was imported, it says so. This is read-only here. **Manage in Settings** opens **Settings → Ordering** on the supplier's page, where it is set up. See [Ordering and supplier portals](/suppliers/ordering/). ## Currency & conversion **Supplier quote currency** sets the currency this supplier quotes in, for new quotes that do not state one. It defaults to your workspace currency. The reference exchange rate is shown beside it. **Preview a mixed-currency cost** works out a landed cost from components in different currencies, such as goods in USD and freight in AUD. It can use an agreed rate in place of the reference rate. The preview is not saved and does not change any order. [Supplier settings](/settings/suppliers/) explains the preview in full. ## Buying terms & response These are the figures buying checks use. Each saves as soon as you change it. - **Lead time (days)**: how long the supplier takes from order to delivery. When Twelfth has a reliable figure from your receipts, a **Use N days** button offers it; nothing is filled in until you choose it. See [Lead times: never a default](/settings/suppliers/#lead-times-never-a-default) for how Twelfth picks the lead time in force. - **Minimum order quantity (units)**. - **Minimum order value**, in your workspace currency. An order under it is flagged, never stopped. - **Expected email response time (hours)**: how long the supplier usually takes to reply. When you show Twelfth AI a message in which a supplier states their lead time ("we're running 8 weeks on all orders"), it offers a link to this tab with the figure. A banner then quotes the supplier's words: **Set N days** saves the lead time and keeps the quote as a note on the [Timeline](/suppliers/timeline/), so the next buyer can see why it is what it is. **Not now** leaves the current value. Nothing changes until you press Set. ## Measured reliability What Twelfth measures from your own receipts and orders, read-only: - **Declared lead time**: the lead time your source system carries for this supplier. - **Lead time from receipts**: the median days from a purchase order being raised to its stock arriving. - **Lateness** and **Fulfilment rate**. Each needs at least 20 deliveries or lines before it is shown, so one late delivery cannot define a supplier. Below that, the figure says it is not measured yet and why. **Observed email response time** is not measured yet. --- ## [Suppliers](https://twelfth.ai/docs/suppliers/) --- title: Suppliers description: "The supplier portfolio and a supplier's page: what each tab is for, where to find a supplier's tasks, notes, terms, range and ordering details." lastmod: 2026-10-19 --- # Suppliers **Suppliers** in the app rail is the supplier portfolio: every supplier your products name, with how each is trading. Select one to open their page. For the list itself (its columns, the trading period and the **Display** choice), and for lead times, cover rules, and hiding or archiving a supplier, see [Supplier settings](/settings/suppliers/). ## You see your own lines Supplier figures are **scoped to your remit**. Several buyers often share a supplier, each owning different categories, so the sales, tasks and SKU counts you see cover *your* lines under that supplier. An owner or admin who reads the whole business sees the whole relationship. The **Me / All** view in the app header says which you are reading. The same rule applies to every tab below: two buyers can open the same supplier and see different numbers, and both are right. ## A supplier's page The header shows the supplier's name (with their website icon, if you have icons switched on) and the **Trading period**: **1w**, **1m**, **6m** or **12m**. The period drives the trading cards on Activity. Owners and admins also get a **⋯** menu with **Hide supplier…** and **Archive supplier…**. See [Hiding or archiving a supplier](/settings/suppliers/#hiding-or-archiving-a-supplier). The page has up to six tabs: | Tab | What it is for | Read more | | --- | --- | --- | | **Activity** | What is waiting on this supplier now and how work on their lines has gone: trading cards, the decision pipeline, open tasks. The page opens here. | [Supplier activity](/suppliers/activity/) | | **Timeline** | What your team knows and decided: notes, linked chats and past decisions, newest first. | [Supplier timeline](/suppliers/timeline/) | | **Facts** | What is true about the relationship: contacts, terms, lead time, minimum order, currency, how to order, and measured reliability. | [Supplier facts](/suppliers/facts/) | | **Range** | Every product this supplier provides in your remits. | [Range and invoices](/suppliers/range/) | | **Invoices** | Deliveries invoiced above the order price. Only appears when there are some. | [Range and invoices](/suppliers/range/#invoices) | | **Settings** | The supplier's website, and how your team orders from them, including a supplier portal connection. | [Ordering and supplier portals](/suppliers/ordering/) | Each tab has its own address (`?tab=facts`, `?tab=range` and so on), so a link opens the tab you meant. Older links to `?tab=notes`, `?tab=decisions` and `?tab=profile` still work: notes and decisions open Timeline, and profile opens Facts. ## Where to find things - **"What do I need to do for this supplier?"** Activity → Open tasks. - **"How long do we take to act on their recommendations?"** Activity → the decision pipeline's **Median time to decide**, or the **Over time** view. - **"Why did we change that order last month?"** Timeline, filtered to **Decisions**. - **"Who's our rep, and what are their payment terms?"** Facts. - **"What's their lead time and minimum order?"** Facts → Buying terms & response. - **"Do they carry this product?"** Range, and search for it. - **"How do we place an order with them?"** Facts → How to order, which is set up in Settings → Ordering. ## Asking Twelfth AI Twelfth AI reads the same supplier record. You can ask it about a supplier by name: "What's open for Bandai Namco?", "What did we note about All Interactive's cut-off?", "Which of our suppliers have no lead time set?". It sees the same remits you do. --- ## [Ordering and supplier portals](https://twelfth.ai/docs/suppliers/ordering/) --- title: Ordering and supplier portals description: "Set how your team orders from a supplier, and how a supplier portal connection works: what it reads, what it can never do, and what you see." lastmod: 2026-10-19 --- # Ordering and supplier portals A supplier's **Settings** tab has two sections, **General** and **Ordering**. On a narrow screen they are a drop-down at the top. **General** holds the supplier's **website**. Twelfth looks it up for you; if it found the wrong one, **Change** it, or use **Wrong website?** to look again. Your choice overrides the lookup for the whole workspace. The website gives the supplier its icon across the app. **Ordering** records how your team places orders with this supplier. What you save here is what **How to order** on the [Facts](/suppliers/facts/) tab shows. ## Setting how to order - **Ordering methods**: any of **Portal**, **Email**, **Spreadsheet**, **Purchase Order**, **Allocations** and **One Drop - No Reorder**. - **Buyer**: the person in your workspace who orders from this supplier. - **Portal URL**: only asked for when Portal is one of the methods. It must start with `https://`. - **Ordering instructions** (optional): anything the next person needs, such as "email the order to the rep and copy the warehouse". **Save ordering details** saves them. Once saved, the section folds to a single line with **Edit**. ## Supplier portal connection Where your workspace has it, choosing **Portal** as a method adds a supplier portal connection. Twelfth signs in to the supplier's B2B website on your behalf to check that the sign-in works, read their catalogue, and prepare a cart for you to review. The connection is **set up and managed by Twelfth** with you. What you see is its status: - **Connected**, **Checking**, **Needs attention** or **Being set up**; - when it was last checked; - the products Twelfth has read from the portal. ### What it can never do Ordering through a portal connection is **always disabled**. The connection can read the portal and add lines to the supplier's cart for you to review. It cannot check out, submit an order or place one, and a successful sign-in never changes that. You place the order yourself, on the supplier's website. Further rules keep a cart change safe: - Twelfth changes a cart only after it has **read that cart successfully**, for the same account, within the last 30 minutes. - It only **adds** missing quantities. It never lowers a quantity, removes a line, or checks out. - A cart build stops after 5 minutes and is never retried by itself. If one is cancelled part-way, some lines may already be in the supplier's cart; review the cart on their site. Portal passwords are **encrypted and write-only**: once saved, they cannot be shown again on the page, only replaced or removed. Removing a saved connection does not undo anything already added to a supplier's cart. ### When a supplier limits access Some supplier sites rate-limit or challenge automated sign-ins. When that happens the connection shows **Needs attention** with the reason, and new checks pause for 15 minutes before trying again. Drafts and products already captured stay available while it is paused. If it keeps happening, the supplier may need to allow Twelfth's access on their side. ### The steps behind the connection For the Twelfth team member setting a connection up, the page shows the full workflow: 1. **Connection details**: the portal URL, username or customer code, and password. **Save and test connection** checks the sign-in. 2. **Sign-in verified**: when the last check passed. A test sign-in leaves only a temporary copy that expires within 15 minutes. 3. **Products and buying draft**: - **Find products**: capture a product page from the portal (read-only, no cart changes), check the product, variant and pack, then save it to a draft. - **Draft**: up to 20 lines, saved in Twelfth. Editing the draft does not touch the supplier's cart. **Build supplier cart** adds the draft to the cart, under the rules above. - **Cart review**: **Read supplier cart** reads the cart back and compares it with the draft line by line, with a screenshot to review. **Connection activity** lists the 10 most recent checks, who ran each, and each step with a screenshot. Screenshots are masked and kept for 30 days; after that the step is kept without its screenshot. --- ## [Supplier range and invoices](https://twelfth.ai/docs/suppliers/range/) --- title: Supplier range and invoices description: "A supplier's Range tab lists every product they provide in your remits; the Invoices tab shows deliveries invoiced above the order price." lastmod: 2026-10-19 --- # Supplier range and invoices ## Range The **Range** tab lists every product your data says this supplier provides, in the remits you can see. The tab's label carries the count, for example **Range (332)**. Each row shows the product, its **category**, its **remit**, and how many **open items** name it. Select a category or remit on a row to filter the list to it; select it again to clear. - **Search** matches brand, product name, SKU, or your source system's product id. - **Filter** narrows by **Category** and, when the supplier spans more than one remit, by **Remit**, with a count beside each. - The count above the list says how many of the range are showing: "Showing 40 of 332". The SKU has its own copy button. Select a row to open it: the full product name is shown (long names are cut short until then), with a copy button for the name, and any open work on that product is listed underneath. Only one row is open at a time. The list loads more as you scroll. A product appears here as soon as your source system names this supplier on it. If the list is empty, no product in your remits names this supplier yet. ## Invoices The **Invoices** tab appears only when there is something to show. Its label carries the count, for example **Invoices (3)**. It lists **deliveries invoiced above the order**: lines where the supplier invoiced a higher unit price than the purchase order said. Lines whose purchase order had no cost, and lines invoiced *below* the order price, are left out. Invoice and purchase-order references link to the record in your source system when your workspace has those links set up. **Copy** puts the table on the clipboard; **Download CSV** saves it as a file. --- ## [Supplier timeline](https://twelfth.ai/docs/suppliers/timeline/) --- title: Supplier timeline description: "A supplier's Timeline tab: notes your team adds, chats linked to the supplier, and past decisions with their reasons, newest first." lastmod: 2026-10-19 --- # Supplier timeline The **Timeline** tab is your team's memory of a supplier: what someone learned, what was asked of Twelfth AI, and what was decided and why. Everything sits in one list, newest first and grouped by day. It holds three kinds of entry: - **Notes** that anyone on the team adds. - **Chats** with Twelfth AI that are linked to this supplier. - **Decisions** on this supplier's lines, with the reason written at the time. Decisions appear when your workspace has decision history switched on. The tab's label shows how many entries there are, for example **Timeline (4)**. ## Adding a note Select **Add note** and write what you just learned: a new cut-off time, a rep who has changed, a minimum that the supplier now enforces. You can: - add **tags** such as `moq`, `closure` or `contact`. Tags you have used on this supplier before, and suggested ones, are offered as you type; - **attach files** up to 10 MB each. Attachments also appear in [Artefacts](/artefacts/). A note is added at the current time, at the top of the timeline. Notes cannot be backdated, edited or deleted: the timeline only grows, so it stays a record of what was known when. If something changes, add a new note. ## Finding something - **Search** looks through notes, decisions and chats. - The **All / Notes / Decisions / Chats** filter narrows the list to one kind, with a count on each. - Select a **tag** on any note to show only entries with that tag. - **Decisions** has its own period, the last 12 months by default. These filters reset when you leave the page. ## Reading an entry Select an entry to open it. Only one is open at a time. - A **note** shows its full text, tags, attachments and reactions. - A **decision** shows when it was made, in which remit, the rationale as written (or "No reason was written."), how many lines went against the recommendation, and what happened next. **Open decision** goes to the full decision. - A **chat** has **Open chat** to go back to the conversation. When a supplier has a long decision history, the timeline shows the most recent decisions and links to [Decisions](/decisions/) for the rest. The timeline records what was decided and why. It does not say whether a decision worked out; the [Activity](/suppliers/activity/) tab's pipeline and **Decisions on their lines** are where you read how decisions on a supplier tend to go. ## Asking Twelfth AI Twelfth AI reads the same timeline. Ask "what have we noted about Banter's ordering cut-off?" or "why did we override the last Nintendo order?", and it answers from the notes and decision reasons recorded here. --- ## [Sales and performance targets](https://twelfth.ai/docs/targets/) --- title: Sales and performance targets description: Manage company, category, remit and buyer targets with workbook uploads, linked Google Sheets or Excel tabs, and monthly starter templates. lastmod: 2026-10-14 --- # Sales and performance targets Open **Performance → Targets → Add target plan**. Give the plan a name, choose its scope, year and metrics, and declare its currency, sales tax basis and purpose: an agreed budget or a working target. Targets are monthly. Company, category, remit and buyer plans stay separate, so overlapping budgets are never added together. A buyer plan covers that person's assigned remits. A remit or buyer plan can be narrowed to one category. Scope membership is recorded with each revision; a reassignment or range change shows **Scope changed** until new targets are reviewed. Administrators prepare, link and activate plans. Other people can read activated plans only when they have access to the entire recorded scope. ## Upload a workbook In **Input & sync**, choose **Upload a file**. XLSX and CSV files can be up to 5 MB. Choose the workbook tab and map its scope, month and metric columns. For sales-only plans, months may be spread across columns. Match scope labels, category aliases or buyer emails, or use stable scope IDs from the template. Ambiguous matches and duplicate scope/month/metric values must be corrected. Choose **Build review**, inspect the proposed changes, then **Activate revision**. Nothing changes the active targets until activation. A replacement is the whole plan: omitted values are shown as removals. **History** retains previous revisions. Agreed category sales plans also feed the monthly category sales charts and Performance target-risk reads. Earlier category workbooks remain available through **Upload targets**; an activated plan takes precedence for the values it has published, and withdrawing a value does not revive an older upload. ## Start with a template Choose **Download Excel** or **Download CSV** for twelve monthly rows per selected scope. The first columns are the scope's readable name, its stable ID and month; the remaining columns are the selected metrics. Leave unused targets blank. Numeric zero is an explicit zero target. Write margin percentages as `35` or `35%` for a 35% target. Scope IDs should stay unchanged when entering figures. Upload the completed file, or save it as a Google Sheet or Excel workbook and connect it. To prepare a live tab directly, choose **Create linked template**, select a customer-owned workbook and choose **Create template & link**. Twelfth adds a new tab and keeps existing tabs intact. A blank template says **Awaiting figures**; enter targets, then sync and review them. Creating an entirely new workbook uses the download/save/connect path. ## Keep a spreadsheet in sync **Connect sheet** supports Google Sheets and Excel workbooks in OneDrive or SharePoint. Choose a workbook or paste its link, select its target tab, read the columns and confirm their mapping. Google Sheets must be shared with the reader address shown in the picker; template creation needs Editor access. See [Google sharing and access](/settings/integrations/google-files/sharing/) for workspace ownership and file-sharing requirements. Excel uses the workspace's connected Microsoft 365 account. Template creation needs its separate files-write permission. An owner or admin can request it through the Excel calendar worksheet setup. See [Microsoft permissions and settings](/settings/integrations/microsoft-365/settings/), or create the worksheet yourself and connect it read-only. Linked tabs are read hourly, or immediately with **Sync now**. New figures stage a revision under **Review changes**. Active targets remain in place until an administrator activates that revision. Unchanged snapshots create no new version. Formula errors and unavailable sources show a source error and preserve the last activated targets. Tab renaming is safe; deletion of the linked tab requires detaching and reconnecting the intended source. Use **Change column mapping** when the layout changes. **Pause sync** holds the current targets; **Detach source** keeps them and permits file replacements. **Archive plan** stops sync and removes the plan from the default list while preserving history. Restoring a plan checks for conflicting active budgets. ## Read targets against actuals **Targets & actuals** shows each month and metric against the current activated revision. Sales and GP comparisons require compatible currency and tax basis. GP and margin from canonical sales use current catalogue costs; warehouse GP without declared cost provenance is marked **Basis not comparable**. Margin gaps are percentage points, and margin percentages are never summed. Future months say **Not started**. Current months are labelled **Month in progress**; incomplete actuals have **Partial coverage** and no overall gap. Company/remit comparisons also check for trading outside managed categories. Missing data stays unavailable rather than becoming zero. Historical revisions show the values recorded then; the ordinary comparison uses the current plan. Right-click a plan's name to copy a link to that plan. The link keeps the workspace and still respects the recipient's remit access. --- ## [Tasks](https://twelfth.ai/docs/tasks/) --- title: Tasks description: "The Tasks list and the task page: where tasks come from, sorting and filtering the table, working a task's lines, and how a task closes." lastmod: 2026-10-19 --- # Tasks A **task** is one piece of work with a person on it: a supplier order to raise, a price review, a transfer, a promotion deal to decide, a list of products to look at, or something you wrote down yourself. Many tasks carry **lines**, one per product, and the task is finished when those lines are dealt with. Open **Tasks** from the left rail. It opens on a table of your open tasks. Click a task to open its page. You see the tasks assigned to you. If you can see the whole business, you also see every task in the remits you are viewing. A task with no remit is only ever its assignee's. Dates and times on Tasks are Melbourne time. ## Where tasks come from The **From** column says what created each task. When a task came from a routine, a project or a conversation, it names that routine, project or conversation and links to it. | From | What raised it | | --- | --- | | **Routines** | A routine's run found something that met its condition. The task names the routine and wears its colour. | | **Projects** | A project needs a decision, such as a supplier order or a price review inside a project. | | **Chat** | A conversation with Twelfth. The task links back to the conversation. | | **Manual** | You created it with **New task**. | | **twelfth** | Twelfth raised it from your data, outside any routine or project. | | **Added** | A task added to the workspace in some other way. | The empty list says the same thing: "A task appears when a routine finds something, a project needs a decision, or you add one." ## Task types A task's **type** describes the work. Its source (above) describes what created it. A routine can raise a task of any type, depending on what its check decides. | Type | What the work is | | --- | --- | | **General** | Anything else, including tasks you write yourself. | | **Review** | Products to look at. Nothing is ordered. | | **Buying** | A supplier order: quantities to set and an order to raise. | | **Pricing** | A price review. | | **Transfer** | Stock to move between stores. | | **Promotion** | A confirmed promotion deal, decided line by line. | ## The tasks table Each row is one task. The title is always shown. Under it you see the task's details, if it has any. | Column | What it shows | | --- | --- | | **Type** | The task type as a pill. Click it to show only that type, and click again to clear the filter. | | **From** | The routine, project or conversation it came from, linked. Otherwise the source. | | **Assignee** | The person it is on. | | **Due** | The due date. An open task past its date reads **overdue** in red, and one due today reads **today**. A snoozed task shows the day it comes back, marked **snoozed**. | | **Lines** | How many lines it carries. | | **Flagged** | How many of its lines a check flagged. | | **Status** | **Open**, or how it closed (see [Statuses](#statuses-and-how-a-task-closes)). | | **Created** | The day it was created. | By default the table shows **Type**, **From**, **Due**, **Lines**, **Flagged** and **Status**. If you can see the whole business, **Assignee** is shown too. ### Sorting Click a column heading to sort by it, and click again to reverse the order. Right-click a heading for **Sort ascending**, **Sort descending**, **Hide column** and **Reset columns**. The table starts sorted by **Due**, soonest first. A task with no due date always sorts after the dated ones, whichever way you sort. Sorting by **Status** puts open work first. Tasks that tie are ordered by title. ### Searching and filtering **Search tasks…** matches a task's title, its routine or project name, and its details. A search lasts for this visit only. The **Filter** button holds these choices. The number beside each one is how many open tasks it would show. | Group | Choices | | --- | --- | | **Status** | **Open** (the default), **Done**, **All tasks** | | **Attention** | **Flagged**: only tasks with at least one flagged line | | **Task type** | One type | | **From** | One source | | **Routine** | One routine's tasks | You can pick one choice from each group. The filters you have set show as chips above the table. Click a chip to remove it, or click **Clear all**. A routine's page links to its tasks with **All tasks**. From a run on the routine's timeline, the list narrows to the tasks that run raised or refreshed, and a chip reads **Run of** and the run's date. ### Grouping and columns **View** holds two settings: - **Grouping**: **No grouping**, **Status**, **Type** or **From**. Each group gets its own heading and count. - **Columns**: turn any column on or off. **Reset** puts back the defaults. Right-clicking a type pill or a **From** badge also offers **Group by type** or **Group by source**, as well as a filter to that type or source. ### Acting on a row Right-click a row for the actions its page offers, without opening it: - **Open task**, and **Open routine**, **Open project** or **Open conversation** when the task came from one. - On an open task: **Mark done**, **Snooze until tomorrow**, **Snooze until next week** and **Cancel task**. - On a closed task: **Reopen**. - **Open in new tab** and **Copy link**. Cmd-click or Ctrl-click a row to open the task in a new tab. ### A view you can share Filters, sorting, grouping and columns all live in the page's address. Copy it and whoever opens it sees the same view, so long as they can see the same tasks. Search is not saved there. When you open a task, the address keeps the view. The panel beside the task shows the same list you were looking at, and the way back returns to the same table. ## The task page The heading says the task's title. If the task is about a supplier, the heading shows the supplier's name instead, linked to the supplier's page. Under it you see: - **Raised by** and the routine, with the time of the run that raised it (for example, "Wed, 14 Oct, 15:46 AEDT"). The time links to that run on the routine's page. - **In** and the project, when the task sits in one. - How many lines it has, how many are flagged, and **data as of**: the business date the figures describe. If a link points to a task you can't see, or one that is gone, the page says "This task isn't available." It also links to Projects, because older links like this one may point to work that is now held there. ### Lines Each line is a product, with its code and the figures behind it. A routine can choose the columns it shows. Otherwise you see the figures the line carries, such as **SOH**, **Wks cover**, **Units L4W**, **Rate of sale vs year**, **Suggested qty** and **Proposed price**. A **flagged** line is one a check found worth your attention. Its **Signal** column says why, for example a stock-out risk, a suggested quantity or a price move. A line raised by a rule of yours also says **What it met:** and lists the conditions it met. Lines that need you come first: lines to recheck, flagged lines, and lines you have already acted on. The page shows 200 lines at a time, and **Show … more** loads the next batch. ### Lines across runs A routine keeps one task open across its runs and refreshes it, so you don't get a new task every time. The task says **Open since**, when it was **Updated**, and how many runs have touched it. It also says what changed since you last looked, for example "2 added · 3 updated · 1 dropped". Each line can carry a badge: | Badge | Meaning | | --- | --- | | **New** | First seen on the latest run. | | **Updated** | Its figures changed since you last viewed the task. | | **Changed since review** | The suggestion moved after you set your quantity. Choose **Use latest** or **Keep mine**. | | **Needs recheck** | The line no longer qualifies but carries your draft. Choose **Keep in review** or **Discard**. | | **Dropped** | The line has left the task. Dropped lines are hidden until you press **Show dropped**. | | **Muted** | You or someone else muted it on the routine (see [Muting a line](#muting-a-line)). | If nothing in a task is in scope any more, the routine closes it. The task then reads **No longer required**, and its lines stay on it as history. ### Order quantities On a buying task, each line has an **Order qty** field. The suggested quantity appears in the field until you type your own. Clear the field to drop your figure. A decimal is rounded down to a whole unit. ### Cover A planned buy's order task shows **Cover** in days: how far ahead its lines are sized. Next to it the task says where that figure came from, such as a cover rule, the routine's fixed cover, or the days to the next run plus the lead time. On an open task it also shows the order so far, against the supplier's minimum order value. Change the number of days, from 1 to 91, and every line is sized again. A quantity you typed on a line stays yours. Once you have changed it: - **Use the run's** figure puts the routine's cover back. - **Use … days for** the supplier **on future runs** saves your figure as that supplier's cover rule. When the supplier's delivery history is known, the task shows how its deliveries actually land against the lead time in this cover. It may also offer **Cover slow deliveries**, which sizes the order on the lead time that 9 in 10 deliveries arrived within. If a line's supplier has no lead time set, the line is sized on a 28-day default and the task links to the supplier's page, where you can set one. See [Suppliers](/suppliers/) and [Supplier settings](/settings/suppliers/). ### Raising an order **Raise the order** shows how many lines go out. Before anything is sent, it asks you to confirm and lists the order by supplier: lines, units and value, and whether the supplier's minimum is reached. An order under a supplier's minimum still goes out, because the minimum is never a reason to hold a line back. Raising sends the order into **Decisions** and out to every destination set to receive raised orders. **Twelfth does not contact the supplier itself**, and the order can't be changed after it is raised. The task then reads **Order raised** with the date, lines, units and value, and offers **Download the order** as a CSV file. If another task has already ordered one of the same products, the raise is refused and names that order, with **Open it** beside it. To send yours as well, say why in **Why does this order go out anyway?** and press **Raise anyway**. Your reason is kept on the decision. If no line has a quantity yet, the button says "Nothing to order yet: type a quantity on a line, or change the cover." ### Reviewed, no action **Reviewed, no action** closes a task when there is nothing to do, and asks you why: | Reason | The day it asks for | Starts at | | --- | --- | --- | | **Stock is arriving** | **Arriving by** | 14 days out | | **Covered by my next planned buy** | **Next buy on** | 28 days out | | **Not reordering** | **Look again on** | 90 days out | | **Counted it: the figure is right** | **Look again on** | 28 days out | | **Something else** | **Look again on** (optional) | holds 14 days | **Counted it: the figure is right** is offered only on a task raised by a store count check. You can move the day anywhere from today to a year out, and add an optional **Note**. Until that day, the routine won't raise the same finding on the same evidence again. A real change in the figures brings it back sooner. The closed task says the hold back to you, for example "Held until Fri 10 Oct — you said stock was arriving." When a routine raises the work again after the hold ends, the new task shows **Back after your hold ended** with what you said last time. ### Muting a line **Mute** on a line, or **Mute a line** above a review grid, stops the routine that raised the task from flagging that product under its check. On a planned buy, a mute also keeps the product off the routine's order tasks and removes it from this order now. If you had typed a quantity on the line, the dialog warns you that it will be removed. Choose how long the mute lasts under **For how long**: **1 week**, **1 month** (the default), **Until a date** or **Until I unmute it**. A note is optional but recommended, because whoever sees the mute next reads it. The product comes back when the mute ends, or sooner if someone unmutes it on the routine's page. You can mute a line only if you are allowed to change the routine. A head of buying can also mute lines on a buyer's task. ### Review tasks A **Review** task asks you to look at some products, not to buy them. Each line says what its check found under **What sold, and the cover at that pace**, and **Details** opens the figures behind it. There is nothing to type. Close a review task with **Mark done** once you have looked. Some tasks only mark lines and order nothing. These close with **Reviewed**, which holds nothing, so a line that is flagged again is raised again. ### Promotion tasks A **Promotion** task is a confirmed deal, decided line by line. For each line, set **In or Out** and the **Promo price**. Next to each line you see the deal's terms and checks: **Special buy price**, **Funding**, **Margin after funding**, **Expected in window**, **Cover for the window**, **Recent price** and **Other promotions**. A failed check shows as a chip under the product's name, for example a margin under the workspace's floor, **Out before it starts** or **Also on another promotion**. **Settle decisions** closes it. The button counts the lines In and Out, and it is disabled until every line is In or Out and every In line has a price. Settling records the decisions and can't be undone. Afterwards, **Download for Rex** gives you the export. A promotion task can't be cancelled, raised as an order or marked done. ### Supplier orders, price reviews and transfers A supplier order, price review or transfer that Twelfth's engine opens comes into Tasks as its own task. It opens the same review grid, staged edits and sign-off as the project stage, with **Triage** and **Pending**, so the work is the same whichever way you open it. **Task details** says which routine raised it and which project it sits in. See [Projects](/projects/) and [Tasks and routines settings](/settings/tasks-and-routines/). ## Assignee and handing a task on The assignee chip shows who a task is on. If you can move the task, click the chip to choose someone under **Hand task to**. You can move a task if it is yours, or if you can see the whole business and the task belongs to a remit. For a task in a remit, only people who can see that remit are listed. A personal task belongs to its assignee alone, so handing it on removes it from your list. Anyone else sees the assignee's name, which links to their profile. ## Acting on someone else's task When you open a task that belongs to someone else, the page tells you before you act, for example: "This is Sam's task. What you do here is recorded as yours, on Sam's behalf, and Sam sees it." From there you can hand the task on or snooze it. Everyone who opens the task, the assignee included, sees **Done on your behalf** (or on the assignee's behalf) with the latest entry and who did it. Press it to show only the lines that were changed. The arrow beside it opens the whole list. ## Due dates and snoozing A task raised by a routine is due at the time its run was scheduled. A task you create has no due date. **Snooze** moves an open task out of the way until tomorrow. From the table you can also snooze it until next week. A snoozed task stays in the list with **snoozed** and the day it comes back. ## Statuses and how a task closes Every task is **Open**, **Done** or **Cancelled**. A closed task says how it closed: | Status | Shown as | How it got there | | --- | --- | --- | | Open | **Open** | Still to do. | | Done | **Done** | Marked done. | | Done | **Order raised** | Its order was raised. | | Done | **Reviewed, no action** | Closed with a reason and a hold. | | Done | **Reviewed** | A review closed with nothing held. | | Done | **Decided** | A promotion's decisions were settled. | | Cancelled | **Cancelled** | Cancelled by a person. | | Cancelled | **No longer required** | Closed by its routine because nothing in it was in scope any more. | A task with lines closes with an outcome, either by raising its order or with **Reviewed, no action**. Plain **Mark done** is for a task without lines or a review task. **Reopen** brings a closed task back, except for a raised order or a settled promotion, because those are final. ## The panel beside an open task When a task is open, a panel beside it lists your tasks in sections by type: **Buying**, **Pricing**, **Transfer**, **Promotion**, **Review** and **General**. Each section collapses, and you can drag sections to reorder them. Each row shows where the task came from, how many lines it has, its title, and how many lines are flagged. The panel shows the same list as the table you opened the task from. Filtering or searching in the panel keeps the current task open. The heading (**My tasks**, **Done** or **All tasks**) takes you back to the table with the same view. The **New task** button (**+**) starts a new task. The Tasks table itself has no panel beside it. ## Starting a task by hand **New task** creates a task for you. Give it a **Task name**, a **Type** (**General**, **Review**, **Buying**, **Pricing** or **Transfer**) and, if you like, **Details**, then press **Create task**. Its source is **Manual**, and it opens as soon as it is created. ## Tasks, projects, routines and suppliers - **[Routines](/routines/)** raise most tasks. A routine's page lists its tasks and opens each one in place, and **All tasks** opens them on Tasks. Mutes and holds you set on a task apply to the routine that raised it. - **[Projects](/projects/)** hold the work tasks come from. A supplier order inside a project is the same record whether you open it from Tasks or from the project. - **[Suppliers](/suppliers/)**: a buying task is about a supplier. Its heading links to the supplier's page, where lead times and cover rules live, and a cover you choose can become that supplier's rule. Supplier-wide settings are under [Supplier settings](/settings/suppliers/). - **[Tasks and routines settings](/settings/tasks-and-routines/)** covers the workspace timezone, notifications, and where raised orders go. ## Asking Twelfth AI - "Which of my open tasks are overdue, and which have flagged lines?" - "Why was this line flagged on the Mattel order task?" - "What holds did I set with Reviewed, no action that end this week?" --- ## [Working in Triage](https://twelfth.ai/docs/triage/) --- title: Working in Triage description: Triage is the first stage of every engine-fed project. Review the lines Twelfth has surfaced, adjust them against what you know, and settle each one. lastmod: 2026-10-06 --- # Working in Triage **Triage** is the first stage of every engine-fed [project](/projects/) and the first step of the [decision pipeline](/pipeline/). It holds the lines Twelfth has surfaced that you have not settled yet and that need a human look before anything happens. Open **Projects** from the left rail, open a project, and Triage is the first stage in the strip across the top. The count on it is how many lines are still waiting; clicking it opens the stage without leaving the project, and the address carries it, so a link to a project's Triage is still a link to the project. ## What lands here Each overnight sync ranks the lines worth your attention and places them in the project for their scope: one per supplier for buys, per remit for price reviews, per lane for transfers. Typical reasons a line appears: - a price has drifted from where it should sit, - a line is running short before its next delivery, - stock is stranded in a location that needs it moved, or - a promotion is approaching a commitment date. New lines land in the project that is already open, so a supplier you are part-way through is refreshed rather than replaced. ## Working a line 1. **Open the work** to see the recommendation, the numbers behind it, and the evidence Twelfth used. The heading carries the money facts; **See more** opens the rest without moving the grid. 2. **Review it against what you know.** Adjust the recommended quantity or value where you have context the engine does not. Nothing is committed while you review. 3. **Settle the line.** You can settle it as recommended or with your edits. It then leaves Triage and moves to [Pending](/pending/), where the decision is recorded once the rest of the batch is settled. **Next in triage** at the foot of the grid takes you to the next piece of work in the project without going back to the list. ::: callout tip "Your edits are the decision" Settling with a changed quantity or value is still your decision. Twelfth records what you decided and, separately, what it recommended, so the two can be compared later in [Decisions](/decisions/). ::: ## From a conversation If you asked Twelfth to do something in a chat and it proposed a task, **Make this a project** promotes the conversation into a project of its own. The chat stays the record of how it started, and the project carries it from there. ## What "done" looks like Settling a line does not finish the work. It moves the line to **Pending**, where the decision is recorded and, for a supplier buy, the order raised. See [How work flows through Twelfth](/pipeline/) for the full path. ## Related - [Projects](/projects/) - [How work flows through Twelfth](/pipeline/) - [The Pending stage](/pending/) ---