Skip to content
Insights · Engineering

Which portal did that customer open?

Name the portal that customer opened: the session id, the customer, and the return address. A different configuration is not this one.

Scroll
EngineeringOct 30, 202612 min readBy Salman Naqvi, Founder & CEO
Which portal did that customer open?

A customer says they cancelled in the portal, or says the page they opened was not the one you configured. Tonight, three proofs, in a console you administer. Name the portal that customer opened: the session id, the customer, and the return address, or write that the session was not stored. Show a different session whose id, or whose customer, is not this one. Show another account's list that does not contain this session. If any of the three needs the person who wired billing, you have not named the portal. You have a screenshot and a guess.

This is one customer portal session. It is not the checkout. Which session did that checkout open? is a checkout session id, a status, and a payment status. A checkout can complete while no portal session was stored, and a portal session can exist while the checkout is still open. It is not the method the customer stored. Which method did that customer store? is a payment method id, a type, and a customer. A method can sit on the customer while this portal session's flow is null. It is not the site a repository published. Which site did that repo publish? is a pages address, a branch, and a certificate date. It is not the citation a message named. Which citation did that message name? is a type and a span. A return address is none of those. The fee a charge kept is a different object: which fee did that charge keep?. A session id is not a fee id.

None of what follows is a rate for this product, and none of it is legal advice. The fields below are one processor's current samples of a portal session and of a portal configuration, and the two ids are not the same object. The figures below that are a Census estimate of other people's retail sales. A billion-dollar total is not the session the customer opened tonight.

Stripe's object sample and Stripe's create sample print the same session. The id is bps_1MrSjzLkdIwHu7ixex0IvU9b. 28 characters. object is billing_portal.session. 22 characters. 22 is not 28. configuration is bpc_1MAhNDLkdIwHu7ixckACO1Jq. Also 28 characters, and not the session id. The prefix is bpc, not bps. created is 1680210639. customer is cus_NciAYcXfLnqBoz. 18 characters. flow is null. livemode is false, so the object is an example, not a live session on your account. locale is null. on_behalf_of is null. return_url is https://example.com/account. 27 characters. The url is https://billing.stripe.com/p/session?secret=test_YWNjdF8xTTJKVGtMa2RJd0h1N2l4LF9OY2lBYjJXcHY4a2NPck96UjBEbFVYRnU5bjlwVUF50100BUtQs3bl. 133 characters. 133 is not 27. The part before the secret is 44 characters. The secret itself is 89 characters. 44 plus 89 is 133. That addition matches, and it is still one sample url, not a session you issued. Two pages printing the same id are not two sessions (Stripe, The Customer Portal Session object, and Create a portal session).

The create request does not print the customer the response prints. The prerequisite on that page is a customer named Jenny Rosen, email jennyrosen@example.com. Jenny Rosen is 11 characters, counting the space. The email is 22 characters, the same length as billing_portal.session, and not that string. The curl sends customer={{CUSTOMER_ID}} and return_url https://example.com/account. The response prints cus_NciAYcXfLnqBoz. 18 is not 11, and 18 is not 22. The response does not print the name or the email. Do not paste Jenny Rosen onto the session because the prerequisite sat on the same page. The version header is 2026-10-28.endive. 17 characters. A version string is not a session id. The page says that if you omit configuration, the session uses the default configuration. This sample does not omit it. It names bpc_1MAhNDLkdIwHu7ixckACO1Jq. A sentence about the default is not the id on this object.

The configuration sample is a different id, and it is not a session. The id is bpc_1MrnZsLkdIwHu7ixNiQL1xPM. 28 characters again, and not the configuration id on the session, and not the session id. object is billing_portal.configuration. 28 characters, the same length as the id, and not the same string. 28 is not 22. active is true. application is null. headline, privacy_policy_url, and terms_of_service_url are all null. created is 1680290736. updated, on this sample, is also 1680290736. Equal timestamps are not a second object. default_return_url is null. A null default is not https://example.com/account. is_default is false. Do not call this configuration the default the create page mentioned, because the flag is false, and do not paste it onto the session, because the session names a different configuration id. livemode is false again. login_page.enabled is false and login_page.url is null. metadata is empty. The name field is described and not printed. The update page says a name's maximum length is 256 characters. 28 is not 256, and a missing name is not a name you may invent from the id (Stripe, The Customer portal configuration object).

