integrations.json 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. {
  2. "catalog": {
  3. "title": "Integrations",
  4. "description": "Connect the services your workshop already uses. Each integration is set up once and runs in the background.",
  5. "all": "All",
  6. "empty": "No integrations in this category yet.",
  7. "notConnected": "Not connected",
  8. "connect": "Connect",
  9. "manage": "Manage",
  10. "connectedTitle": "Connected",
  11. "connectedDescription": "Services this workshop has set up. Open one to check its status, change settings or disconnect.",
  12. "noneConnected": "Nothing connected yet. Pick a service below to get started.",
  13. "availableTitle": "Available",
  14. "availableDescription": "Services you can add. Each one is set up once and runs in the background.",
  15. "allConnected": "Every available service is connected.",
  16. "searchPlaceholder": "Search integrations",
  17. "noMatches": "Nothing matches \"{query}\".",
  18. "readMore": "Read more",
  19. "suggestTitle": "Missing a service you use?",
  20. "suggestDescription": "Tell us which integration would help your workshop and we will look into it.",
  21. "suggest": "Suggest an integration",
  22. "suggestSubject": "Integration suggestion"
  23. },
  24. "categories": {
  25. "calendar": "Calendar",
  26. "conferencing": "Video calls",
  27. "accounting": "Accounting",
  28. "messaging": "Messaging",
  29. "payments": "Payments",
  30. "automation": "Automation",
  31. "storage": "Files",
  32. "registry": "Vehicle registry",
  33. "other": "Other",
  34. "ai": "AI"
  35. },
  36. "capabilities": {
  37. "calendar": {
  38. "push": "Work orders to calendar",
  39. "pull": "Busy time from calendar",
  40. "conference": "Video call links"
  41. },
  42. "sms": {
  43. "send": "Text messages out",
  44. "receive": "Replies back in"
  45. },
  46. "whatsapp": {
  47. "send": "WhatsApp messages out",
  48. "receive": "Replies back in"
  49. },
  50. "telegram": {
  51. "send": "Telegram messages out",
  52. "receive": "Replies back in"
  53. },
  54. "email": {
  55. "send": "Email out"
  56. },
  57. "vehicle": {
  58. "lookup": "Plate and VIN lookup",
  59. "inspection": "Inspection due dates",
  60. "safety": "Recalls and owner complaints"
  61. },
  62. "ai": {
  63. "chat": "Writing and summaries"
  64. },
  65. "payments": {
  66. "checkout": "Pay from the invoice link"
  67. },
  68. "accounting": {
  69. "invoices": "Invoices to the ledger",
  70. "customers": "Customers to the ledger",
  71. "payments": "Payments both ways"
  72. }
  73. },
  74. "statuses": {
  75. "active": "Connected",
  76. "error": "Needs attention",
  77. "pending": "Setup in progress",
  78. "disconnected": "Disconnected",
  79. "needsSetup": "Setup not finished"
  80. },
  81. "connection": {
  82. "back": "All integrations",
  83. "account": "Connected account",
  84. "lastHealth": "Last checked",
  85. "lastSync": "Last sync",
  86. "lastError": "The last run failed",
  87. "setupMissingTitle": "Setup not finished",
  88. "setupMissing": "Choose {fields} in the settings below. Until then nothing is synced.",
  89. "connected": "{name} is connected.",
  90. "connectedShort": "Connected",
  91. "connectWith": "Connect {name}",
  92. "connect": "Connect",
  93. "reconnect": "Reconnect",
  94. "disconnect": "Disconnect",
  95. "disconnectTitle": "Disconnect {name}?",
  96. "disconnectDescription": "Torqvoice forgets the account and stops using it. Nothing already sent to or stored in {name} is touched.",
  97. "disconnectDescriptionCalendar": "Torqvoice forgets the account and stops syncing. Work orders already put in {name} stay there. The busy time shown from that calendar is removed from the Torqvoice calendar.",
  98. "disconnectDescriptionConferencing": "Torqvoice forgets the account and stops creating meetings. Meetings already created stay in {name}, and the links on work orders are kept.",
  99. "disconnectDescriptionAccounting": "Torqvoice forgets the account and stops sending and reading. Invoices, customers and payments already in {name} stay there.",
  100. "removeSetup": "Remove",
  101. "removeSetupTitle": "Remove {name}?",
  102. "removeSetupDescription": "Nothing is connected yet. Torqvoice forgets what was entered, and {name} goes back to the list of available services.",
  103. "removeSetupDone": "{name} removed",
  104. "removeSetupHint": "Not going ahead with this? Remove it and the service returns to the list below.",
  105. "disconnected": "Disconnected",
  106. "test": "Test connection",
  107. "testPassed": "Connection works",
  108. "syncNow": "Sync now",
  109. "syncQueued": "Sync queued; it runs within a minute",
  110. "pullNow": "Pull payments now",
  111. "pullQueued": "Payment pull queued; it runs within a minute",
  112. "backfill": "Push scheduled work orders",
  113. "backfillQueued": "Queued the scheduled work orders from the last week onwards",
  114. "backfillInvoices": "Push issued invoices",
  115. "backfillInvoicesQueuedCount": "Queued {count, plural, one {# issued invoice} other {# issued invoices}} to push",
  116. "backfillInvoicesNone": "No issued invoices to push. Only sent, shared or paid invoices go over, dated on or after the start date if you set one.",
  117. "retryQueued": "Job queued again",
  118. "settingsTitle": "Settings",
  119. "settingsDescription": "What to sync and where. Changes apply to the next sync.",
  120. "settingsSaved": "Settings saved",
  121. "save": "Save",
  122. "loading": "Loading...",
  123. "choose": "Choose...",
  124. "search": "Search...",
  125. "noMatch": "Nothing matches",
  126. "leaveEmpty": "Leave empty",
  127. "noLimit": "No limit",
  128. "planLocked": "Integrations are not included in your plan.",
  129. "ownAppTitle": "This install uses your own app with the provider",
  130. "redirectUri": "Redirect URI to register with the provider:",
  131. "sendTestEmail": "Send test email",
  132. "testEmailSent": "Test email sent to {email}",
  133. "testEmailHint": "A test email goes to your own address through this vendor, which proves the from address and the sending rules a key check cannot.",
  134. "inboundUrl": "Inbound webhook URL",
  135. "inboundHintSecret": "Paste this URL into the vendor's inbound message settings. It carries a secret that identifies your workshop, so keep it private.",
  136. "inboundHintMeta": "Paste this URL as the callback URL in your Meta app, with the verify token you entered above, and subscribe to messages.",
  137. "inboundHintStripe": "Add this URL in your Stripe dashboard under Developers, Webhooks, subscribed to checkout.session.completed. Then paste the signing secret Stripe shows into the webhook secret field here, so notifications can be verified.",
  138. "inboundHintVipps": "Enter this URL as the callback URL in the Vipps MobilePay portal. Vipps also requires published terms of sale, which are set under Settings, Payment.",
  139. "inboundHintPaypal": "Add this URL in the PayPal developer dashboard under Webhooks, subscribed to PAYMENT.CAPTURE.COMPLETED.",
  140. "copy": "Copy",
  141. "copied": "Copied",
  142. "updateKeys": "Update keys",
  143. "updateKeysHint": "The last check failed. Enter the keys again to try once more.",
  144. "inspectionSync": {
  145. "title": "Inspection sync",
  146. "vehicles": "{count} vehicles with a plate in this workshop",
  147. "dueNow": "{count} would be looked up on the next run",
  148. "withDate": "{count} already have an inspection date",
  149. "lastPass": "Last complete pass {date}",
  150. "never": "No complete pass yet",
  151. "inProgress": "A pass is running",
  152. "off": "Turn the setting on and save; until then a pass checks nothing.",
  153. "syncNowHelp": "Sync now starts a pass straight away instead of waiting for the hourly one. It looks up 25 vehicles at a time and continues on its own until every due vehicle is done."
  154. },
  155. "supersedes": "Connecting {next} disconnects {current}. Only one at a time can be in charge, so {current} stops being used the moment {next} goes live.",
  156. "batchRetried": "{count, plural, =0 {Nothing to retry} one {# job queued again} other {# jobs queued again}}"
  157. },
  158. "activity": {
  159. "title": "Activity",
  160. "description": "Recent jobs and log lines for this connection.",
  161. "retry": "Retry",
  162. "jobStatus": {
  163. "queued": "Queued",
  164. "running": "Running",
  165. "done": "Done",
  166. "failed": "Failed",
  167. "dead": "Gave up"
  168. },
  169. "jobs": "{count, plural, one {# job} other {# jobs}}",
  170. "counts": {
  171. "queued": "{count} queued",
  172. "running": "{count} running",
  173. "done": "{count} done",
  174. "failed": "{count} failed",
  175. "dead": "{count} gave up"
  176. },
  177. "noFailures": "Nothing failed.",
  178. "retryFailed": "Retry failed jobs",
  179. "details": "Show details"
  180. },
  181. "errors": {
  182. "generic": "Something went wrong",
  183. "demo": "Integrations cannot be connected on the demo.",
  184. "forbidden": "Only an administrator can connect integrations.",
  185. "unknown": "Unknown integration.",
  186. "plan": "This integration is not included in your plan.",
  187. "no-client": "No app credentials are configured for this provider.",
  188. "denied": "You cancelled the sign-in with the provider.",
  189. "vendor": "The provider returned an error. Try again.",
  190. "invalid": "The provider's response was incomplete. Try again.",
  191. "state": "This sign-in has expired or belongs to another session. Start again.",
  192. "exchange": "The provider refused the sign-in. Check the app credentials and try again.",
  193. "identify": "Connected, but the account could not be read. Try reconnecting."
  194. },
  195. "meeting": {
  196. "join": "Join video call",
  197. "google-meet": "Google Meet",
  198. "teams": "Microsoft Teams",
  199. "zoom": "Zoom"
  200. },
  201. "calendar": {
  202. "external": "From connected calendars",
  203. "busy": "Busy"
  204. },
  205. "connectors": {
  206. "google-calendar": {
  207. "description": "Put scheduled work orders on a Google Calendar, add a Google Meet link, and see the calendar's busy time in Torqvoice.",
  208. "tenantHelp": "Create an OAuth client in Google Cloud Console (APIs & Services → Credentials), enable the Google Calendar API, add the redirect URI below, and paste the client id and secret here.",
  209. "fields": {
  210. "clientId": "Client ID",
  211. "clientSecret": "Client secret"
  212. },
  213. "settings": {
  214. "calendarId": "Calendar",
  215. "pushEnabled": "Add scheduled work orders to this calendar",
  216. "includeCustomer": "Include the customer's name and phone in the event",
  217. "addConference": "Add a Google Meet meeting to every scheduled work order",
  218. "addConferenceHelp": "On: every work order pushed to the calendar gets a Google Meet meeting, and the join link shows on the work order. Off: add a Google Meet meeting to a single work order from its page. Either way the customer only gets the link when you send it.",
  219. "pullEnabled": "Show this calendar's busy time on the Torqvoice calendar",
  220. "pullEnabledHelp": "Read-only. Refreshed every 15 minutes, one week back and two months ahead."
  221. }
  222. },
  223. "microsoft-365": {
  224. "description": "Put scheduled work orders on an Outlook calendar, add a Microsoft Teams link, and see the calendar's busy time in Torqvoice.",
  225. "tenantHelp": "Register an application in Microsoft Entra (App registrations), allow personal and work accounts, add the redirect URI below as a Web platform, create a client secret, and paste both here.",
  226. "fields": {
  227. "clientId": "Application (client) ID",
  228. "clientSecret": "Client secret"
  229. },
  230. "settings": {
  231. "calendarId": "Calendar",
  232. "pushEnabled": "Add scheduled work orders to this calendar",
  233. "includeCustomer": "Include the customer's name and phone in the event",
  234. "addConference": "Add a Microsoft Teams meeting to every scheduled work order",
  235. "addConferenceHelp": "On: every work order pushed to the calendar gets a Microsoft Teams meeting, and the join link shows on the work order. Off: add a Microsoft Teams meeting to a single work order from its page. Either way the customer only gets the link when you send it.",
  236. "pullEnabled": "Show this calendar's busy time on the Torqvoice calendar",
  237. "pullEnabledHelp": "Read-only. Refreshed every 15 minutes, one week back and two months ahead."
  238. }
  239. },
  240. "zoom": {
  241. "description": "Add a Zoom meeting to a scheduled work order and keep the join link on it, for remote diagnosis or walking a customer through findings.",
  242. "tenantHelp": "In the Zoom App Marketplace, build a General app (user-managed), add the redirect URI below, add the scopes meeting:write:meeting, meeting:update:meeting, meeting:delete:meeting, meeting:read:meeting and user:read:user, and paste the client ID and secret here.",
  243. "fields": {
  244. "clientId": "Client ID",
  245. "clientSecret": "Client secret"
  246. },
  247. "settings": {
  248. "autoCreate": "Create a Zoom meeting for every scheduled work order automatically",
  249. "autoCreateHelp": "Off: you add a video call to a work order yourself, from its page. On: every work order with a start time gets a meeting, moved when it is rescheduled and removed when it is cancelled. Either way the customer only gets the link when you send it.",
  250. "includeCustomer": "Include the customer's name in the meeting topic",
  251. "joinBeforeHost": "Let the customer join before you",
  252. "waitingRoom": "Use a waiting room"
  253. }
  254. },
  255. "twilio-sms": {
  256. "description": "Send and receive text messages through a Twilio number. Reminders, ready-for-pickup messages and the replies that come back.",
  257. "fields": {
  258. "accountSid": "Account SID",
  259. "authToken": "Auth token"
  260. },
  261. "settings": {
  262. "phoneNumber": "Send from this number"
  263. }
  264. },
  265. "vonage-sms": {
  266. "description": "Send and receive text messages through a Vonage number.",
  267. "fields": {
  268. "apiKey": "API key",
  269. "apiSecret": "API secret"
  270. },
  271. "settings": {
  272. "phoneNumber": "Send from this number"
  273. }
  274. },
  275. "telnyx-sms": {
  276. "description": "Send and receive text messages through a Telnyx number.",
  277. "fields": {
  278. "apiKey": "API key"
  279. },
  280. "settings": {
  281. "phoneNumber": "Send from this number"
  282. }
  283. },
  284. "whatsapp-meta": {
  285. "description": "Message customers on WhatsApp through Meta directly. Photos of what you found, and the conversation that follows.",
  286. "fields": {
  287. "phoneNumberId": "Phone number ID",
  288. "accessToken": "Access token",
  289. "verifyToken": "Webhook verify token",
  290. "appSecret": "App secret",
  291. "apiVersion": "Graph API version"
  292. },
  293. "settings": {
  294. "enabled": "Send messages on this channel",
  295. "phoneNumber": "Send from this number",
  296. "templateName": "Template for reopening a conversation",
  297. "templateLanguage": "Template language",
  298. "templateVariables": "Template values, in order",
  299. "mediaTemplateName": "Template for a message with a photo",
  300. "mediaTemplateLanguage": "Photo template language",
  301. "mediaTemplateVariables": "Photo template values, in order"
  302. }
  303. },
  304. "whatsapp-twilio": {
  305. "description": "Message customers on WhatsApp through a Twilio number, if Twilio is who sold you one.",
  306. "fields": {
  307. "accountSid": "Account SID",
  308. "authToken": "Auth token",
  309. "messagingServiceSid": "Messaging service SID"
  310. },
  311. "settings": {
  312. "enabled": "Send messages on this channel",
  313. "phoneNumber": "Send from this number",
  314. "templateName": "Template for reopening a conversation",
  315. "templateLanguage": "Template language",
  316. "templateVariables": "Template values, in order",
  317. "mediaTemplateName": "Template for a message with a photo",
  318. "mediaTemplateLanguage": "Photo template language",
  319. "mediaTemplateVariables": "Photo template values, in order"
  320. }
  321. },
  322. "telegram": {
  323. "description": "A Telegram bot that reaches customers who use it, and brings their replies into the inbox.",
  324. "fields": {
  325. "botToken": "Bot token"
  326. },
  327. "settings": {
  328. "enabled": "Send messages on this channel",
  329. "botUsername": "Bot username"
  330. }
  331. },
  332. "smtp": {
  333. "description": "Send invoices and reminders through your own mail server, rather than the platform mail.",
  334. "fields": {
  335. "host": "Server",
  336. "port": "Port",
  337. "user": "Username",
  338. "pass": "Password"
  339. },
  340. "settings": {
  341. "fromEmail": "Send from this address",
  342. "fromName": "Name shown as the sender",
  343. "secure": "Connect over TLS from the start",
  344. "requireTls": "Require the server to upgrade to TLS",
  345. "rejectUnauthorized": "Reject a certificate that does not check out"
  346. }
  347. },
  348. "resend": {
  349. "description": "Send invoices and reminders through Resend.",
  350. "fields": {
  351. "apiKey": "API key"
  352. },
  353. "settings": {
  354. "fromEmail": "Send from this address",
  355. "fromName": "Name shown as the sender"
  356. }
  357. },
  358. "postmark": {
  359. "description": "Send invoices and reminders through Postmark.",
  360. "fields": {
  361. "apiKey": "Server token"
  362. },
  363. "settings": {
  364. "fromEmail": "Send from this address",
  365. "fromName": "Name shown as the sender"
  366. }
  367. },
  368. "mailgun": {
  369. "description": "Send invoices and reminders through Mailgun.",
  370. "fields": {
  371. "apiKey": "API key",
  372. "domain": "Sending domain"
  373. },
  374. "settings": {
  375. "fromEmail": "Send from this address",
  376. "fromName": "Name shown as the sender",
  377. "region": "Region the domain is in"
  378. }
  379. },
  380. "sendgrid": {
  381. "description": "Send invoices and reminders through SendGrid.",
  382. "fields": {
  383. "apiKey": "API key"
  384. },
  385. "settings": {
  386. "fromEmail": "Send from this address",
  387. "fromName": "Name shown as the sender"
  388. }
  389. },
  390. "amazon-ses": {
  391. "description": "Send invoices and reminders through Amazon SES.",
  392. "fields": {
  393. "accessKeyId": "Access key ID",
  394. "secretAccessKey": "Secret access key",
  395. "region": "Region"
  396. },
  397. "settings": {
  398. "fromEmail": "Send from this address",
  399. "fromName": "Name shown as the sender"
  400. }
  401. },
  402. "vegvesen": {
  403. "description": "Fill in a vehicle from its Norwegian plate or VIN: make, model, year, fuel, gearbox, engine, colour, tyre sizes and the next EU-kontroll date, straight from Statens vegvesen's register. No owner data is returned.",
  404. "fields": {
  405. "apiKey": "API key",
  406. "apiKeyHelp": "Free. Order the key on vegvesen.no under \"API for tekniske kjøretøyopplysninger\": sign in with BankID, represent the workshop, and the key is issued at once. It allows 50,000 lookups a day."
  407. },
  408. "settings": {
  409. "syncInspections": "Keep inspection dates up to date for every vehicle in this workshop",
  410. "syncInspectionsHelp": "Once an hour, vehicles that have not been checked recently are looked up by plate and their next EU-kontroll date is saved. Only vehicles stored in this workshop are ever sent. A vehicle is rechecked monthly, and weekly once its deadline is within two months."
  411. }
  412. },
  413. "openapi-automotive": {
  414. "description": "Fill in a vehicle from its French, Italian, Spanish, Portuguese or British plate: make, model, year, VIN, fuel, engine size and more, from the country's registration data through Openapi.com. Each lookup is billed to the workshop's own Openapi account. No owner data is returned.",
  415. "fields": {
  416. "token": "API token",
  417. "tokenHelp": "Create an account on console.openapi.com, add credit to the wallet, and under Automotive create a token for the production environment. Each successful lookup costs a few tens of cents; a miss is free."
  418. },
  419. "settings": {
  420. "country": "Country",
  421. "countryHelp": "The registry to search. French and Italian plates look the same, so the country cannot be read off the plate.",
  422. "bikes": "Also look up motorcycles",
  423. "bikesHelp": "When a plate is not a car, ask the motorcycle registry too. A miss on the car side is free, so this costs nothing extra unless a motorcycle is found. Not available for Portugal."
  424. }
  425. },
  426. "rdw": {
  427. "description": "Fill in a vehicle from its Dutch plate: make, model, year, fuel, engine size, colour, weights and the next APK date, straight from RDW's open vehicle register. Free, no key needed. No owner data and no VIN are published.",
  428. "fields": {
  429. "appToken": "App token (optional)",
  430. "appTokenHelp": "RDW's open data works without a key, but anonymous requests share a throttled pool. For the inspection sync, create a free account on opendata.rdw.nl, open your profile's developer settings and create an app token."
  431. },
  432. "settings": {
  433. "syncInspections": "Keep APK dates up to date for every vehicle in this workshop",
  434. "syncInspectionsHelp": "Once an hour, vehicles that have not been checked recently are looked up by plate and their next APK date is saved. Only vehicles stored in this workshop are ever sent. A vehicle is rechecked monthly, and weekly once its deadline is within two months."
  435. }
  436. },
  437. "regcheck": {
  438. "description": "Fill in a vehicle from its plate in Australia, New Zealand, the United States, Ireland, Norway, Sweden, Denmark, Finland, Estonia, Czechia, Slovakia, Hungary or Croatia: make, model, year, VIN, fuel and engine size where the country publishes them, through RegCheck. Each successful lookup spends one credit from the workshop's own RegCheck account. No owner data is returned.",
  439. "fields": {
  440. "username": "RegCheck username",
  441. "usernameHelp": "Register on regcheck.org.uk; the account comes with 10 free lookups and more are bought in blocks of 100 through the dashboard. Only the username is needed here, never the password. A plate that is not found costs nothing."
  442. },
  443. "settings": {
  444. "country": "Country",
  445. "countryHelp": "The registry to search. Each country has its own service, so the connection searches one.",
  446. "auState": "State or territory",
  447. "auStateHelp": "Australia registers vehicles per state, and the registry must be told which one to search. Choose where most of your customers' vehicles are registered.",
  448. "usState": "State",
  449. "usStateHelp": "The two-letter code of the state the vehicles are registered in, such as CA or TX. American registries are searched per state."
  450. }
  451. },
  452. "openai": {
  453. "description": "Service descriptions, history summaries, document scanning and the assistant, answered by your own OpenAI account. Every call is billed to that account, and you choose which model answers.",
  454. "fields": {
  455. "apiKey": "API key",
  456. "apiKeyHelp": "Create one at platform.openai.com under API keys. The account needs credit on it; OpenAI bills the usage, per call."
  457. },
  458. "settings": {
  459. "model": "Model",
  460. "modelHelp": "Which model answers. The list is read from your account, newest first. Smaller models cost less per call and are enough for most workshop text."
  461. }
  462. },
  463. "anthropic": {
  464. "description": "Service descriptions, history summaries, document scanning and the assistant, answered by Claude on your own Anthropic account. Every call is billed to that account, and you choose which model answers.",
  465. "fields": {
  466. "apiKey": "API key",
  467. "apiKeyHelp": "Create one at console.anthropic.com under API keys. The account needs credit on it; Anthropic bills the usage, per call."
  468. },
  469. "settings": {
  470. "model": "Model",
  471. "modelHelp": "Which model answers. The list is read from your account, newest first. Smaller models cost less per call and are enough for most workshop text."
  472. }
  473. },
  474. "stripe": {
  475. "description": "Card payments from the invoice link, into your own Stripe account. The customer pays, Stripe tells Torqvoice, and the invoice marks itself paid.",
  476. "fields": {
  477. "secretKey": "Secret key",
  478. "secretKeyHelp": "From the Stripe dashboard under Developers, API keys. Test keys process nothing real, so try a payment on them first and swap to live keys after.",
  479. "publishableKey": "Publishable key",
  480. "webhookSecret": "Webhook signing secret",
  481. "webhookSecretHelp": "Shown by Stripe once you add the notification URL from this page as a webhook. With it, every notification is verified before a payment is recorded."
  482. },
  483. "settings": {
  484. "enabled": "Offer on invoice links",
  485. "enabledHelp": "Switch off to take the pay button off shared invoices for a while, without disconnecting. Payments already started are still recorded."
  486. }
  487. },
  488. "vipps": {
  489. "description": "Vipps MobilePay from the invoice link. The customer pays in the app they already have, and the invoice marks itself paid.",
  490. "fields": {
  491. "clientId": "Client ID",
  492. "clientSecret": "Client secret",
  493. "subscriptionKey": "Subscription key",
  494. "subscriptionKeyHelp": "The Ocp-Apim-Subscription-Key from the Vipps MobilePay portal, under the sales unit's API keys.",
  495. "merchantSerialNumber": "Merchant serial number"
  496. },
  497. "settings": {
  498. "enabled": "Offer on invoice links",
  499. "enabledHelp": "Switch off to take the pay button off shared invoices for a while, without disconnecting. Payments already started are still recorded.",
  500. "testMode": "Test mode",
  501. "testModeHelp": "Use the Vipps test environment with test keys. Leave it on until a full payment has gone through, then turn it off and enter the live keys."
  502. }
  503. },
  504. "paypal": {
  505. "description": "PayPal checkout from the invoice link, through your own PayPal app. The customer pays with a PayPal account or a card, and the invoice marks itself paid.",
  506. "fields": {
  507. "clientId": "Client ID",
  508. "clientSecret": "Client secret"
  509. },
  510. "settings": {
  511. "enabled": "Offer on invoice links",
  512. "enabledHelp": "Switch off to take the pay button off shared invoices for a while, without disconnecting. Payments already started are still recorded.",
  513. "sandbox": "Sandbox mode",
  514. "sandboxHelp": "Use PayPal's sandbox with sandbox app keys. Leave it on until a full payment has gone through, then turn it off and enter the live app's keys."
  515. }
  516. },
  517. "quickbooks": {
  518. "description": "Send issued invoices, their customers and their payments to QuickBooks Online, and bring back payments recorded there.",
  519. "tenantHelp": "Create an app in the Intuit Developer portal. Copy the client id and secret from Keys and credentials, and enter the redirect URI below under Settings, Redirect URIs. Development keys reach sandbox companies, production keys live ones.",
  520. "fields": {
  521. "clientId": "Client ID",
  522. "clientSecret": "Client secret"
  523. },
  524. "settings": {
  525. "pushInvoices": "Send issued invoices to QuickBooks",
  526. "pushOnComplete": "Also send invoices when the job is marked completed",
  527. "pushOnCompleteHelp": "Without this an invoice goes over once it is sent, shared or paid. With it, a completed job goes over straight away and is updated if it changes.",
  528. "startDate": "Only invoices dated on or after",
  529. "startDateHelp": "Leave empty to send every issued invoice. Use the date your books moved to QuickBooks so older invoices are not entered twice.",
  530. "includeVehicle": "Name the vehicle on the invoice",
  531. "includeVehicleHelp": "A text line above the charges with the year, make, model, plate and mileage, so the books say which car.",
  532. "laborItemId": "Item for labour lines",
  533. "laborItemIdHelp": "Leave empty and an item named Labour is created under your income account the first time.",
  534. "partsItemId": "Item for parts lines",
  535. "partsItemIdHelp": "Leave empty and an item named Parts is created under your income account the first time.",
  536. "taxAmounts": "Tax amounts",
  537. "taxAmountsHelp": "As billed sends the tax exactly as it stands on the invoice the customer received, so both systems agree to the cent. Worked out by QuickBooks lets QuickBooks apply the rate of the tax code, or the customer's address in the US, and the log says when the totals differ.",
  538. "taxAmountsBilled": "As billed in Torqvoice",
  539. "taxAmountsQuickbooks": "Worked out by QuickBooks",
  540. "taxCodeId": "Tax code for taxable invoices",
  541. "taxCodeIdHelp": "QuickBooks books the tax under a tax code. Torqvoice picks the code whose rate matches each invoice; this one is used when none does. A US company uses TAX unless you choose otherwise.",
  542. "zeroTaxCodeId": "Tax code for tax-free invoices",
  543. "zeroTaxCodeIdHelp": "Used when the invoice has no tax or the customer is tax exempt. A US company uses NON unless you choose otherwise.",
  544. "pushPayments": "Record payments in QuickBooks",
  545. "depositAccountId": "Deposit payments to",
  546. "depositAccountIdHelp": "Leave empty to use Undeposited Funds.",
  547. "manualPaidAsPayment": "Record a payment when an invoice is marked paid by hand",
  548. "manualPaidAsPaymentHelp": "An invoice marked as paid in Torqvoice without a payment entry gets one payment in QuickBooks for whatever it still shows as owed. Off, it stays open there until a payment is recorded.",
  549. "pullPayments": "Bring back payments recorded in QuickBooks",
  550. "pullPaymentsHelp": "Every 30 minutes. A payment received in QuickBooks against an invoice from Torqvoice is recorded on the invoice here."
  551. }
  552. },
  553. "nhtsa": {
  554. "description": "Fill in a vehicle from its VIN, and see recalls, owner complaints and crash ratings for every model year, from the US safety authority. Free, no key.",
  555. "fields": {},
  556. "settings": {
  557. "refreshFleet": "Keep recall and complaint data fresh for every vehicle in this workshop",
  558. "refreshFleetHelp": "Once a day, models not refreshed in the last week are fetched again, so the vehicle page never waits and a new recall shows within a week of being filed. Only make, model and year are sent."
  559. }
  560. }
  561. },
  562. "jobKinds": {
  563. "calendar": {
  564. "push": "Work orders to calendar",
  565. "pull": "Busy time from calendar"
  566. },
  567. "conference": {
  568. "sync": "Video call links"
  569. },
  570. "inspection": {
  571. "refresh": "Inspection date refresh"
  572. },
  573. "accounting": {
  574. "invoice": "Invoice to ledger",
  575. "payment": "Payment to ledger",
  576. "customer": "Customer to ledger",
  577. "pull": "Payments from ledger"
  578. },
  579. "safety": {
  580. "refresh": "Recall data refresh",
  581. "vehicle": "Recall check for a new vehicle"
  582. }
  583. }
  584. }