The feature block on that configuration is five switches, and they do not agree with each other. customer_update is enabled, and allowed_updates lists email and tax_id. email is 5 characters. tax_id is 6. 5 is not 6. 2 names are not one update. invoice_history is enabled. payment_method_update is not. subscription_cancel is not, and subscription_update is not. That is 2 enabled features and 3 disabled ones at that level. 2 plus 3 is 5. The page does not print 5. Nested under the disabled cancel switch, cancellation_reason is also disabled, and it still lists five options: too_expensive, missing_features, switched_service, unused, and other. too_expensive is 13 characters. missing_features is 16. switched_service is 16, the same length as missing_features, and not the same string. unused is 6, the same length as tax_id, and not the same string. other is 5, the same length as email, and not the same string. Five options on a switch that is off are not five reasons the customer was offered. mode is at_period_end. 13 characters, the same length as too_expensive, and not the same string. proration_behavior is none. 4 characters. none is not false. A disabled cancel with a mode still printed is not a cancellation you can defend.

The update sample keeps the configuration id and changes three fields the object sample left null or equal. It sends privacy_policy_url https://example.com/new_privacy_url and terms_of_service_url https://example.com/new_terms_of_service_url. The privacy url is 35 characters. The terms url is 44 characters. 35 is not 44, and 44 is not 27. headline stays null. created stays 1680290736. updated becomes 1688593779. 1688593779 minus 1680290736 is 8303043 seconds: 96 days, 2 hours, 24 minutes, and 3 seconds. The page does not print that gap. 1680290736 minus the session's 1680210639 is 80097 seconds: 22 hours, 14 minutes, and 57 seconds. The page does not print that gap either. 80097 is not 8303043. An update of a configuration is not a second portal session, and a later updated timestamp does not rewrite the session id that pointed at a different configuration (Stripe, Update a portal configuration).

The locale list is a control, and the session's locale is null. The attribute text lists 47 locales, from auto through zh-TW. The rendered reference shows 10 of them and then says show 37 more. 10 plus 37 is 47. That addition matches. A control that adds up is still not a locale on this session, because the field is null. null is not en, and null is not auto. 47 names are not a session you opened. The pages also do not show a list of portal sessions. They show a session, a create call that returns the same session, and a configuration. If the only list you can open is configurations, you have not shown another account's sessions. Write that the session list was not in the console, and do not borrow bpc_1MrnZsLkdIwHu7ixNiQL1xPM to fill the hole.

The retail total people quote when they want a commerce figure did not open this session. The Census Bureau's release of 18 August 2026, CB26-133, says the seasonally adjusted estimate of U.S. retail e-commerce sales for the second quarter of 2026 was $340.2 billion, up 3.8 percent, plus or minus 0.4 percent, from the first quarter. Total retail sales were $1,986.5 billion, up 2.9 percent, plus or minus 0.2. E-commerce was up 12.2 percent from the second quarter of 2025. Total retail was up 6.7 percent. The adjusted e-commerce share was 17.1 percent. 340.2 divided by 1986.5 is 17.1256 percent, which the page does not print. 1986.5 times 0.171 is 339.6915, not 340.2. The gap is 0.5085 billion. The page does not print 0.5085. On a not adjusted basis the e-commerce estimate was $329.5 billion, up 9.4 percent from the first quarter and 12.4 percent from a year earlier, and 16.4 percent of total sales. 340.2 minus 329.5 is 10.7. The page does not print 10.7. 3.8 is not 9.4. 12.2 is not 12.4. 6.7 is not 6.6. 17.1 minus 16.4 is 0.7, which the page does not print. 340.2 divided by 1.038 is 327.746, the implied prior quarter, and the page does not print it. A notice on the same page says that as of 28 September 2026 the release no longer holds the latest estimates, and that the third-quarter release is 19 November 2026. From 18 August to 28 September is 41 days. From 28 September to 19 November is 52 days. The page does not print 41 or 52. None of those billions is a portal session id (U.S. Census Bureau, Quarterly Retail E-Commerce Sales).

Do the three proofs on one real session, in the console that actually holds it. First, the binding. Copy the session id, the customer, and the return address. If the session was not stored, write that. If flow is null, write null. If locale is null, write null. Do not infer en because a list of 47 locales exists, and do not infer Jenny Rosen because a prerequisite printed a name. Second, the other session. A different id, even with the same return address, is not this one. The object page and the create page are the same id printed twice. That is not the second session. The configuration id is not the second session either. If you have only one session id, write that you have only one. Third, the other account. A list that belongs to someone else does not contain this id. If the console has no session list, write that. A tenant you cannot name is the finding.

Three moves feel like the proof and are a second problem. Pasting the configuration's features onto the session because both objects say portal. The session's configuration id is bpc_1MAhNDLkdIwHu7ixckACO1Jq. The configuration sample is bpc_1MrnZsLkdIwHu7ixNiQL1xPM. Same length, different string. A disabled cancel switch is not a cancellation the customer made. Quoting $340.2 billion or 17.1 percent because they look precise, while the portal you were asked about is one object, and the Census release that printed them had not opened your console. Asking a model which portal was opened. The model will pick a plausible return address. It will not open the session. A checkout you have not kept is which session did that checkout open?. Opening that checkout does not name this portal session id.

The path is ordinary when an operator can open one customer's portal session without opening the next customer's session as the way to prove it. Meditizer is a storefront with a field-agent portal and a customer app, distinct from the next merchant. It is not a billing-portal ledger. No headcount, duration, or result figure belongs in that sentence. The proof of a portal session is still the id, the customer, and the return address on the account that created it.

There is a version of this afternoon where hiring the path is the wrong purchase. Nothing is for sale, because the product does not take money yet. You have no product. You are still choosing who will build, and the document in front of you is a term sheet. The criteria for that choice sit on the page written for a top saas development company. That page is criteria. It does not rank anyone, including us. The only fact in the room is a quarterly retail total. 340.2 is not your session, and 17.1 is not your session. A customer has already seen another customer's portal. Naming a return address does not close a leak. Or you wanted a lawyer to say whether a cancellation notice counts. Hire the lawyer.

When the customer is real and the console cannot name the portal, the missing object is specific. An admin action, in an account you administer, that shows one portal session id, one customer, and one return address or an explicit null, shows a different session that is not that one, and shows another account without it. A startup software development company that expects this will have put that action next to the rest of the billing screen, before a stranger's complaint is the way you discover the vendor owns the session. One that needs a call in order for you to see which portal was opened is telling you who holds the id. If the first slice is a fixed capability, an AI integration sprint is the shape where the acceptance sentence can include the three proofs. If you do not yet know which system stores the customer, a two-week AI readiness assessment maps the systems. The findings are yours. They are not a promise that 17.1 percent of retail will appear on your account. If what you are buying is the product around the billing screen, the offer is an AI product development company.

Before you tell them which portal the customer opened, do the three proofs and write the id. Name the id, the customer, and the return address, or write that the session was not stored. Show a different session that is not that one. Show another account that does not contain it. Do not paste a configuration's features onto a session id, and do not paste $340.2 billion onto a return address. The binding is the session you can defend.

Questions

Three records, in a console you administer. The portal session id, the customer, and the return address, or a written line that the session was not stored. A different session whose id or customer is not this one. Another account's list that does not contain this session. If any of the three needs the person who wired billing, you do not have the proof.

No. A total of other people's sales is not the id on this session. A portal you can defend is the id, the customer, and the return address, or a written line that the session was not stored. 340.2 billion in one release is not bps_1MrSjzLkdIwHu7ixex0IvU9b, and a sample configuration id is not your session.

When nothing is for sale, when you have no product, when you are still choosing a firm, when the only fact in the room is a quarterly retail total, when a customer has already seen another customer's portal, or when you wanted a lawyer.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→